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:

新的库模块:

新的内置Function:

Implementation improvements:

显着改进的库模块:

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+0000U+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()函数仍返回0xFFFF0x10FFFF以实现向后兼容性,并且不应与新的 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 错误引发的异常的层次结构现在已得到简化和细化。

您不必担心在OSErrorIOErrorEnvironmentErrorWindowsErrormmap.errorsocket.errorselect.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]

推动这一变化的主要原理是,即使设计成与sendthrow方法一起使用的生成器也可以轻松拆分为多个子生成器,就像单个大型函数可以拆分为多个子函数一样容易。

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.Signatureinspect.Parameterinspect.BoundArguments包含有关调用签名的信息,例如 Comments,默认值,参数种类和绑定的参数,这大大简化了编写修饰符以及验证或修改调用签名或参数的任何代码。

See also

  • PEP 362:-函数签名对象

  • 由 Brett Cannon,Yury Selivanov,Larry Hastings,Jiwon Seo 撰写的 PEP;由 Yury Selivanov 实施。

PEP 421:添加系统实现

sys模块上的新属性公开了特定于当前运行的解释器的实现的详细信息。 sys.implementation上的初始属性集是nameversionhexversioncache_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.MetaPathFinderimportlib.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现在具有namepath属性,可以在提供相关数据时进行设置。导入失败的消息现在还将提供模块的全名,而不仅仅是模块名称的尾端。

importlib.invalidate_caches()函数现在将在sys.path_importer_cache中缓存的所有查找器上以相同的名称调用该方法,以根据需要帮助清除任何存储的状态。

Visible Changes

有关可能需要的代码更改,请参见移植 Python 代码部分。

除了importlib现在公开的内容之外,还有其他可见的更改要导入。最大的是sys.meta_pathsys.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 语言进行的一些较小更改是:

(由 Ezio Melotti 在bpo-12753中贡献。)

  • Unicode 数据库已更新为 UCD 版本 6.1.0

  • 现在,对range()个对象的相等比较返回的结果反映了这些范围对象生成的基础序列的相等性。 (bpo-13201)

  • bytesbytearray对象的count()find()rfind()index()rindex()方法现在接受 0 到 255 之间的整数作为它们的第一个参数。

(由 Petri Lehtinen 在bpo-12170中贡献。)

(由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()SIGSEGVSIGFPESIGABRTSIGBUSSIGILLsignal 安装故障处理程序。您也可以在启动时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

(由bpo-11610中的 Darren Dale 贡献。)

abc.ABCMeta.register()现在返回已注册的子类,这意味着它现在可用作类装饰器(bpo-10868)。

array

array模块使用qQ类型代码支持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.BZ2Filebz2.decompress()现在可以解压缩多流 Importing(例如 pbzip2 工具产生的 Importing)。 bz2.BZ2File现在还可以使用'a'(附加)模式来创建这种类型的文件。

(由 Nir Aides 在bpo-1625中贡献。)

codecs

mbcs编解码器已被重写,可以在所有 Windows 版本上正确处理replaceignore错误处理程序。现在,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

(bpo-12016)

增量 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 版本。

(bpo-12100)

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模块中的对象)。

(bpo-13585)

crypt

crypt模块中增加了 salt 和模块化加密格式(散列方法)和mksalt()函数。

(bpo-10924)

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

decimal

  • bpo-7652-集成快速本机十进制算法。

    • Stefan Krah 编写的 C 模块和 libmpdec。

十进制模块的新 C 版本集成了高速 libmpdec 库,用于任意精度的正确舍入十进制浮点运算。 libmpdec 符合 IBM 的通用十进制算术规范。

性能提升的范围从数据库应用程序的 10 倍到数字密集型应用程序的 100 倍。这些数字是十进制浮点算术中使用的标准精度的预期增益。由于精度是用户可配置的,因此准确数字可能会有所不同。例如,在整数 bignum 算术中,差异可能会更高。

