On this page
Python 3.3 新增Function
本文介绍了 Python 3.2 与 3.2 相比的新Function。 Python 3.3 于 2012 年 9 月 29 日发布。有关完整详细信息,请参见changelog。
See also
PEP 398-Python 3.3 发布时间表
摘要-发布要点
新语法Function:
generator delegation的新
yield from
表达式。str对象再次接受
u'unicode'
语法。
新的库模块:
faulthandler(帮助调试低级崩溃)
ipaddress(代表 IP 地址和掩码的高级对象)
lzma(使用 XZ/LZMA 算法压缩数据)
unittest.mock(用模拟对象替换测试中的系统部分)
venv(Python virtual environments,如流行的
virtualenv
软件包中的)
新的内置Function:
- Reworked I/O 异常层次结构.
Implementation improvements:
更紧凑的unicode strings。
显着改进的库模块:
decimal模块的 C 加速器。
email模块(provisional)中的 unicode 处理效果更好。
Security improvements:
- 默认情况下,哈希随机化处于打开状态。
请 continue 阅读以了解面向用户的更改的完整列表。
PEP 405:虚拟环境
虚拟环境可帮助创建单独的 Python 设置,同时共享系统范围的基本安装,从而易于维护。虚拟环境具有自己的专用站点软件包集(即本地安装的库),并且可以选择与系统范围的站点软件包分开。它们的概念和实现受到流行的virtualenv
第三方程序包的启发,但受益于与解释器内核的更紧密集成。
该 PEP 添加了用于程序访问的venv模块和用于命令行访问和 Management 的pyvenv
脚本。 Python 解释器检查pyvenv.cfg
文件,该文件的存在表示虚拟环境目录树的基础。
See also
PEP 405-Python 虚拟环境
由 Carl Meyer 撰写的 PEP; Carl Meyer 和 Vinay Sajip 实施
PEP 420:隐式命名空间包
对不需要__init__.py
标记文件并且可以自动跨越多个路径段的包目录的本地支持(受各种第三方方法的启发,如 PEP 420中所述)。
See also
PEP 420-隐式命名空间包
由 Eric V. Smith 撰写的 PEP;由 Eric V. Smith 和 Barry Warsaw 实施
PEP 3118:新的 memoryview 实现和缓冲区协议文档
PEP 3118的实施已得到明显改善。
新的 memoryview 实现全面修复了 Py_buffer 结构中动态分配的字段的所有所有权和生存期问题,该问题导致出现多个崩溃报告。此外,还修复了一些使非连续或多维 Importing 崩溃或返回不正确结果的函数。
现在,memoryview 对象具有兼容 PEP-3118 的 getbufferproc(),可以检查使用者的请求类型。添加了许多新Function,其中大多数Function完全适用于非连续数组和具有子偏移量的数组。
该文档已更新,清楚说明了 Export 商和 Consumer 的责任。缓冲区请求标志分为基本标志和复合标志。说明了非连续多维 NumPy 样式数组的内存布局。
Features
现在支持结构模块语法中的所有本机单字符格式说明符(可选以'@'开头)。
在某些限制下,cast()方法允许更改 C 连续数组的格式和形状。
任何数组类型均支持多维列表表示。
任何数组类型都支持多维比较。
格式为 B,b 或 c 的可哈希(只读)类型的一维 memoryview 现在可哈希化。 (由bpo-13411中的 Antoine Pitrou 提供。)
支持任何一维数组类型的任意切片。例如,现在可以pass使用否定步骤来反转 O(1)中的 memoryview。
API changes
正式将最大尺寸限制为 64 个。
空的形状,步幅和子偏移的表示现在是一个空 Tuples,而不是
None
。现在,访问格式为“ B”(无符号字节)的 memoryview 元素将返回一个整数(根据 struct 模块语法)。要返回字节对象,必须先将视图强制转换为“ c”。
现在,memoryview 比较使用操作数的逻辑结构,并按值比较所有数组元素。支持 struct 模块语法中的所有格式字符串。仍然允许使用格式字符串无法识别的视图,但是无论视图内容如何,它们始终会比较不相等。
有关更多更改,请参见Build 和 C API 更改和移植 C 代码。
(由 Stefan Krah 在bpo-10181中贡献。)
See also
PEP 3118-修改缓冲区协议
PEP 393:灵活的字符串表示形式
Unicode 字符串类型已更改为支持多种内部表示形式,具体取决于所表示字符串中具有最大 Unicode 序数(1、2 或 4 个字节)的字符。在常见情况下,这可以节省空间,但可以在所有系统上访问完整的 UCS-4.为了与现有 API 兼容,可以并行存在多个表示形式。随着时间的流逝,应该逐步淘汰这种兼容性。
在 Python 方面,此更改不应有不利影响。
在 C API 端, PEP 393完全向后兼容。旧版 API 至少应保留五年。使用旧版 API 的应用程序将无法充分利用减少内存的优势,或者-更糟的是-可能会使用更多的内存,因为 Python 可能必须维护每个字符串的两个版本(采用旧版格式和新的有效存储)。
Functionality
PEP 393引入的更改如下:
Python 现在始终支持所有 Unicode 代码点,包括非 BMP 代码点(即从
U+0000
到U+10FFFF
)。窄和宽版本之间的区别不再存在,即使在 Windows 下,Python 现在也像宽版本一样。随着狭窄版本的终止,狭窄版本所特有的问题也已修复,例如:
len()现在对于非 BMP 字符始终返回 1,因此
len('\U0010FFFF') == 1
;代理对不会重组为字符串 Literals,因此
'\uDBFF\uDFFF' != '\U0010FFFF'
;索引或切片非 BMP 字符将返回预期值,因此
'\U0010FFFF'[0]
现在返回'\U0010FFFF'
而不是'\uDBFF'
;现在,标准库中的所有其他函数都可以正确处理非 BMP 代码点。
sys.maxunicode的值现在始终为
1114111
(十六进制为0x10FFFF
)。PyUnicode_GetMax()
函数仍返回0xFFFF
或0x10FFFF
以实现向后兼容性,并且不应与新的 Unicode API 一起使用(请参阅bpo-13054)。./configure
标志--with-wide-unicode
已被删除。
性能和资源使用情况
现在,Unicode 字符串的存储取决于字符串中的最高代码点:
纯 ASCII 和 Latin1 字符串(
U+0000-U+00FF
)每个代码点使用 1 个字节;BMP 字符串(
U+0000-U+FFFF
)每个代码点使用 2 个字节;非 BMP 字符串(
U+10000-U+10FFFF
)每个代码点使用 4 个字节。
finally结果是,对于大多数应用程序而言,字符串存储的内存使用量应显着减少(尤其是与以前的宽泛 unicode 构建相比),因为在许多情况下,即使在国际环境中,字符串也将是纯 ASCII(因为许多字符串存储了非人类语言)数据,例如 XML 片段,HTTPHeaders,JSON 编码的数据等)。我们也希望出于同样的原因,它将提高非平凡应用程序上的 CPU 缓存效率。在 Django 基准测试中,Python 3.3 的内存使用量比 Python 3.2 小两到三倍,并且比 Python 2.7 好一点(有关详细信息,请参阅 PEP)。
See also
PEP 393-灵活的字符串表示形式
马丁·冯·洛维斯(Martin vonLöwis)撰写的 PEP;由 Torsten Becker 和 Martin vonLöwis 实施。
PEP 397:适用于 Windows 的 Python 启动器
Python 3.3 Windows 安装程序现在包括一个py
启动器应用程序,可用于以版本无关的方式启动 Python 应用程序。
双击*.py
文件时,将隐式调用此启动器。如果系统上仅安装了一个 Python 版本,则该版本将用于运行文件。如果安装了多个版本,则默认使用最新版本,但是可以pass在 Python 脚本中包含 Unix 风格的“ shebang 行”来覆盖此版本。
也可以从命令行将启动器明确用作py
应用程序。运行py
遵循与隐式启动脚本相同的版本选择规则,但是可以pass传递适当的参数来选择更具体的版本(例如-3
以在安装了 Python 2 的情况下请求 Python 3,或-2.6
以在特定的情况下请求较早的 Python 版本)。已安装较新的版本)。
除了启动器之外,Windows 安装程序现在还包括一个选项,用于将新安装的 Python 添加到系统 PATH。 (由 Brian Curtin 在bpo-3561中贡献。)
See also
PEP 397-适用于 Windows 的 Python 启动器
Mark Hammond 和 Martin 诉 Löwis 撰写的 PEP; Vinay Sajip 实施。
启动器文档:适用于 Windows 的 Python 启动器
安装程序 PATH 修改:查找 Python 可执行文件
PEP 3151:重做 OS 和 IO 异常层次结构
由 os 错误引发的异常的层次结构现在已得到简化和细化。
您不必担心在OSError,IOError,EnvironmentError,WindowsError,mmap.error
,socket.error或select.error之间选择适当的异常类型。现在,所有这些异常类型都只有一种:OSError。出于兼容性原因,其他名称保留为别名。
而且,现在更容易捕获特定的错误情况。您可以捕获足够的OSError子类,而不用检查errno模块中的特定常量的errno
属性(或args[0]
)。可用的子类如下:
ConnectionError本身具有更细粒度的子类:
由于有了新的 exception,现在可以避免errno的常见用法。例如,以下为 Python 3.2 编写的代码:
from errno import ENOENT, EACCES, EPERM
try:
with open("document.txt") as f:
content = f.read()
except IOError as err:
if err.errno == ENOENT:
print("document.txt file is missing")
elif err.errno in (EACCES, EPERM):
print("You are not allowed to read document.txt")
else:
raise
现在可以在没有errno导入且无需手动检查异常属性的情况下编写:
try:
with open("document.txt") as f:
content = f.read()
except FileNotFoundError:
print("document.txt file is missing")
except PermissionError:
print("You are not allowed to read document.txt")
See also
PEP 3151-重做 OS 和 IO 异常层次结构
PEP 由 Antoine Pitrou 编写和实施
PEP 380:委派给子生成器的语法
PEP 380 添加yield from
表达式,从而允许generator将其部分操作委托给另一个生成器。这允许包含yield的代码段被分解出来并放置在另一个生成器中。另外,允许子生成器返回一个值,并且该值可用于委派生成器。
尽管yield from
表达式主要用于委派给子生成器,但实际上允许委派给任意子生成器。
对于简单的迭代器,yield from iterable
本质上只是for item in iterable: yield item
的缩写形式:
>>> def g(x):
... yield from range(x, 0, -1)
... yield from range(x)
...
>>> list(g(5))
[5, 4, 3, 2, 1, 0, 1, 2, 3, 4]
但是,与普通循环不同,yield from
允许子生成器直接从调用范围接收发送和抛出的值,并将finally值返回给外部生成器:
>>> def accumulate():
... tally = 0
... while 1:
... next = yield
... if next is None:
... return tally
... tally += next
...
>>> def gather_tallies(tallies):
... while 1:
... tally = yield from accumulate()
... tallies.append(tally)
...
>>> tallies = []
>>> acc = gather_tallies(tallies)
>>> next(acc) # Ensure the accumulator is ready to accept values
>>> for i in range(4):
... acc.send(i)
...
>>> acc.send(None) # Finish the first tally
>>> for i in range(5):
... acc.send(i)
...
>>> acc.send(None) # Finish the second tally
>>> tallies
[6, 10]
推动这一变化的主要原理是,即使设计成与send
和throw
方法一起使用的生成器也可以轻松拆分为多个子生成器,就像单个大型函数可以拆分为多个子函数一样容易。
See also
PEP 380-委托给子生成器的语法
GEP Ewing 撰写的 PEP; Greg Ewing 的实施,Renaud Blanch,Ryan Kelly 和 Nick Coghlan 将其集成到 3.3 中; ZbigniewJędrzejewski-Szmek 和 Nick Coghlan 的文档
PEP 409:禁止异常上下文
PEP 409 引入了新的语法,该语法允许禁用链接的异常上下文的显示。这允许在异常类型之间转换的应用程序中出现更清晰的错误消息:
>>> class D:
... def __init__(self, extra):
... self._extra_attributes = extra
... def __getattr__(self, attr):
... try:
... return self._extra_attributes[attr]
... except KeyError:
... raise AttributeError(attr) from None
...
>>> D({}).x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 8, in __getattr__
AttributeError: x
如果没有使用from None
后缀来抑制原因,则默认情况下将显示原始异常:
>>> class C:
... def __init__(self, extra):
... self._extra_attributes = extra
... def __getattr__(self, attr):
... try:
... return self._extra_attributes[attr]
... except KeyError:
... raise AttributeError(attr)
...
>>> C({}).x
Traceback (most recent call last):
File "<stdin>", line 6, in __getattr__
KeyError: 'x'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 8, in __getattr__
AttributeError: x
调试Function不会丢失,因为如果需要,原始异常上下文仍然可用(例如,如果中间库错误地抑制了有价值的基础细节):
>>> try:
... D({}).x
... except AttributeError as exc:
... print(repr(exc.__context__))
...
KeyError('x',)
See also
PEP 409-禁止异常上下文
由 Ethan Furman 撰写的 PEP;由 Ethan Furman 和 Nick Coghlan 实施。
PEP 414:明确的 UnicodeLiterals
为了简化从 Python 2 到 Unicode 感知型 Python 应用程序的过渡,该应用程序大量使用 UnicodeLiterals,Python 3.3 再次支持字符串 Literals 的“ u
”前缀。该前缀在 Python 3 中没有语义上的意义,仅是为了减少迁移到 Python 3 时纯机械更改的数量而提供,从而使开发人员更容易专注于更重要的语义更改(例如更严格的默认二进制分隔)。和文本数据)。
See also
PEP 414-明确的 UnicodeLiterals
PEP 由 Armin Ronacher 撰写。
PEP 3155:类和函数的合格名称
函数和类对象具有一个新的__qualname__
属性,该属性表示从模块顶层到其定义的“路径”。对于全局函数和类,这与__name__
相同。对于其他函数和类,它提供了有关它们的实际定义位置以及如何从全局范围访问它们的更好信息。
(非绑定)方法的示例:
>>> class C:
... def meth(self):
... pass
>>> C.meth.__name__
'meth'
>>> C.meth.__qualname__
'C.meth'
嵌套类的示例:
>>> class C:
... class D:
... def meth(self):
... pass
...
>>> C.D.__name__
'D'
>>> C.D.__qualname__
'C.D'
>>> C.D.meth.__name__
'meth'
>>> C.D.meth.__qualname__
'C.D.meth'
嵌套函数示例:
>>> def outer():
... def inner():
... pass
... return inner
...
>>> outer().__name__
'inner'
>>> outer().__qualname__
'outer.<locals>.inner'
这些对象的字符串表示形式也已更改为包括新的,更精确的信息:
>>> str(C.D)
"<class '__main__.C.D'>"
>>> str(C.D.meth)
'<function C.D.meth at 0x7f46b9fe31e0>'
See also
PEP 3155-类和函数的合格名称
PEP 由 Antoine Pitrou 编写和实施。
PEP 412:密钥共享字典
现在,用于存储对象属性的字典可以彼此共享其内部存储的一部分(即,存储键及其各自哈希的部分)。这减少了创建许多非内置类型实例的程序的内存消耗。
See also
PEP 412-密钥共享字典
PEP 由 Mark Shannon 编写和实施。
PEP 362:Function签名对象
新的函数inspect.signature()使对 python 可调用对象的内省变得容易和直接。支持广泛的可调用对象:python 函数(是否修饰),类和functools.partial()对象。新的类inspect.Signature,inspect.Parameter和inspect.BoundArguments包含有关调用签名的信息,例如 Comments,默认值,参数种类和绑定的参数,这大大简化了编写修饰符以及验证或修改调用签名或参数的任何代码。
See also
PEP 362:-函数签名对象
由 Brett Cannon,Yury Selivanov,Larry Hastings,Jiwon Seo 撰写的 PEP;由 Yury Selivanov 实施。
PEP 421:添加系统实现
sys模块上的新属性公开了特定于当前运行的解释器的实现的详细信息。 sys.implementation上的初始属性集是name
,version
,hexversion
和cache_tag
。
sys.implementation
的目的是将标准库使用的特定于实现的数据合并到一个名称空间中。这允许不同的 Python 实现更轻松地共享单个标准库代码库。 sys.implementation
在其初始状态下仅保留特定于实现的数据的一小部分。随着时间的流逝,该比率将发生变化,以使标准库更易于移植。
改进的标准库可移植性的一个示例是cache_tag
。从 Python 3.3 开始,importlib使用sys.implementation.cache_tag
来支持 PEP 3147合规性。将importlib
用于其内置导入系统的任何 Python 实现都可以使用cache_tag
来控制模块的缓存行为。
SimpleNamespace
sys.implementation
的实现还为 Python 引入了一种新类型:types.SimpleNamespace。与基于 Map 的名称空间(如dict)相反,SimpleNamespace
是基于属性的(如object)。但是,与object
不同,SimpleNamespace
实例是可写的。这意味着您可以pass常规属性访问来添加,删除和修改名称空间。
See also
PEP 421-添加 sys.implementation
PEP 由 Eric Snow 编写和实施。
使用 importlib 作为导入的实现
bpo-2377-替换带有 importlib 的__import__。import bpo-13959-在纯 Python bpo-14605中重新实现imp的某些部分-明确表示导入机制bpo-14646-要求加载器设置__loader_和__package__
import()Function现在由importlib.import()驱动。这项工作导致 PEP 302的“阶段 2”完成。此更改有多个好处。首先,它允许暴露更多的动力 Importing 机器,而不是在 C 代码中隐式和隐藏。它还为所有支持 Python 3.3 的 Python VM 提供了一个单一的实现,可帮助终止导入语义上所有 VM 特定的偏差。最后,它简化了 import 的维护,使 Future 的增长成为可能。
对于普通用户,语义上应该没有可见的变化。对于那些其代码当前正在操纵导入或以编程方式调用调用的代码,本文档的移植 Python 代码部分涵盖了可能需要进行的代码更改。
New APIs
这项工作的一大好处是可以使导入语句起作用。这意味着曾经是隐式的各种导入器现在已作为importlib包的一部分完全公开。
pass分别引入importlib.abc.MetaPathFinder和importlib.abc.PathEntryFinder,已扩展了importlib.abc中定义的抽象 Base Class,以在元路径发现者和路径条目查找器之间正确地描绘。 importlib.abc.Finder的旧 ABC 现在仅提供向后兼容性,并且不强制执行任何方法要求。
在查找程序方面,importlib.machinery.FileFinder公开了用于搜索模块的源代码和字节码文件的机制。以前,此类是sys.path_hooks的隐式成员。
对于加载程序,新的抽象 Base Classimportlib.abc.FileLoader帮助编写一个使用文件系统作为模块代码存储机制的加载程序。现在可以直接使用源文件(importlib.machinery.SourceFileLoader),无源字节码文件(importlib.machinery.SourcelessFileLoader)和扩展模块(importlib.machinery.ExtensionFileLoader)的加载程序。
ImportError现在具有name
和path
属性,可以在提供相关数据时进行设置。导入失败的消息现在还将提供模块的全名,而不仅仅是模块名称的尾端。
importlib.invalidate_caches()函数现在将在sys.path_importer_cache中缓存的所有查找器上以相同的名称调用该方法,以根据需要帮助清除任何存储的状态。
Visible Changes
有关可能需要的代码更改,请参见移植 Python 代码部分。
除了importlib现在公开的内容之外,还有其他可见的更改要导入。最大的是sys.meta_path和sys.path_hooks现在存储了导入使用的所有元路径查找器和路径条目钩子。以前,查找程序是隐式和隐藏在导入的 C 代码中,而不是直接公开。这意味着现在可以轻松地删除或更改各种查找器的 Sequences 以满足自己的需要。
另一个更改是,所有模块都具有__loader__
属性,存储用于创建模块的加载程序。 PEP 302已进行了更新,以使此属性对于实施程序来说是强制性的,因此,将来一旦更新了第三方装载程序,人们将能够依靠该属性的存在。不过,在此之前,import 会设置模块的后加载。
现在还希望加载程序从 PEP 366设置__package__
属性。再一次,import 本身已经在importlib的所有加载器上进行了设置,而 import 本身正在设置属性 post-load。
当在sys.path_hooks上找不到查找器时,None
现在插入了sys.path_importer_cache。由于imp.NullImporter没有直接在sys.path_hooks上公开,因此不再依赖于imp.NullImporter始终可以用作表示未找到查找器的值。
所有其他更改都与语义更改有关,在为 Python 3.3 更新代码时应考虑这些语义更改,因此应在本文档的移植 Python 代码部分中进行阅读。
(Brett Cannon 的实现)
其他语言更改
对核心 Python 语言进行的一些较小更改是:
- 添加了对 Unicode 名称别名和命名序列的支持。 unicodedata.lookup()和
'\N{...}'
现在都解析名称别名,而unicodedata.lookup()也解析名称序列。
(由 Ezio Melotti 在bpo-12753中贡献。)
Unicode 数据库已更新为 UCD 版本 6.1.0
bytes和bytearray对象的
count()
,find()
,rfind()
,index()
和rindex()
方法现在接受 0 到 255 之间的整数作为它们的第一个参数。
(由 Petri Lehtinen 在bpo-12170中贡献。)
bytes和bytearray的
rjust()
,ljust()
和center()
方法现在接受bytearray作为fill
参数。 (由 Petri Lehtinen 在bpo-12380中贡献。)新方法已添加到list和bytearray:
copy()
和clear()
(bpo-10516)。因此,MutableSequence现在还定义了clear()
方法(bpo-11388)。现在可以将原始字节 Literals 写入
rb"..."
和br"..."
。
(由bpo-13748中的 Antoine Pitrou 提供。)
- dict.setdefault()现在仅对给定的键进行一次查找,与内置类型一起使用时使其变为原子键。
(由 FilipGruszczyński 在bpo-13521中贡献。)
- Function调用与Function签名不匹配时产生的错误消息已得到显着改善。
(由本杰明·彼得森贡献.)
细粒度的 import 锁
早期版本的 CPython 始终依靠全局导入锁。这导致了意外的烦恼,例如在导入模块时出现死锁,这会在另一个线程中触发代码执行,从而产生副作用。有时会使用笨拙的解决方法,例如PyImport_ImportModuleNoBlock() C API 函数。
在 Python 3.3 中,导入模块需要按模块锁定。这样可以正确地序列化从多个线程中导入给定模块的过程(防止暴露未完全初始化的模块),同时消除了上述麻烦。
(由bpo-9260中的 Antoine Pitrou 提供。)
内置函数和类型
open()获得一个新的* opener 参数:然后pass使用( file , flags )调用 opener *来获得文件对象的基础文件 Descriptors。例如,它可以用于使用自定义标志,例如os.O_CLOEXEC。
'x'
模式已添加:打开以进行独占创建,如果文件已存在则失败。print():添加了* flush 关键字参数。如果 flush *关键字参数为 true,则将强制刷新流。
hash():默认情况下启用哈希随机化,请参见object.hash()和 PYTHONHASHSEED。
str类型获得了新的casefold()方法:返回字符串的 casefolded 副本,casefolded 的字符串可用于无大小写匹配。例如,
'ß'.casefold()
返回'ss'
。序列文档已被实质性地重写,以更好地解释二进制/文本序列的区别,并为各个内置序列类型(bpo-4966)提供特定的文档部分。
New Modules
faulthandler
这个新的调试模块faulthandler包含在故障(如分段错误之类的崩溃),超时后或在用户 signal 上显式转储 Python 跟踪的Function。调用faulthandler.enable()为SIGSEGV
,SIGFPE
,SIGABRT
,SIGBUS
和SIGILL
signal 安装故障处理程序。您也可以在启动时pass设置 PYTHONFAULTHANDLER环境变量或使用-X faulthandler
命令行选项来启用它们。
Linux 上的分段错误示例:
$ python -q -X faulthandler
>>> import ctypes
>>> ctypes.string_at(0)
Fatal Python error: Segmentation fault
Current thread 0x00007fb899f39700:
File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at
File "<stdin>", line 1 in <module>
Segmentation fault
ipaddress
新的ipaddress模块提供了用于创建和处理代表 IPv4 和 IPv6 地址,网络和接口(即与特定 IP 子网关联的 IP 地址)的对象的工具。
(由 Google 和 Peter Moody 在 PEP 3144中贡献。)
lzma
新添加的lzma模块使用 LZMA 算法提供数据压缩和解压缩,包括对.xz
和.lzma
文件格式的支持。
(由 Nadeem Vawda 和 PerØyvindKarlsen 在bpo-6715中贡献。)
Improved Modules
abc
对包含由抽象方法组成的 Descriptors 的抽象 Base Class 的改进支持。现在,建议使用的语句抽象 Descriptors 的方法是提供__isabstractmethod__
作为动态更新的属性。内置 Descriptors 已相应更新。
Note
abc.abstractproperty已被弃用,而将property与abc.abstractmethod()结合使用。
abc.abstractclassmethod已被弃用,而将classmethod与abc.abstractmethod()结合使用。
abc.abstractstaticmethod已被弃用,而将staticmethod与abc.abstractmethod()结合使用。
(由bpo-11610中的 Darren Dale 贡献。)
abc.ABCMeta.register()现在返回已注册的子类,这意味着它现在可用作类装饰器(bpo-10868)。
array
array模块使用q
和Q
类型代码支持long long
类型。
(由 Oren Tirosh 和 Hirokazu Yamamoto 在bpo-1172711中贡献。)
base64
base64现代接口的解码Function现在接受仅 ASCII 的 Unicode 字符串。例如,base64.b64decode('YWJj')
返回b'abc'
。 (由 Catalin Iacob 在bpo-13641中贡献。)
binascii
除了它们通常接受的二进制对象之外,a2b_
函数现在都还接受纯 ASCII 字符串作为 Importing。 (由bpo-13637中的 Antoine Pitrou 提供。)
bz2
bz2模块已从头开始重写。在此过程中,添加了几个新Function:
bz2.open()新增Function:以二进制或文本模式打开 bzip2zipfile。
bz2.BZ2File现在可以pass其构造函数的* fileobj *参数读取和写入任意类似文件的对象。
(由 Nadeem Vawda 在bpo-5863中贡献。)
- bz2.BZ2File和bz2.decompress()现在可以解压缩多流 Importing(例如 pbzip2 工具产生的 Importing)。 bz2.BZ2File现在还可以使用
'a'
(附加)模式来创建这种类型的文件。
(由 Nir Aides 在bpo-1625中贡献。)
- bz2.BZ2File现在实现除
detach()
和truncate()
方法之外的所有io.BufferedIOBase API。
codecs
mbcs编解码器已被重写,可以在所有 Windows 版本上正确处理replace
和ignore
错误处理程序。现在,mbcs编解码器支持所有错误处理程序,而不仅仅是replace
进行编码和ignore
进行解码。
已添加新的仅 Windows 的编解码器:cp65001
(bpo-13216)。这是 Windows 代码页 65001(Windows UTF-8,CP_UTF8
)。例如,如果控制台输出代码页设置为 cp65001(例如,使用chcp 65001
命令),则sys.stdout
使用它。
多字节 CJK 解码器现在可以更快地重新同步。它们仅忽略无效字节序列的第一个字节。例如,b'\xff\n'.decode('gb2312', 'replace')
现在在替换字符之后返回\n
。
增量 CJK 编解码器不再在每次调用他们的 encode()方法时重置。例如:
>>> import codecs
>>> encoder = codecs.getincrementalencoder('hz')('strict')
>>> b''.join(encoder.encode(x) for x in '\u52ff\u65bd\u65bc\u4eba\u3002 Bye.')
b'~{NpJ)l6HK!#~} Bye.'
本示例为b'~{Np~}~{J)~}~{l6~}~{HK~}~{!#~} Bye.'
提供了较旧的 Python 版本。
unicode_internal
编解码器已弃用。
collections
添加新的ChainMap类,以允许将多个 Map 视为一个单元。 (由 Raymond Hettinger 为bpo-11089写,于bpo-11297公开。)
抽象 Base Class 已移至新的collections.abc模块中,以更好 locale 分抽象类和具体集合类。 ABC 的别名仍然存在于collections模块中,以保留现有的导入。 (bpo-11085)
Counter类现在支持一元+
和-
运算符,以及就地运算符+=
,-=
,|=
和&=
。 (由 Raymond Hettinger 在bpo-13121中贡献。)
contextlib
ExitStack现在为上下文 Management 器的编程操作和类似的清理Function提供了坚实的基础。与以前的contextlib.nested
API(已弃用并删除)不同,新 API 旨在正常运行,而不管上下文 Management 器是pass__init__
方法(例如文件对象)还是pass__enter__
方法(例如同步)获取资源。 threading模块中的对象)。
crypt
在crypt模块中增加了 salt 和模块化加密格式(散列方法)和mksalt()函数。
curses
Note
如果curses模块已链接到 ncursesw 库,则在传递 Unicode 字符串或字符(例如
waddwstr()
)时使用 Unicode 函数,否则使用字节函数(例如waddstr()
)。使用语言环境编码而不是
utf-8
来编码 Unicode 字符串。curses.window
具有新的curses.window.encoding属性。curses.window
类具有新的get_wch()方法来获取宽字符curses模块具有一个新的unget_wch()函数,用于按宽字符,因此下一个get_wch()将返回它
(由 IñigoSerna 在bpo-6755中贡献。)
datetime
Note
现在,天真的和知道的datetime实例之间的相等比较返回False而不是提高TypeError(bpo-15006)。
新的datetime.datetime.timestamp()方法:返回与datetime实例相对应的 POSIX 时间戳。
datetime.datetime.strftime()方法支持格式化大于 1000 的年份。
现在可以在不带参数的情况下调用datetime.datetime.astimezone()方法,以将 datetime 实例转换为系统时区。
decimal
bpo-7652-集成快速本机十进制算法。
- Stefan Krah 编写的 C 模块和 libmpdec。
十进制模块的新 C 版本集成了高速 libmpdec 库,用于任意精度的正确舍入十进制浮点运算。 libmpdec 符合 IBM 的通用十进制算术规范。
性能提升的范围从数据库应用程序的 10 倍到数字密集型应用程序的 100 倍。这些数字是十进制浮点算术中使用的标准精度的预期增益。由于精度是用户可配置的,因此准确数字可能会有所不同。例如,在整数 bignum 算术中,差异可能会更高。
下表仅供参考。基准可在http://www.bytereef.org/mpdecimal/quickstart.html获得。
Note
decimal.py | _decimal | speedup | |
---|---|---|---|
pi | 42.02s | 0.345s | 120x |
telco | 172.19s | 5.68s | 30x |
psycopg | 3.57s | 0.29s | 12x |
Features
FloatOperationsignal 可以选择启用更严格的语义来混合浮点数和小数。
如果 Python 是在没有线程的情况下编译的,则 C 版本会自动禁用昂贵的线程本地上下文机制。在这种情况下,变量HAVE_THREADS设置为
False
。
API changes
- 根据计算机体系结构,C 模块具有以下上下文限制:
Note
32-bit | 64-bit | |
---|---|---|
MAX_PREC |
425000000 |
999999999999999999 |
MAX_EMAX |
425000000 |
999999999999999999 |
MIN_EMIN |
-425000000 |
-999999999999999999 |
在上下文模板(DefaultContext,BasicContext和ExtendedContext)中,
Emax
和Emin
的大小已更改为999999
。decimal.py 中的Decimal构造函数不遵守上下文限制,而是精确转换具有任意指数或精度的值。由于 C 版本具有内部限制,因此使用以下方案:如果可能,将精确地转换值,否则将引发InvalidOperation且结果为 NaN。在后一种情况下,始终可以使用create_decimal()以获得舍入或不精确的值。
十进制.py 中的幂函数始终正确舍入。在 C 版本中,它是根据正确舍入的exp()和ln()函数定义的,但finally结果只是“几乎总是正确舍入”。
在 C 版本中,包含 signal 的上下 Literals 典是MutableMapping。出于速度原因,
flags
和traps
始终引用与初始化上下文相同的MutableMapping。如果分配了新的 signal 字典,则使用新值更新flags
和traps
,但它们未引用 RHS 字典。腌制Context会产生不同的输出,以便具有适用于 Python 和 C 版本的通用交换格式。
quantize()方法中的
watchexp
参数已弃用。
Policy Framework
电子邮件包现在具有policy框架。 Policy是具有多个方法和属性的对象,这些方法和属性控制电子邮件包的行为。 Python 3.3 的主要策略是Compat32策略,它向后兼容 Python 3.2 中的电子邮件包。当passparser解析电子邮件,创建Message对象或使用generator序列化电子邮件时,可以指定policy
。除非被覆盖,否则传递给parser
的策略将被parser
创建的所有Message
对象和子对象继承。默认情况下,generator
将使用正在序列化的Message
对象的策略。默认策略是compat32。
所有policy
对象实施的最少控件集是:
Note
max_line_length | Message 序列化时,各个行可能具有的最大长度(不包括 lineep 字符)。默认为 78. |
linesep | Message 序列化时用于分隔各行的字符。默认为\n 。 |
cte_type | 7bit 或8bit 。 8bit 仅适用于Bytes generator ,表示在协议允许的地方(或原始 Importing 中存在的地方)可以使用非 ASCII。 |
raise_on_defect | 当遇到缺陷而不是将它们添加到Message 对象的defects 列表中时,导致parser 引发错误。 |
使用策略对象的clone()方法创建具有新设置的新策略实例。 clone
将以上任何控件用作关键字参数。调用中未指定的任何控件均保留其默认值。因此,您可以创建一个使用\r\n
个 lineep 字符的策略,如下所示:
mypolicy = compat32.clone(linesep='\r\n')
策略可用于简化应用程序所需格式的消息生成。当您设置parser
或Message
所使用的策略时,无论您使用哪种程序创建Message
对象,都不必一次在调用generator
的所有位置都指定linesep='\r\n'
。另一方面,如果需要生成多种形式的消息,则仍可以在适当的generator
调用中指定参数。或者,您可以针对不同情况创建自定义策略实例,并在创建generator
时将其传递给。
带有新标题 API 的临时策略
虽然策略框架本身值得一提,但引入该框架的主要动机是允许创建新策略,这些新策略为电子邮件包实现新Function,从而为那些不使用新策略的人保持向后兼容性。由于新 Policy 引入了新的 API,因此我们将它们作为provisional policy在 Python 3.3 中发布。如果核心开发人员认为必要,则可能会发生向后不兼容的更改(直到并包括删除代码)。
新策略是EmailPolicy的实例,并添加以下其他控件:
Note
header_factory
是新策略提供的新Function的关键。使用新策略之一时,从Message
对象检索的任何 Headers 都是header_factory
产生的对象,并且每次在Message
上设置 Headers 时,它都会成为header_factory
产生的对象。所有此类 Headers 对象均具有name
属性,该属性等于 Headers 名称。地址和日期 Headers 具有其他属性,可让您访问 Headers 的解析数据。这意味着您现在可以执行以下操作:
>>> m = Message(policy=SMTP)
>>> m['To'] = 'Éric <foo@example.com>'
>>> m['to']
'Éric <foo@example.com>'
>>> m['to'].addresses
(Address(display_name='Éric', username='foo', domain='example.com'),)
>>> m['to'].addresses[0].username
'foo'
>>> m['to'].addresses[0].display_name
'Éric'
>>> m['Date'] = email.utils.localtime()
>>> m['Date'].datetime
datetime.datetime(2012, 5, 25, 21, 39, 24, 465484, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000), 'EDT'))
>>> m['Date']
'Fri, 25 May 2012 21:44:27 -0400'
>>> print(m)
To: =?utf-8?q?=C3=89ric?= <foo@example.com>
Date: Fri, 25 May 2012 21:44:27 -0400
您会注意到,序列化消息时,Unicode 显示名称会自动编码为utf-8
,但是直接访问 Headers 时,将获得 Unicode 版本。这样就无需处理email.header decode_header()或make_header()函数。
您还可以从以下部分创建地址:
>>> m['cc'] = [Group('pals', [Address('Bob', 'bob', 'example.com'),
... Address('Sally', 'sally', 'example.com')]),
... Address('Bonzo', addr_spec='bonz@laugh.com')]
>>> print(m)
To: =?utf-8?q?=C3=89ric?= <foo@example.com>
Date: Fri, 25 May 2012 21:44:27 -0400
cc: pals: Bob <bob@example.com>, Sally <sally@example.com>;, Bonzo <bonz@laugh.com>
解码为 unicode 是自动完成的:
>>> m2 = message_from_string(str(m))
>>> m2['to']
'Éric <foo@example.com>'
解析消息时,可以使用标题对象的addresses
和groups
属性来访问组和单个地址:
>>> m2['cc'].addresses
(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com'), Address(display_name='Bonzo', username='bonz', domain='laugh.com'))
>>> m2['cc'].groups
(Group(display_name='pals', addresses=(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com')), Group(display_name=None, addresses=(Address(display_name='Bonzo', username='bonz', domain='laugh.com'),))
总而言之,如果您使用新策略之一,则 Headers 操作将按照应有的方式工作:您的应用程序使用 unicode 字符串,并且电子邮件程序包透明地对 Unicode 标准与 RFC 标准内容传输编码进行编码和解码。
其他 API 更改
新的BytesHeaderParser已添加到parser模块中,以补充HeaderParser并完成 Bytes API。
新的 Util Function:
Note
format_datetime():给定datetime,生成一个格式化为在电子邮件标题中使用的字符串。
parsedate_to_datetime():给定电子邮件标题中的日期字符串,将其转换为有意识的datetime,或者将天真datetime转换为
-0000
。localtime():不带任何参数,使用本地timezone返回当前本地时间作为有意识的datetime。给定已知的datetime,则使用本地timezone将其转换为已知的datetime。
ftplib
ftplib.FTP现在接受
source_address
关键字参数,以指定(host, port)
在创建传出套接字时用作绑定调用中的源地址。 (由 GiampaoloRodolà在bpo-8594中贡献。)FTP_TLS类现在提供了新的ccc()函数,以将控制通道恢复为纯文本格式。这对于利用知道如何在不打开固定端口的情况下使用非安全 FTP 处理 NAT 的防火墙很有用。 (由 GiampaoloRodolà在bpo-12139中贡献。)
添加了ftplib.FTP.mlsd()方法,该方法提供了可解析的目录列表格式,并弃用了ftplib.FTP.nlst()和ftplib.FTP.dir()。 (由 GiampaoloRodolà在bpo-11072中贡献。)
functools
functools.lru_cache()装饰器现在接受typed
关键字参数(默认值为False
,以确保它在不同的缓存插槽中缓存比较相同的不同类型的值.(由bpo-13227中的 Raymond Hettinger 提供)。
gc
现在可以使用新的callbacks列表在垃圾回收之前和之后注册由垃圾回收器调用的回调。
hmac
添加了新的compare_digest()Function,以pass时序分析来防止对摘要的侧通道攻击。 (由 Nick Coghlan 和 Christian Heimes 在bpo-15061中贡献。)
http
http.server.BaseHTTPRequestHandler现在会缓冲 Headers,并在调用end_headers()时一次写入所有 Headers。可以使用新的方法flush_headers()直接 Management 何时发送累积的 Headers。 (由 Andrew Schaaf 在bpo-3709中贡献。)
http.server现在产生有效的HTML 4.01 strict
输出。 (由 Ezio Melotti 在bpo-13295中贡献。)
http.client.HTTPResponse现在具有readinto()方法,这意味着它可以用作io.RawIOBase类。 (由约翰·库恩在bpo-13464中贡献。)
html
html.parser.HTMLParser现在可以解析损坏的标记而不会引发错误,因此,不建议使用构造函数的* strict *参数和HTMLParseError
异常。解析损坏的标记的能力是许多错误修复的结果,而最新的 Python 2.7/3.2 错误修复版本也提供了这些错误修复。 (由 Ezio Melotti 在bpo-15114和bpo-14538,bpo-13993,bpo-13960,bpo-13358,bpo-1745761,bpo-755670,bpo-13357,bpo-12629,bpo-1200313,bpo-670664,bpo-13273,bpo-12888,bpo-7311中贡献。)
已将新的html5字典将 HTML5 命名字符引用 Map 到等效的 Unicode 字符(例如html5['gt;'] == '>'
),已添加到html.entities模块。 HTMLParser现在也使用该字典。 (由 Ezio Melotti 在bpo-11113和bpo-15156中贡献。)
imaplib
IMAP4_SSL构造函数现在接受 SSLContext 参数来控制安全通道的参数。
(由 Sijin Joseph 在bpo-8808中贡献。)
inspect
添加了新的getclosurevars()Function。该函数报告从函数体引用的所有名称的当前绑定以及这些名称的解析位置,从而在测试依赖于有状态闭包的代码时,更容易验证正确的内部状态。
(由 Meador Inge 和 Nick Coghlan 在bpo-13062中贡献。)
添加了新的getgeneratorlocals()Function。此函数报告生成器堆栈框架中局部变量的当前绑定,从而在测试生成器时更容易验证正确的内部状态。
(由 Meador Inge 在bpo-15153中贡献。)
io
open()函数具有新的'x'
模式,可用于专门创建一个新文件,如果文件已经存在,则引发FileExistsError。它基于 C11'x'模式的 fopen()。
(由 David Townshend 在bpo-12760中贡献。)
TextIOWrapper类的构造函数有一个新的* write_through 可选参数。如果 write_through *为True
,则保证不会缓冲对write()
的调用:写在TextIOWrapper对象上的任何数据都会立即处理到其基础二进制缓冲区中。
itertools
accumulate()现在接受一个可选的func
参数,以提供用户提供的二进制函数。
logging
basicConfig()函数现在支持可选的handlers
参数,该参数接受可迭代的处理程序以添加到根 Logger。
已将一个类级别的属性append_nul
添加到SysLogHandler,以控制将NUL
(\000
)字节附加到 syslog 记录,因为对于某些守护程序来说,它是必需的,而对于其他守护程序,则它需要传递到日志中。
math
math模块具有一个新函数log2(),该函数返回* 2 *的以 2 为底的对数。
(由 Mark Dickinson 在bpo-11888中撰写。)
mmap
read()方法现在与其他类似文件的对象更加兼容:如果Ellipsis了该参数或将其指定为None
,则它将从当前文件位置返回到 Map 末尾的字节。 (由 Petri Lehtinen 在bpo-12021中贡献。)
multiprocessing
新的multiprocessing.connection.wait()Function允许在超时的情况下轮询多个对象(例如连接,套接字和管道)。 (由 Richard Oudkerk 在bpo-12328中贡献。)
现在可以pass multiprocessing 连接传输multiprocessing.Connection
个对象。 (由 Richard Oudkerk 在bpo-4892中贡献。)
multiprocessing.Process现在接受daemon
关键字参数,以覆盖从父进程(bpo-6064)继承daemon
标志的默认行为。
新属性multiprocessing.Process.sentinel允许程序使用适当的 OSPrimitives(例如 posix 系统上的select)一次在多个Process对象上 await。
新方法multiprocessing.pool.Pool.starmap()和starmap_async()提供了与现有multiprocessing.pool.Pool.map()和map_async()函数等效的itertools.starmap()。 (由 Hynek Schlawack 在bpo-12708中贡献。)
nntplib
nntplib.NNTP类现在支持上下文 Management 协议,以无条件使用socket.error异常并在完成后关闭 NNTP 连接:
>>> from nntplib import NNTP
>>> with NNTP('news.gmane.org') as n:
... n.group('gmane.comp.python.committers')
...
('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers')
>>>
(由 GiampaoloRodolà在bpo-9795中贡献。)
os
os模块具有一个新的pipe2()函数,该函数可以创建原子设置为O_CLOEXEC或O_NONBLOCK标志的管道。这对于避免多线程程序中的竞争条件特别有用。
os模块具有新的sendfile()Function,该Function提供了一种有效的“零复制”方式,可将数据从一个文件(或套接字)Descriptors 复制到另一个文件。短语“零复制”是指以下事实:两个 Descriptors 之间的所有数据复制完全由内核完成,而没有将数据复制到用户空间缓冲区中。 sendfile()可用于有效地将数据从磁盘上的文件复制到网络套接字,例如用于下载文件。
(Ross Lagerwall 和 GiampaoloRodolà在bpo-10882提交的补丁。)
为了避免出现诸如 symlink 攻击之类的竞争状况以及临时文件和目录的问题,操纵文件 Descriptors 而不是文件名更加可靠(而且速度更快)。 Python 3.3 增强了现有Function,并引入了新Function来处理文件 Descriptors(bpo-4761,bpo-10755和bpo-14626)。
os模块具有与walk()类似的新fwalk()函数,除了它还会生成引用已访问目录的文件 Descriptors。这对于避免符号链接竞赛特别有用。
以下函数获得新的可选* dir_fd (相对于目录 Descriptors 的路径)和/或 follow_symlinks *(不遵循符号链接):access(),chflags(),chmod(),chown(),link(),lstat(),mkdir(),mkfifo(),mknod(),open(),readlink(),remove() rmdir(),stat(),symlink(),unlink(),utime()。可以passos.supports_dir_fd和
os.supports_follows_symlinks
集合检查使用这些参数的平台支持。现在,以下函数为其路径参数支持文件 Descriptors:chdir(),chmod(),chown(),execve(),listdir(),pathconf(),exists(),stat(),statvfs(),utime()。可以passos.supports_fd设置检查对此平台的支持。
access()接受
effective_ids
关键字参数,以在访问检查中使用有效的 uid/gid 而不是实际的 uid/gid 来打开。可以passsupports_effective_ids设置检查对此平台的支持。os模块具有两个新Function:getpriority()和setpriority()。它们可以以类似于os.nice()的方式用于获取或设置进程的优先级/优先级,但可以扩展到所有进程,而不仅仅是当前进程。
(由 GiampaoloRodolà在bpo-10784提交的补丁。)
新的os.replace()函数允许跨平台重命名文件并覆盖目标。使用os.rename(),现有目标文件将在 POSIX 下覆盖,但在 Windows 下会引发错误。 (由bpo-8828中的 Antoine Pitrou 提供。)
stat 系列函数(stat(),fstat()和lstat())现在支持以纳秒精度读取文件的时间戳。对称地,utime()现在可以以纳秒精度写入文件时间戳。 (由bpo-14127中的 Larry Hastings 贡献。)
新的os.get_terminal_size()函数查询附加到文件 Descriptors 的终端的大小。另请参见shutil.get_terminal_size()。 (由 ZbigniewJędrzejewski-Szmek 在bpo-13609中贡献。)
支持 Linux 扩展属性(bpo-12720)的新Function:getxattr(),listxattr(),removexattr(),setxattr()。
计划程序的新界面。这些Function控制 os 如何为进程分配 CPU 时间。新Function:sched_get_priority_max(),sched_get_priority_min(),sched_getaffinity(),sched_getparam(),sched_getscheduler(),sched_rr_get_interval(),sched_setaffinity(),sched_setparam(),sched_setscheduler(),sched_yield(),
控制文件系统的新Function:
posix_fadvise():宣布打算以特定模式访问数据,从而允许内核进行优化。
posix_fallocate():确保为文件分配了足够的磁盘空间。
sync():强制将所有内容写入磁盘。
附加的 posix 新Function:
lockf():在打开的文件 Descriptors 上应用,测试或删除 POSIX 锁。
pread():从文件 Descriptors 读取偏移量,文件偏移量保持不变。
pwrite():从偏移量写入文件 Descriptors,而文件偏移量保持不变。
readv():从文件 Descriptors 读取到多个可写缓冲区。
truncate():截断与* path 对应的文件,以使其最大为 length *个字节。
waitid():await 一个或多个子进程完成。
writev():将* buffers 的内容写入文件 Descriptors,其中 buffers *是任意的缓冲区序列。
getgrouplist()(bpo-9344):返回指定用户所属的组 ID 的列表。
现在,某些平台支持lseek()函数的其他常量,例如
os.SEEK_HOLE
和os.SEEK_DATA
。新常量RTLD_LAZY,RTLD_NOW,RTLD_GLOBAL,RTLD_LOCAL,RTLD_NODELETE,RTLD_NOLOAD和RTLD_DEEPBIND在支持它们的平台上可用。它们用于sys.setdlopenflags()函数,并取代ctypes和
DLFCN
中定义的类似常量。 (由 Victor Stinner 在bpo-13226中贡献。)os.symlink()现在在非 Windows 平台上接受(并忽略)
target_is_directory
关键字参数,以简化跨平台支持。
pdb
现在,制表符完成Function不仅适用于命令名称,还适用于其参数。例如,对于break
命令,Function和文件名已完成。
(由 Georg Brandl 在bpo-14210中贡献)
pickle
pickle.Pickler对象现在具有可选的dispatch_table属性,从而可以设置每个腌渍者减少Function。
(由 Richard Oudkerk 在bpo-14166中贡献。)
pydoc
Tk GUI 和serve()
函数已从pydoc模块中删除:pydoc -g
和serve()
在 Python 3.2 中已弃用。
re
str正则表达式现在支持\u
和\U
转义。
(由 Serhiy Storchaka 在bpo-3665中贡献。)
sched
run()现在接受一个* blocking *参数,当设置为 false 时,该参数将使该方法执行计划的事件,因为该事件将很快过期(如果有),然后立即返回。如果要在非阻塞应用程序中使用scheduler,此Function很有用。 (由 GiampaoloRodolà在bpo-13449中贡献。)
现在可以在多线程环境中安全使用scheduler类。 (由bpo-8684中的 Josiah Carlson 和 GiampaoloRodolà贡献。)
scheduler类构造函数的* timefunc 和 delayfunct *参数现在是可选的,分别默认为time.time()和time.sleep()。 (由 Chris Clark 在bpo-13245中贡献。)
enter()和enterabs() * argument *参数现在是可选的。 (由 Chris Clark 在bpo-13245中贡献。)
enter()和enterabs()现在接受* kwargs *参数。 (由 Chris Clark 在bpo-13245中贡献。)
select
Solaris 和派生平台pass/dev/poll
为高性能异步套接字提供了新的类select.devpoll。 (由 JesúsCeaAvión 在bpo-6397中贡献。)
shlex
pipes模块中以前未记录的辅助函数quote
已移至shlex模块并已记录。 quote()正确地将字符串中的所有字符转义,否则 shell 可能会赋予它们特殊的含义。
shutil
New functions:
disk_usage():提供总计,已使用和可用的磁盘空间统计信息。 (由 GiampaoloRodolà在bpo-12442中贡献。)
chown():允许更改给定路径的用户和/或组,同时指定用户/组名,而不仅是其数字 ID。 (由 Sandro Tosi 在bpo-12191中贡献。)
shutil.get_terminal_size():返回解释器所连接的终端窗口的大小。 (由 ZbigniewJędrzejewski-Szmek 在bpo-13609中贡献。)
copy2()和copystat()现在在支持该文件的平台上以纳秒精度保留文件时间戳。它们还在 Linux 上保留文件“扩展属性”。 (由bpo-14127和bpo-15238中的 Larry Hastings 贡献。)
现在有几个函数带有一个可选的
symlinks
参数:当该参数为 true 时,不会取消对符号链接的引用,而是对符号链接本身进行操作(或创建一个,如果相关)。 (由 Hynek Schlawack 在bpo-12715中贡献。)将文件复制到其他文件系统时,move()现在以 posix
mv
命令的方式处理符号链接,重新创建符号链接而不是复制目标文件内容。 (由bpo-9993中的 Jonathan Niehof 提供。)move()现在还返回dst
参数作为其结果。rmtree()现在可以抵抗在os.open()和os.unlink()中支持新
dir_fd
参数的平台上的符号链接攻击。 (由 Marton vonLöwis 和 Hynek Schlawack 在bpo-4489中贡献。)
signal
signal模块具有新Function:
pthread_sigmask():获取和/或更改调用线程的 signal 掩码(由bpo-8407的 Jean-Paul Calderone 提供);
pthread_kill():向线程发送 signal;
sigpending():检查待处理Function;
sigwait():awaitsignal;
sigwaitinfo():awaitsignal,返回有关它的详细信息;
sigtimedwait():与sigwaitinfo()类似,但超时。
signal 处理程序将 signal 编号作为单字节而不是 nul 字节写入唤醒文件 Descriptors。因此,可以 await 多个 signal 并知道引发了哪些 signal。
signal.signal()和signal.siginterrupt()引发 OSError 而不是 RuntimeError:OSError 具有 errno 属性。
smtpd
smtpd模块现在支持 RFC 5321(扩展的 SMTP)和 RFC 1870(大小扩展)。根据标准,仅当 Client 端使用EHLO
命令启动会话时,才启用这些扩展。
(最初ELHO
由 Alberto Trevino 提供支持.JuhanaJauhiainen 进行了尺寸扩展.由 MicheleOrrù和 Dan Boswell 贡献的有关该补丁的大量额外工作.bpo-8739)
smtplib
SMTP,SMTP_SSL和LMTP类现在接受source_address
关键字参数,以指定(host, port)
在创建传出套接字时用作绑定调用中的源地址。 (由 Paulo Scardine 在bpo-11281中贡献。)
SMTP现在支持上下文 Management 协议,允许在with
语句中使用SMTP
实例。 (由 GiampaoloRodolà在bpo-11289中贡献。)
SMTP_SSL构造函数和starttls()方法现在接受 SSLContext 参数来控制安全通道的参数。 (由 Kasun Herath 在bpo-8809中贡献。)
socket
当基础平台支持时,socket类现在公开其他方法来处理辅助数据:
(由 David Watson 在bpo-6560中贡献,基于 Heiko Wundram 的早期补丁)
- socket类现在在 Linux(https://lwn.net/Articles/253425)上支持 PF_CAN 协议系列(https://en.wikipedia.org/wiki/Socketcan)。
(由 Matthias Fuchs 贡献,由 TiagoGonçalves 在bpo-10141中更新。)
socket类现在支持 PF_RDS 协议家族(https://en.wikipedia.org/wiki/Reliable_Datagram_Sockets和https://oss.oracle.com/projects/rds/)。
如果调用进程具有足够的特权,则新Functionsethostname()允许在 UNIX 系统上设置主机名。 (由 Ross Lagerwall 在bpo-10866中贡献。)
socketserver
BaseServer现在具有可重写方法service_actions(),该方法在服务循环中由serve_forever()方法调用。 ForkingMixIn现在使用它来清理僵尸子进程。 (由 Justin Warkentin 在bpo-11109中贡献。)
sqlite3
新的sqlite3.Connection方法set_trace_callback()可用于捕获由 sqlite 处理的所有 sql 命令的跟踪。 (由bpo-11688中的 Torsten Landschoff 提供。)
ssl
ssl模块具有两个新的随机生成函数:
RAND_bytes():生成加密强度高的伪随机字节。
- RAND_pseudo_bytes():生成伪随机字节。
(由 Victor Stinner 在bpo-12049中贡献。)
现在,ssl模块公开了更细粒度的异常层次结构,以便更轻松地检查各种错误。 (由bpo-11183中的 Antoine Pitrou 提供。)
load_cert_chain()现在接受如果私钥已加密的* password *参数。 (由bpo-12803中的 Adam Simpkins 贡献。)
现在,passload_dh_params()和set_ecdh_curve()方法支持基于常规和基于椭圆曲线的 Diffie-Hellman 密钥交换。 (由bpo-13626和bpo-13627中的 Antoine Pitrou 提供。)
SSL 套接字具有新的get_channel_binding()方法,该方法可以实现某些身份验证机制,例如 SCRAM-SHA-1-PLUS。 (由 Jacek Konieczny 在bpo-12551中贡献。)
由于其新的compression()方法,您可以查询 SSL 套接字使用的 SSL 压缩算法。新的属性OP_NO_COMPRESSION可用于禁用压缩。 (由bpo-13634中的 Antoine Pitrou 提供。)
已使用ssl.SSLContext.set_npn_protocols()方法添加了对“下一协议协商”扩展的支持。 (由 Colin Marc 在bpo-14204中贡献。)
现在,借助library和reason属性,可以更容易地自省 SSL 错误。 (由bpo-14837中的 Antoine Pitrou 提供。)
get_server_certificate()Function现在支持 IPv6. (由 Charles_FrançoisNatali 在bpo-11811中贡献。)
新属性OP_CIPHER_SERVER_PREFERENCE允许将 SSLv3 服务器套接字设置为使用服务器的密码排序首选项,而不是 Client 端(bpo-13635)。
stat
未记录的 tarfile.filemode 函数已移至stat.filemode()。它可以用来将文件的模式转换为'-rwxrwxrwx'形式的字符串。
(由 GiampaoloRodolà在bpo-14807中贡献。)
struct
struct模块现在分别pass新代码n
和N
支持ssize_t
和size_t
。 (由bpo-3163中的 Antoine Pitrou 提供。)
subprocess
现在,命令字符串可以是 posix 平台上的 bytes 对象。 (由 Victor Stinner 在bpo-8513中贡献。)
新的常量DEVNULL允许以平台无关的方式抑制输出。 (由 Ross Lagerwall 在bpo-5870中贡献。)
sys
sys模块具有一个新的thread_info named tuple,其中包含有关线程实现(bpo-11223)的信息。
tarfile
tarfile现在passlzma模块支持lzma
编码。 (由 LasGustäbel 在bpo-5689中贡献。)
tempfile
tempfile.SpooledTemporaryFile的truncate()
方法现在接受size
参数。 (由 Ryan Kelly 在bpo-9957中贡献。)
textwrap
textwrap模块具有一个新的indent(),可以很容易地在文本块(bpo-13857)中的选定行上添加公共前缀。
threading
threading.Condition,threading.Semaphore,threading.BoundedSemaphore,threading.Event和threading.Timer过去都是返回类实例的工厂函数,现在都是类,并且可以被子类化。 (由ÉricAraujo 在bpo-10968中贡献。)
threading.Thread构造函数现在接受daemon
关键字参数,以覆盖从父线程(bpo-6064)继承daemon
标志值的默认行为。
以前的私有Function_thread.get_ident
现在可以用作公共Functionthreading.get_ident()。这消除了几种直接访问 stdlib 中的_thread
模块的情况。同样,应将使用_thread.get_ident
的第三方代码更改为使用新的公共接口。
time
get_clock_info():获取时钟信息。
monotonic():单调时钟(不能向后移动),不受系统时钟更新的影响。
perf_counter():具有最高可用分辨率的性能计数器,可测量较短的持续时间。
process_time():当前进程的系统总数和用户 CPU 时间。
其他新Function:
- 具有
CLOCK_xxx
个常量的clock_getres(),clock_gettime()和clock_settime()函数。 (由 Victor Stinner 在bpo-10278中贡献。)
为了提高跨平台的一致性,现在pass负睡眠值时sleep()会提高ValueError。以前,这是 posix 上的错误,但在 Windows 上产生了无限的睡眠。
types
添加一个新的types.MappingProxyType类:Map 的只读代理。 (bpo-14386)
新Functiontypes.new_class()和types.prepare_class()为 PEP 3115兼容的动态类型创建提供支持。 (bpo-14588)
unittest
assertRaises(),assertRaisesRegex(),assertWarns()和assertWarnsRegex()现在用作上下文 Management 器时接受关键字参数* msg *。 (由 Ezio Melotti 和 Winston Ewert 在bpo-10775中贡献。)
unittest.TestCase.run()现在返回TestResult对象。
urllib
Request类现在接受get_method()使用的* method *参数来确定应使用哪种 HTTP 方法。例如,这将发送一个'HEAD'
请求:
>>> urlopen(Request('https://www.python.org', method='HEAD'))
webbrowser
webbrowser模块支持更多的“浏览器”:Google Chrome(根据版本和 os 的名称,分别为 chrome,chrome,chrome 浏览器或 chrome 浏览器),以及通用启动程序 xdg-open ,来自 FreeDesktop.org 项目,以及 gvfs-open ,这是 GNOME 3 的默认 URI 处理程序。(前者由 Arnaud Calmettes 在bpo-13620中贡献,后者由bpo-14493中的 Matthias Klose。)
xml.etree.ElementTree
xml.etree.ElementTree模块现在默认情况下导入其 C 加速器;不再需要显式导入xml.etree.cElementTree
(此模块保留为向后兼容,但现在已弃用)。此外,Element的iter
方法系列已得到优化(用 C 重写)。pass添加示例和更详细的参考,该模块的文档也得到了极大的改进。
zlib
新的属性zlib.Decompress.eof可以区分格式正确的压缩流和不完整或截断的压缩流。 (由 Nadeem Vawda 在bpo-12646中贡献。)
新属性zlib.ZLIB_RUNTIME_VERSION报告运行时加载的基础zlib
库的版本字符串。 (由 Torsten Landschoff 在bpo-12306中贡献。)
Optimizations
主要性能增强已添加:
感谢 PEP 393,对 Unicode 字符串的一些操作已得到优化:
内存占用量除以 2 到 4 取决于文本
将 ASCII 字符串编码为 UTF-8 不再需要对字符进行编码,UTF-8 表示与 ASCII 表示共享
UTF-8 编码器已经过优化
重复单个 ASCII 字母并获得 ASCII 字符串的子字符串快 4 倍
UTF-8 现在快了 2 到 4 倍。现在,UTF-16 编码的速度提高了 10 倍。
(由 Serhiy Storchaka,bpo-14624,bpo-14738和bpo-15026贡献。)
Build 和 C API 的更改
对 Python 的构建过程和 C API 的更改包括:
新的 PEP 3118相关Function:
PEP 393添加了新的 Unicode 类型,宏和函数:
High-level API:
PyArg_ParseTuple现在接受
c
格式(bpo-12380)的_。
Deprecated
不支持的 os
由于缺少维护程序,因此不再支持 OS/2 和 VMS。
由于维护负担,不再支持将COMSPEC
设置为command.com
的 Windows 2000 和 Windows 平台。
OSF 支持(在 3.2 中已弃用)已被完全删除。
不推荐使用的 Python 模块,函数和方法
不建议将非空字符串传递给
object.__format__()
,并且在 Python 3.4(bpo-9856)中将产生TypeError。unicode_internal
编解码器由于 PEP 393而已被弃用,请使用 UTF-8,UTF-16(utf-16-le
或utf-16-be
)或 UTF-32(utf-32-le
或utf-32-be
)platform.popen()
:使用subprocess模块。特别检查用子流程模块替换旧Function部分(bpo-11377)。bpo-13374:os模块中已弃用 Windows 字节 API。使用 Unicode 文件名而不是字节文件名不再依赖于 ANSI 代码页并支持任何文件名。
bpo-13988:
xml.etree.cElementTree
模块已弃用。可用时会自动使用加速器。time.clock()
的行为取决于平台:请使用新的time.perf_counter()或time.process_time()函数,具体取决于您的要求,以使行为明确。os.stat_float_times()
函数已弃用。abc module:
abc.abstractproperty已被弃用,而将property与abc.abstractmethod()结合使用。
importlib package:
现在不推荐使用importlib.abc.SourceLoader.path_mtime(),而推荐使用importlib.abc.SourceLoader.path_stats(),因为字节码文件现在存储了修改时间和编译字节码文件的源文件的大小。
C API 弃用的Function和类型
Py_UNICODE已被 PEP 393弃用,并将在 Python 4 中删除。使用此类型的所有函数均已弃用:
使用Py_UNICODE和Py_UNICODE*类型的 Unicode 函数和方法:
PyUnicode_FromUnicode:使用PyUnicode_FromWideChar()或PyUnicode_FromKindAndData()
PyUnicode_AS_UNICODE,PyUnicode_AsUnicode(),PyUnicode_AsUnicodeAndSize():使用PyUnicode_AsWideCharString()
PyUnicode_AS_DATA:将PyUnicode_DATA与PyUnicode_READ和PyUnicode_WRITE一起使用
PyUnicode_GET_SIZE,PyUnicode_GetSize():使用PyUnicode_GET_LENGTH或PyUnicode_GetLength()
PyUnicode_GET_DATA_SIZE:使用
PyUnicode_GET_LENGTH(str) * PyUnicode_KIND(str)
(仅适用于准备好的字符串)PyUnicode_AsUnicodeCopy():使用PyUnicode_AsUCS4Copy()或PyUnicode_AsWideCharString()
PyUnicode_GetMax()
操作 Py_UNICODE *字符串的函数和宏:
Py_UNICODE_strlen
:使用PyUnicode_GetLength()或PyUnicode_GET_LENGTHPy_UNICODE_strcat
:使用PyUnicode_CopyCharacters()或PyUnicode_FromFormat()Py_UNICODE_strcpy
,Py_UNICODE_strncpy
,Py_UNICODE_COPY
:使用PyUnicode_CopyCharacters()或PyUnicode_Substring()Py_UNICODE_strcmp
:使用PyUnicode_Compare()Py_UNICODE_strncmp
:使用PyUnicode_Tailmatch()Py_UNICODE_strchr
,Py_UNICODE_strrchr
:使用PyUnicode_FindChar()Py_UNICODE_FILL
:使用PyUnicode_Fill()Py_UNICODE_MATCH
Encoders:
PyUnicode_Encode():使用
PyUnicode_AsEncodedObject()
PyUnicode_EncodeUTF8():使用PyUnicode_AsUTF8()或PyUnicode_AsUTF8String()
PyUnicode_EncodeUnicodeEscape:()
使用PyUnicode_AsUnicodeEscapeString()PyUnicode_EncodeRawUnicodeEscape:()
使用PyUnicode_AsRawUnicodeEscapeString()PyUnicode_EncodeMBCS():使用PyUnicode_AsMBCSString()或PyUnicode_EncodeCodePage()(带有
CP_ACP
code_page)PyUnicode_EncodeDecimal()
, PyUnicode_TransformDecimalToASCII()
Deprecated features
现在已弃用array模块的'u'
格式代码,并将在 Python 4 中将其与其他(Py_UNICODE)API 一起删除。
移植到 Python 3.3
本节列出了先前描述的更改以及可能需要对代码进行更改的其他错误修正。
移植 Python 代码
默认情况下启用哈希随机化。将 PYTHONHASHSEED环境变量设置为
0
以禁用哈希随机化。另请参见object.hash()方法。bpo-12326:在 Linux 上,sys.platform 不再包含主要版本。现在,它始终是“ linux”,而不是“ linux2”或“ linux3”,具体取决于用于构建 Python 的 Linux 版本。将 sys.platform =='linux2'替换为 sys.platform.startswith('linux'),或者,如果不需要支持旧版本的 Python,则直接替换为 sys.platform =='linux'。
现在,如果时间戳超出范围,则将引发bpo-13847,bpo-14180:time和datetime:OverflowError而不是ValueError。现在,如果 C 函数
gmtime()
或localtime()
失败,则引发OSError。导入使用的默认查找器现在利用特定目录中包含的内容的缓存。如果创建 Python 源文件或无源字节码文件,请确保调用importlib.invalidate_caches()清除缓存,以使查找者可以注意到新文件。
ImportError现在使用try导入的模块的全名。检查 ImportErrors 消息的文档测试将需要更新以使用模块的全名,而不仅仅是名称的结尾。
import()的* index *参数现在默认为 0 而不是-1,并且不再支持负值。实施 PEP 328时的疏忽是默认值保持为-1.如果您需要 continue 执行相对导入,然后再执行绝对导入,则使用索引 1 执行相对导入,然后使用索引 0 执行另一个导入。不过,最好使用importlib.import_module()而不是调用import()直接。
import()不再允许顶级模块使用 0 以外的索引值。例如。
__import__('sys', level=1)
现在是一个错误。由于默认情况下sys.meta_path和sys.path_hooks现在都有查找器,因此您很可能希望使用
list.insert()
而不是list.append()
添加到这些列表中。因为
None
现在已插入sys.path_importer_cache,所以如果要清除路径字典中没有查找器的条目,则需要删除与None
和 imp.NullImporter值配对的键,以便向后兼容。这将导致将None
重新插入sys.path_importer_cache的较旧版本的 Python 产生额外的开销,在该版本中None
表示使用隐式查找器,但在语义上不应更改任何内容。importlib.abc.Finder不再指定必须实现的 find_module()抽象方法。如果要依靠子类来实现该方法,请确保首先检查该方法的存在。但是,在使用路径条目查找器的情况下,您可能需要先检查 find_loader()。
pkgutil已在内部转换为使用importlib。这消除了 PEP 302导入仿真的旧行为未能与实际导入系统的行为匹配的许多极端情况。导入仿真本身仍然存在,但现在已弃用。 pkgutil.iter_importers()和pkgutil.walk_packages()函数是标准导入钩子的特殊情况,因此即使它们不提供非标准的
iter_modules()
方法,它们仍然受支持。由email.header.decode_header()进行的解析中长期存在的 RFC 兼容错误(bpo-1079)已得到修复。使用标准习惯用法将编码的 Headers 转换为 unicode(
str(make_header(decode_header(h))
)的代码将保持不变,但是查看由 DEFAULT_header 返回的单个 Tuples 的代码将看到ASCII
节中包含在ASCII
节之前或之后的空格。使用make_header
构建头文件的代码也应 continue 工作而不作任何更改,因为make_header
会 continue 在ASCII
和非ASCII
部分之间添加空格(如果 Importing 字符串中尚不存在空格)。当传递非
ASCII
显示名称时,email.utils.formataddr()现在进行正确的内容传输编码。任何依赖于先前在格式输出字符串中保留非ASCII
unicode 的错误行为的代码都需要更改(bpo-1690608)。poplib.POP3.quit()现在可能会像其他所有
poplib
方法一样引发协议错误。如果特定应用程序(bpo-11291)遇到quit
的错误,则可能需要更改假定quit
不会引发poplib.error_proto错误的代码。自 python 2.4 起已弃用的email.parser.Parser的
strict
参数finally被删除。不建议使用的方法
unittest.TestCase.assertSameElements
已被删除。弃用的变量
time.accept2dyear
已被删除。已弃用的
Context._clamp
属性已从decimal模块中删除。之前已由公共属性clamp
代替。 (请参阅bpo-8540。)未记录的内部帮助程序类
SSLFakeFile
已从smtplib中删除,因为socket.socket.makefile()长期以来一直提供其Function。现在在 Windows 上将负值传递给time.sleep()会引发错误,而不是永远休眠。它总是在 posix 上引发错误。
ast.__version__
常量已删除。如果您需要制定受 AST 版本影响的决策,请使用sys.version_info做出决策。用于解决threading模块pass私有类的子类使用工厂Function这一事实的代码将需要更改为现在公开的类的子类。
删除了线程模块中未记录的调试机制,从而简化了代码。这应该对生产代码没有任何影响,但是在这里有提及,以防任何应用程序调试框架与之交互(bpo-13550)。
移植 C 代码
- 在更改缓冲区 API 的过程中,Py_buffer结构的未记录的
smalltable
成员已被删除,并且PyMemoryViewObject
的布局已更改。
依赖于memoryobject.h
或object.h
中相关部分的所有扩展都必须重建。
- 由于PEP 393,不推荐使用Py_UNICODE类型和使用该类型的所有Function(但至少可以使用五年)。如果您使用低级 Unicode API 来构造和访问 unicode 对象,并且想从 PEP 393提供的内存占用减少中受益,则必须将代码转换为新的Unicode API。
但是,如果只使用了PyUnicode_Concat(),PyUnicode_Join()或PyUnicode_FromFormat()等高级Function,则代码将自动利用新的 unicode 表示形式。
PyImport_GetMagicNumber()现在会在失败后返回
-1
。由于import()的* level 参数的负值不再有效,因此PyImport_ImportModuleLevel()也是如此。这也意味着PyImport_ImportModuleEx()使用的 level *的值现在是
0
而不是-1
。
Building C 扩展
- Cextensions 的可能文件名范围已缩小。很少使用的拼写已被禁止:在 POSIX 下,不再将名为
xxxmodule.so
,xxxmodule.abi3.so
和xxxmodule.cpython-*.so
的文件识别为实现xxx
模块。如果您一直在生成此类文件,则必须切换到其他拼写(即,从文件名中删除module
字符串)。
(在bpo-14040中实现。)
命令行开关更改
- -Q 命令行标志和相关工件已被除去。代码检查 sys.flags.division_warning 将需要更新。
(bpo-10998,由ÉricAraujo 提供。)
- 当 python 以-S开头时,
import site
将不再将特定于站点的路径添加到模块搜索路径。在以前的版本中,确实如此。
(bpo-11591,由卡尔·梅耶(Carl Meyer)贡献,埃里克·阿劳霍(ÉricAraujo)发行。)