下表仅供参考。基准可在http://www.bytereef.org/mpdecimal/quickstart.html获得。

Note

decimal.py_decimalspeedup
pi42.02s0.345s120x
telco172.19s5.68s30x
psycopg3.57s0.29s12x

Features

  • FloatOperationsignal 可以选择启用更严格的语义来混合浮点数和小数。

  • 如果 Python 是在没有线程的情况下编译的,则 C 版本会自动禁用昂贵的线程本地上下文机制。在这种情况下,变量HAVE_THREADS设置为False

API changes

  • 根据计算机体系结构,C 模块具有以下上下文限制:

Note

32-bit64-bit
MAX_PREC425000000999999999999999999
MAX_EMAX425000000999999999999999999
MIN_EMIN-425000000-999999999999999999
  • 在上下文模板(DefaultContextBasicContextExtendedContext)中,EmaxEmin的大小已更改为999999

  • decimal.py 中的Decimal构造函数不遵守上下文限制,而是精确转换具有任意指数或精度的值。由于 C 版本具有内部限制,因此使用以下方案:如果可能,将精确地转换值,否则将引发InvalidOperation且结果为 NaN。在后一种情况下,始终可以使用create_decimal()以获得舍入或不精确的值。

  • 十进制.py 中的幂函数始终正确舍入。在 C 版本中,它是根据正确舍入的exp()ln()函数定义的,但finally结果只是“几乎总是正确舍入”。

  • 在 C 版本中,包含 signal 的上下 Literals 典是MutableMapping。出于速度原因,flagstraps始终引用与初始化上下文相同的MutableMapping。如果分配了新的 signal 字典,则使用新值更新flagstraps,但它们未引用 RHS 字典。

  • 腌制Context会产生不同的输出,以便具有适用于 Python 和 C 版本的通用交换格式。

  • Context构造函数中的参数 Sequences 已更改为与repr()显示的 Sequences 匹配。

  • quantize()方法中的watchexp参数已弃用。

email

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_lengthMessage序列化时,各个行可能具有的最大长度(不包括 lineep 字符)。默认为 78.
linesepMessage序列化时用于分隔各行的字符。默认为\n
cte_type7bit8bit8bit仅适用于Bytes generator,表示在协议允许的地方(或原始 Importing 中存在的地方)可以使用非 ASCII。
raise_on_defect当遇到缺陷而不是将它们添加到Message对象的defects列表中时,导致parser引发错误。

使用策略对象的clone()方法创建具有新设置的新策略实例。 clone将以上任何控件用作关键字参数。调用中未指定的任何控件均保留其默认值。因此,您可以创建一个使用\r\n个 lineep 字符的策略,如下所示:

mypolicy = compat32.clone(linesep='\r\n')

策略可用于简化应用程序所需格式的消息生成。当您设置parserMessage所使用的策略时,无论您使用哪种程序创建Message对象,都不必一次在调用generator的所有位置都指定linesep='\r\n'。另一方面,如果需要生成多种形式的消息,则仍可以在适当的generator调用中指定参数。或者,您可以针对不同情况创建自定义策略实例,并在创建generator时将其传递给。

带有新标题 API 的临时策略

虽然策略框架本身值得一提,但引入该框架的主要动机是允许创建新策略,这些新策略为电子邮件包实现新Function,从而为那些不使用新策略的人保持向后兼容性。由于新 Policy 引入了新的 API,因此我们将它们作为provisional policy在 Python 3.3 中发布。如果核心开发人员认为必要,则可能会发生向后不兼容的更改(直到并包括删除代码)。

新策略是EmailPolicy的实例,并添加以下其他控件:

Note

refold_source控制由parser解析的 Headers 是否由generator折叠。可以是nonelongall。默认值为long,这意味着将重新折叠行长于max_line_length的源 Headers。 none表示没有行被折叠,all表示所有行都被折叠。
header_factory具有namevalue并生成自定义 Headers 对象的可调用对象。

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>'

解析消息时,可以使用标题对象的addressesgroups属性来访问组和单个地址:

>>> 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

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-15114bpo-14538bpo-13993bpo-13960bpo-13358bpo-1745761bpo-755670bpo-13357bpo-12629bpo-1200313bpo-670664bpo-13273bpo-12888bpo-7311中贡献。)

已将新的html5字典将 HTML5 命名字符引用 Map 到等效的 Unicode 字符(例如html5['gt;'] == '>'),已添加到html.entities模块。 HTMLParser现在也使用该字典。 (由 Ezio Melotti 在bpo-11113bpo-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_CLOEXECO_NONBLOCK标志的管道。这对于避免多线程程序中的竞争条件特别有用。

  • os模块具有新的sendfile()Function,该Function提供了一种有效的“零复制”方式,可将数据从一个文件(或套接字)Descriptors 复制到另一个文件。短语“零复制”是指以下事实:两个 Descriptors 之间的所有数据复制完全由内核完成,而没有将数据复制到用户空间缓冲区中。 sendfile()可用于有效地将数据从磁盘上的文件复制到网络套接字,例如用于下载文件。

(Ross Lagerwall 和 GiampaoloRodolà在bpo-10882提交的补丁。)

(由 GiampaoloRodolà在bpo-10784提交的补丁。)

pdb

现在,制表符完成Function不仅适用于命令名称,还适用于其参数。例如,对于break命令,Function和文件名已完成。

(由 Georg Brandl 在bpo-14210中贡献)

pickle

pickle.Pickler对象现在具有可选的dispatch_table属性,从而可以设置每个腌渍者减少Function。

(由 Richard Oudkerk 在bpo-14166中贡献。)

pydoc

Tk GUI 和serve()函数已从pydoc模块中删除:pydoc -gserve()在 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-14127bpo-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

smtpd

smtpd模块现在支持 RFC 5321(扩展的 SMTP)和 RFC 1870(大小扩展)。根据标准,仅当 Client 端使用EHLO命令启动会话时,才启用这些扩展。

(最初ELHO由 Alberto Trevino 提供支持.JuhanaJauhiainen 进行了尺寸扩展.由 MicheleOrrù和 Dan Boswell 贡献的有关该补丁的大量额外工作.bpo-8739)

smtplib

SMTPSMTP_SSLLMTP类现在接受source_address关键字参数,以指定(host, port)在创建传出套接字时用作绑定调用中的源地址。 (由 Paulo Scardine 在bpo-11281中贡献。)

SMTP现在支持上下文 Management 协议,允许在with语句中使用SMTP实例。 (由 GiampaoloRodolà在bpo-11289中贡献。)

SMTP_SSL构造函数和starttls()方法现在接受 SSLContext 参数来控制安全通道的参数。 (由 Kasun Herath 在bpo-8809中贡献。)

socket

(由 David Watson 在bpo-6560中贡献,基于 Heiko Wundram 的早期补丁)

(由 Matthias Fuchs 贡献,由 TiagoGonçalves 在bpo-10141中更新。)

socketserver

BaseServer现在具有可重写方法service_actions(),该方法在服务循环中由serve_forever()方法调用。 ForkingMixIn现在使用它来清理僵尸子进程。 (由 Justin Warkentin 在bpo-11109中贡献。)

sqlite3

新的sqlite3.Connection方法set_trace_callback()可用于捕获由 sqlite 处理的所有 sql 命令的跟踪。 (由bpo-11688中的 Torsten Landschoff 提供。)

ssl

(由 Victor Stinner 在bpo-12049中贡献。)

stat

未记录的 tarfile.filemode 函数已移至stat.filemode()。它可以用来将文件的模式转换为'-rwxrwxrwx'形式的字符串。

(由 GiampaoloRodolà在bpo-14807中贡献。)

struct

struct模块现在分别pass新代码nN支持ssize_tsize_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.SpooledTemporaryFiletruncate()方法现在接受size参数。 (由 Ryan Kelly 在bpo-9957中贡献。)

textwrap

textwrap模块具有一个新的indent(),可以很容易地在文本块(bpo-13857)中的选定行上添加公共前缀。

threading

threading.Conditionthreading.Semaphorethreading.BoundedSemaphorethreading.Eventthreading.Timer过去都是返回类实例的工厂函数,现在都是类,并且可以被子类化。 (由ÉricAraujo 在bpo-10968中贡献。)

threading.Thread构造函数现在接受daemon关键字参数,以覆盖从父线程(bpo-6064)继承daemon标志值的默认行为。

以前的私有Function_thread.get_ident现在可以用作公共Functionthreading.get_ident()。这消除了几种直接访问 stdlib 中的_thread模块的情况。同样,应将使用_thread.get_ident的第三方代码更改为使用新的公共接口。

time

PEP 418time模块添加了新Function:

  • get_clock_info():获取时钟信息。

  • monotonic():单调时钟(不能向后移动),不受系统时钟更新的影响。

  • perf_counter():具有最高可用分辨率的性能计数器,可测量较短的持续时间。

  • process_time():当前进程的系统总数和用户 CPU 时间。

其他新Function:

为了提高跨平台的一致性,现在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'))

(bpo-1673007)

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(此模块保留为向后兼容,但现在已弃用)。此外,Elementiter方法系列已得到优化(用 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-14624bpo-14738bpo-15026贡献。)

Build 和 C API 的更改

对 Python 的构建过程和 C API 的更改包括:

Deprecated

不支持的 os

由于缺少维护程序,因此不再支持 OS/2 和 VMS。

由于维护负担,不再支持将COMSPEC设置为command.com的 Windows 2000 和 Windows 平台。

OSF 支持(在 3.2 中已弃用)已被完全删除。

不推荐使用的 Python 模块,函数和方法

C API 弃用的Function和类型

Py_UNICODE已被 PEP 393弃用,并将在 Python 4 中删除。使用此类型的所有函数均已弃用:

使用Py_UNICODEPy_UNICODE*类型的 Unicode 函数和方法:

操作 Py_UNICODE *字符串的函数和宏:

Encoders:

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-13847bpo-14180timedatetimeOverflowError而不是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_pathsys.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.Parserstrict参数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.hobject.h中相关部分的所有扩展都必须重建。

  • 由于PEP 393,不推荐使用Py_UNICODE类型和使用该类型的所有Function(但至少可以使用五年)。如果您使用低级 Unicode API 来构造和访问 unicode 对象,并且想从 PEP 393提供的内存占用减少中受益,则必须将代码转换为新的Unicode API

但是,如果只使用了PyUnicode_Concat()PyUnicode_Join()PyUnicode_FromFormat()等高级Function,则代码将自动利用新的 unicode 表示形式。

Building C 扩展

  • Cextensions 的可能文件名范围已缩小。很少使用的拼写已被禁止:在 POSIX 下,不再将名为xxxmodule.soxxxmodule.abi3.soxxxmodule.cpython-*.so的文件识别为实现xxx模块。如果您一直在生成此类文件,则必须切换到其他拼写(即,从文件名中删除module字符串)。

(在bpo-14040中实现。)

命令行开关更改

  • -Q 命令行标志和相关工件已被除去。代码检查 sys.flags.division_warning 将需要更新。

(bpo-10998,由ÉricAraujo 提供。)

  • python-S开头时,import site将不再将特定于站点的路径添加到模块搜索路径。在以前的版本中,确实如此。

(bpo-11591,由卡尔·梅耶(Carl Meyer)贡献,埃里克·阿劳霍(ÉricAraujo)发行。)