What’s New In Python 3.3

本文解释了Python 3.3中与3.2相比的新特性。Python 3.3于2012年9月29日发布。有关详细信息,请参阅changelog

也可以看看

PEP 398 - Python 3.3发布计划

Summary – Release highlights

新的语法特性:

新库模块:

新内建功能:

实施改进:

显着改进库模块:

安全改进:

  • 默认情况下打开哈希随机化。

请仔细阅读用户面临的更改的完整列表。

PEP 405: Virtual Environments

虚拟环境有助于创建单独的Python设置,同时共享系统级基本安装,以便于维护。虚拟环境具有它们自己的私有站点包(即,本地安装的库),并且可选地与系统范围的站点包隔离。它们的概念和实现受到受欢迎的virtualenv第三方软件包的启发,但受益于与解释器核心的更紧密集成。

此PEP添加了用于编程访问的venv模块和用于命令行访问和管理的pyvenv脚本。Python解释器检查pyvenv.cfg文件,它的存在表示虚拟环境目录树的基础。

也可以看看

PEP 405 - Python虚拟环境
PEP由Carl Meyer编写;由Carl Meyer和Vinay Sajip执行

PEP 420: Implicit Namespace Packages

本地支持不需要__init__.py标记文件的软件包目录,并且可以自动跨越多个路径段(受到各种第三方方法的命名空间包的启发,如 PEP 420

也可以看看

PEP 420 - 隐式命名空间包
PEP由Eric V. Smith编写;由Eric V. Smith和Barry Warsaw执行

PEP 3118: New memoryview implementation and buffer protocol documentation

PEP 3118的实施已得到显着改进。

新的memoryview实现全面修复了Py_buffer结构中动态分配的字段的所有所有权和生命周期问题,导致多个崩溃报告。此外,几个函数崩溃或返回不连续或多维输入的不正确结果已修复。

memoryview对象现在有一个符合PEP-3118的getbufferproc(),它检查用户的请求类型。添加了许多新功能,其中大多数功能完全通用于非连续数组和具有子操作数组的数组。

文件已更新,清楚地说明了出口商和消费者的责任。缓冲区请求标志分为基本标志和复合标志。解释了非连续和多维NumPy式数组的内存布局。

Features

  • 现在支持struct模块语法中的所有本地单字符格式说明符(可选择以“@”开头)。
  • 有了一些限制,cast()方法允许更改C连续数组的格式和形状。
  • 任何数组类型都支持多维列表表示。
  • 任何数组类型都支持多维比较。
  • 具有格式B,b或c的哈希(只读)类型的一维存储器视图现在是可哈希的。(提供者:Antoine Pitrou在issue 13411。)
  • 支持任意1-D阵列类型的任意切片。例如,现在可以通过使用负步骤来反转O(1)中的存储器视图。

API changes

  • 正式限制尺寸的最大数量为64个。
  • 空形状,大步和subboffets的表示现在是一个空元组,而不是无。
  • 访问具有格式“B”(无符号字节)的memoryview元素现在返回一个整数(根据struct模块语法)。为了返回一个字节对象,视图必须首先转换为'c'。
  • memoryview比较现在使用操作数的逻辑结构,并按值比较所有数组元素。支持struct模块语法中的所有格式字符串。仍然允许使用无法识别的格式字符串的视图,但始终比较为不等号,而不考虑视图内容。
  • 有关进一步更改,请参阅Build和C API更改移植C代码

(由Stefan Krah在issue 10181中提供。)

也可以看看

PEP 3118 - 修订缓冲区协议

PEP 393: Flexible String Representation

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)。窄和宽构建之间的区别不再存在,Python现在表现得像一个宽泛的构建,即使在Windows下。
  • 随着狭窄建筑的死亡,狭窄建筑特有的问题也已经固定,例如:
    • len()现在对于非BMP字符始终返回1,因此len('\ U0010FFFF') == 1 t>>
    • 代理对不在字符串字面值中重组,因此'\ uDBFF \ uDFFF' != '\ U0010FFFF' t0 >;
    • 索引或切片非BMP字符返回预期值,因此'\U0010FFFF'[0]现在返回'\U0010FFFF',而不是'\uDBFF'
    • 标准库中的所有其他功能现在可以正确处理非BMP代码点。
  • sys.maxunicode的值现在始终为1114111(十六进制的0x10FFFF)。The PyUnicode_GetMax() function still returns either 0xFFFF or 0x10FFFF for backward compatibility, and it should not be used with the new Unicode API (see issue 13054).
  • 已删除./configure标志--with-wide-unicode

Performance and resource usage

Unicode字符串的存储现在取决于字符串中的最高代码点:

  • 纯ASCII和Latin1字符串(U+0000-U+00FF)每个代码点使用1个字节;
  • BMP字符串(U+0000-U+FFFF)每个代码点使用2个字节;
  • 非BMP字符串(U+10000-U+10FFFF)每个代码点使用4个字节。

净效果是,对于大多数应用程序,字符串存储器的内存使用将显着减少 - 尤其是与以前的大型unicode构建相比 - 在许多情况下,字符串将是纯ASCII,即使在国际上下文(因为许多字符串存储非人类语言数据,例如XML片段,HTTP头部,JSON编码数据等)。我们还希望,由于同样的原因,它将提高非缓存应用程序的CPU缓存效率。Python 3.3的内存使用量比Python 3.2小两到三倍,在Django基准测试中稍微好于Python 2.7(详情请参阅PEP)。

也可以看看

PEP 393 - 灵活字符串表示
PEP由Martin vonLöwis编写;由Torsten Becker和Martin vonLöwis执行。

PEP 397: Python Launcher for Windows

Python 3.3 Windows安装程序现在包括一个py启动器应用程序,可用于以独立于版本的方式启动Python应用程序。

双击*.py文件时,将隐式调用此启动器。如果系统上只安装了一个Python版本,那么该版本将用于运行文件。如果安装了多个版本,则默认使用最新版本,但是可以通过在Python脚本中包含Unix样式的“shebang行”来覆盖此版本。

启动器也可以从命令行显式地用作py应用程序。运行py遵循与隐式启动脚本相同的版本选择规则,但可以通过传递适当的参数(例如-3来选择更具体的版本来请求Python 3 2,或者安装更新版本时,-2.6特别要求更早的Python版本)。

除了启动程序,Windows安装程序现在包括一个选项,将新安装的Python添加到系统PATH。(由Brian Curtin在issue 3561中提供。)

也可以看看

PEP 397 - 适用于Windows的Python启动器
PEP由Mark Hammond和Martin v。Löwis编写;由Vinay Sajip执行。

Launcher说明文件:Python Launcher for Windows

安装程序PATH修改:Finding the Python executable

PEP 3151: Reworking the OS and IO exception hierarchy

由操作系统错误引发的异常的层次结构现在都被简化和更细粒度。

您不必再担心在OSErrorIOErrorEnvironmentErrorWindowsErrormmap.errorsocket.errorselect.error所有这些异常类型现在只有一个:OSError出于兼容性原因,其他名称保留为别名。

此外,现在更容易捕获特定的错误条件。而不是检查errno模块中特定常量的errno属性(或args[0]),您可以捕获足够的OSError子类。可用的子类如下:

ConnectionError本身有更细粒度的子类:

由于新的异常,现在可以避免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")

也可以看看

PEP 3151 - 重做操作系统和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允许子生成器直接从调用范围接收发送和抛出的值,外生成器:

>>> 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方法一起使用的生成器被分割成多个子生成器,功能可以分为多个子功能。

也可以看看

PEP 380 - 用于委派给子生成器的语法
PEP由Greg Ewing编写;由Greg Ewing执行,由Renaud Blanch,Ryan Kelly和Nick Coghlan整合成3.3;文档由ZbigniewJędrzejewski-Szmek和尼克Coghlan

PEP 409: Suppressing exception context

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

如果没有 后缀来抑制原因,默认情况下将显示原始异常:

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

不会丢失调试功能,因为原始异常上下文在需要时保持可用(例如,如果插入库已正确地抑制了有价值的底层详细信息):

>>> try:
...     D({}).x
... except AttributeError as exc:
...     print(repr(exc.__context__))
...
KeyError('x',)

也可以看看

PEP 409 - 抑制异常上下文
PEP由Ethan Furman编写;由Ethan Furman和Nick Coghlan执行。

PEP 414: Explicit Unicode literals

为了简化从Python 2到使用大量使用Unicode字面值的基于Unicode的Python应用程序的转换,Python 3.3再次支持字符串字面值的“u”前缀。这个前缀在Python 3中没有语义意义,它仅仅是为了减少迁移到Python 3的纯机械改变的数量,使开发人员更容易专注于更重要的语义变化(例如更严格的二进制默认分离和文本数据)。

也可以看看

PEP 414 - 显式Unicode字面值
PEP由Armin Ronacher写。

PEP 3155: Qualified name for classes and functions

函数和类对象有一个新的__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>'

也可以看看

PEP 3155 - 类和函数的限定名称
PEP由Antoine Pitrou编写和实施。

PEP 412: Key-Sharing Dictionary

用于存储对象属性的字典现在能够在彼此之间共享它们的内部存储器的一部分(即,存储键和它们各自的哈希的部分)。这减少了创建许多非内置类型实例的程序的内存消耗。

也可以看看

PEP 412 - 密钥共享字典
PEP由Mark Shannon编写和实施。

PEP 362: Function Signature Object

新函数inspect.signature()使得对python可调用函数的自省变得容易和直接。支持范围广泛的callables:python函数,是否装饰,类和functools.partial()对象。新类inspect.Signatureinspect.Parameterinspect.BoundArguments保存有关调用签名的信息,如注释,默认值,参数类型和绑定参数,这大大简化了写装饰器和任何验证或修改调用签名或参数的代码。

也可以看看

PEP 362: - 函数声明对象
PEP由Brett Cannon撰写,Yury Selivanov,Larry Hastings,Jiwon Seo;由Yury Selivanov执行。

PEP 421: Adding sys.implementation

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与基于映射的命名空间(例如dictSimpleNamespace)是基于属性的,如object但是,与object不同,SimpleNamespace实例是可写的。这意味着您可以通过正常的属性访问来添加,删除和修改命名空间。

也可以看看

PEP 421 - 添加sys.implementation
PEP由Eric Snow编写和实施。

Using importlib as the Implementation of Import

issue 2377 - Replace __import__ w/ importlib.__import__ issue 13959 - Re-implement parts of imp in pure Python issue 14605 - Make import machinery explicit issue 14646 - Require loaders set __loader__ and __package__

__import__()函数现在由importlib.__import__()提供支持。该工作导致 PEP 302的“阶段2”完成。这种变化有多个好处。首先,它允许更多的机械动力进口被暴露,而不是隐含和隐藏在C代码中。它还为支持Python 3.3的所有Python VM提供单一实现,帮助结束导入语义中的任何VM特定的偏差。最后,它减轻了进口的维护,允许未来的增长发生。

对于普通用户,在语义上应该没有可见的改变。对于那些其代码当前以编程方式操作导入或调用导入的用户,可能需要的代码更改将在本文档的移植Python代码部分中介绍。

New APIs

这项工作的一个大的好处是暴露了什么使进口报表工作。这意味着以前隐式的各种导入器现在完全显示为importlib包的一部分。

The abstract base classes defined in importlib.abc have been expanded to properly delineate between meta path finders and path entry finders by introducing importlib.abc.MetaPathFinder and importlib.abc.PathEntryFinder, respectively. importlib.abc.Finder的旧ABC仅提供向后兼容性,并且不强制执行任何方法要求。

在查找器方面,importlib.machinery.FileFinder公开了用于搜索模块的源和字节码文件的机制。以前,此类是sys.path_hooks的隐式成员。

对于加载器,新的抽象基类importlib.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代码的导入,而不是直接暴露。这意味着现在可以轻松地删除或更改各种查找器的顺序以满足其需要。

另一个变化是所有模块都有一个__loader__属性,存储用于创建模块的加载器。 PEP 302已更新,使此属性对于装载程序是必须实现的,因此在将来一旦第三方装载程序已更新,人们将能够依赖于存在的属性。直到这样的时间,虽然,导入是设置模块后加载。

装载程序现在还希望从 PEP 366设置__package__属性。再次,导入本身已经在来自importlib的所有加载器上设置此属性,并且导入本身正在设置后加载属性。

当在sys.path_hooks上找不到finder时,None现在插入sys.path_importer_cache由于imp.NullImportersys.path_hooks上没有直接显示,因此无法再依赖它来始终可用作表示找不到finder的值。

所有其他更改与语义更改相关,在更新Python 3.3代码时应考虑这些更改,因此应在本文档的移植Python代码部分中阅读。

(由Brett Cannon执行)

Other Language Changes

核心Python语言的一些较小的更改是:

  • 添加了对Unicode名称别名和命名序列的支持。unicodedata.lookup()'\N{...}'现在解析名称别名,unicodedata.lookup()

    (由Ezio Melotti在issue 12753中提供。)

  • Unicode数据库更新到UCD版本6.1.0

  • range()对象的等式比较现在返回一个反映这些范围对象生成的基本序列的等同性的结果。问题13201

  • The count(), find(), rfind(), index() and rindex() methods of bytes and bytearray objects now accept an integer between 0 and 255 as their first argument.

    (由Petri Lehtinen提供,载于issue 12170。)

  • The rjust(), ljust(), and center() methods of bytes and bytearray now accept a bytearray for the fill argument. (由Petri Lehtinen在issue 12380中提供。)

  • New methods have been added to list and bytearray: copy() and clear() (issue 10516). 因此,MutableSequence现在还定义了一个clear()方法(问题11388)。

  • 原始字节字面值现在可以写为rb"..."以及br"..."

    (由Antoine Pitrou在issue 13748中提供。)

  • dict.setdefault()现在只对给定的键执行一次查找,使其与内建类型一起使用时是原子的。

    (由FilipGruszczyński撰写,在问题13521。)

  • (供稿人:Benjamin Peterson。)

A Finer-Grained Import Lock

CPython的以前版本一直依赖于全局导入锁。这导致意想不到的麻烦,例如死锁,当导入模块将触发代码执行在不同的线程作为副作用。有时会使用笨拙的解决方法,例如PyImport_ImportModuleNoBlock() C API函数。

在Python 3.3中,导入模块需要一个按模块的锁。这正确地序列化了来自多个线程的给定模块的导入(防止暴露未完全初始化的模块),同时消除上述烦恼。

(由Antoine Pitrou在issue 9260提供。)

Builtin functions and types

  • open() gets a new opener parameter: the underlying file descriptor for the file object is then obtained by calling opener with (file, flags). 它可以用于使用自定义标志,例如os.O_CLOEXEC添加了'x'模式:打开以供独占创建,如果文件已存在则失败。
  • print():添加了flush关键字参数。如果flush关键字参数为true,则流将被强制刷新。
  • hash():哈希随机化默认启用,请参阅object.__hash__() PYTHONHASHSEED
  • str类型获得一个新的casefold()方法:返回一个casefolded字符串的副本,casefolded字符串可以用于无盒匹配。例如,'ß'.casefold()返回'ss'
  • 序列文档已被重写,以更好地解释二进制/文本序列的区别,并为单个内置序列类型(issue 4966)提供特定的文档部分。

New Modules

faulthandler

这个新的调试模块faulthandler包含显式转储Python跟踪的功能,在故障(如分段故障的崩溃),超时后或用户信号。调用faulthandler.enable()SIGSEGVSIGFPESIGABRTSIGBUSSIGILL信号。您也可以在启动时通过设置 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提供,载于issue 6715。)

Improved Modules

abc

改进了对包含由抽象方法组成的描述器的抽象基类的支持。推荐的方法声明抽象描述器现在提供__isabstractmethod__作为动态更新的属性。内建描述器已相应地更新。

(由Darren Dale在issue 11610提供。)

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

array

The array module supports the long long type using q and Q type codes.

(由Oren Tirosh和Hirokazu Yamamoto在issue 1172711中提供。)

base64

现在的base64现代接口的解码功能现在接受只有ASCII的Unicode字符串。例如,base64.b64decode('YWJj')返回b'abc'(Contributed by Catalin Iacob in issue 13641。)

binascii

除了它们通常接受的二进制对象之外,a2b_函数现在也都接受仅ASCII字符串作为输入。(由Antoine Pitrou在问题13637提供。)

bz2

bz2模块已从头重写。在此过程中,增加了几个新功能:

  • bz2.open()函数:以二进制或文本模式打开bzip2压缩文件。

  • bz2.BZ2File现在可以通过其构造函数的fileobj参数读取和写入任意类似文件的对象。

    (由Nadeem Vawda在issue 5863中提供。)

  • bz2.BZ2Filebz2.decompress()现在可以解压缩多流输入(例如由pbzip2工具生成的输入)。bz2.BZ2File现在也可以使用'a'(append)模式创建此类型的文件。

    (由Nir Aides在issue 1625中提供。)

  • bz2.BZ2File now implements all of the io.BufferedIOBase API, except for the detach() and truncate() methods.

codecs

mbcs编解码器已被重写为在所有Windows版本上正确处理replaceignore错误处理程序。mbcs编解码器现在支持所有错误处理程序,而不是仅replace编码,ignore解码。

已添加新的仅Windows编解码器:cp65001问题13216)。它是Windows代码页65001(Windows UTF-8,CP_UTF8)。例如,如果控制台输出代码页设置为cp65001(例如,使用chcp 65001),则sys.stdout 命令)。

多字节CJK解码器现在重新同步更快。它们只忽略无效字节序列的第一个字节。例如,b'\ xff \ n'.decode('gb2312', 'replace')现在返回\n之后的替换字符。

发行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.'

This example gives b'~{Np~}~{J)~}~{l6~}~{HK~}~{!#~} Bye.'与较旧的Python版本。

发行12100

已不推荐使用unicode_internal编解码器。

collections

添加新的ChainMap类,以允许将多个映射视为单个单元。(由Raymond Hettinger为问题11089 t>>撰写,在问题11297中公开)。

抽象基类已在新的collections.abc模块中移动,以更好地区分抽象和具体的容器类。ABCs的别名仍然存在于collections模块中,以保留现有导入。问题11085

Counter类现在支持一元的+-运算符,以及原位运算符+=-=|=&=(由Raymond Hettinger在issue 13121中提供。)

contextlib

ExitStack现在为上下文管理器和类似清理功能的编程操作提供了坚实的基础。与上一个contextlib.nested API(已弃用和删除)不同,新API设计为正确工作,无论上下文管理器是否在其__init__方法中获取其资源例如文件对象)或其__enter__方法(例如,来自threading模块的同步对象)。

问题13585

crypt

crypt模块添加盐和模块化crypt格式(散列方法)和mksalt()函数。

问题10924

curses

  • If the curses module is linked to the ncursesw library, use Unicode functions when Unicode strings or characters are passed (e.g. waddwstr()), and bytes functions otherwise (e.g. waddstr()).
  • Use the locale encoding instead of utf-8 to encode Unicode strings.
  • curses.window has a new curses.window.encoding attribute.
  • The curses.window class has a new get_wch() method to get a wide character
  • The curses module has a new unget_wch() function to push a wide character so the next get_wch() will return it

(由IñigoSerna在问题6755提供。)

datetime

decimal

问题7652 - 集成快速原生十进制算术。
C模块和由Stefan Krah编写的libmpdec。

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

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

下表用作说明。基准可在http://www.bytereef.org/mpdecimal/quickstart.html获得。

decimal.py _decimal speedup
pi 42.02s 0.345s 120x
telco 172.19s 5.68s 30x
psycopg 3.57s 0.29s 12x

Features

  • FloatOperation信号可选地启用用于混合浮点和小数的更严格的语义。
  • 如果Python编译没有线程,C版本自动禁用昂贵的线程本地上下文机制。在这种情况下,变量HAVE_THREADS设置为False

API changes

  • C模块具有以下上下文限制,具体取决于机器架构:

    32-bit 64-bit
    MAX_PREC 425000000 999999999999999999
    MAX_EMAX 425000000 999999999999999999
    MIN_EMIN -425000000 -999999999999999999
  • In the context templates (DefaultContext, BasicContext and ExtendedContext) the magnitude of Emax and Emin has changed to 999999.

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

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

  • 在C版本中,包含信号的上下文字典是MutableMapping由于速度原因,flagstraps总是指与上下文初始化时相同的MutableMapping如果分配了新的信号字典,则使用新值更新flagstraps,但它们不引用RHS字典。

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

  • Context构造函数中的参数顺序已更改,以匹配由repr()显示的顺序。

  • 不建议使用quantize()方法中的watchexp参数。

email

Policy Framework

电子邮件包现在具有policy框架。Policy是具有控制电子邮件包行为方式的若干方法和属性的对象。Python 3.3的主要策略是Compat32策略,它提供与Python 3.2中的电子邮件包的向后兼容性。当通过parser解析电子邮件时,或者当创建Message对象时,或者当电子邮件序列化时,可以指定policy使用generator除非重写,传递给parser的策略由Message对象和由parser创建的子对象继承。默认情况下,generator将使用正在序列化的Message对象的策略。默认策略为compat32

所有policy对象实施的最小控制集是:

max_line_length The maximum length, excluding the linesep character(s), individual lines may have when a Message is serialized. Defaults to 78.
linesep The character used to separate individual lines when a Message is serialized. Defaults to \n.
cte_type 7bit or 8bit. 8bit applies only to a Bytes generator, and means that non-ASCII may be used where allowed by the protocol (or where it exists in the original input).
raise_on_defect Causes a parser to raise error when defects are encountered instead of adding them to the Message object’s defects list.

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

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

策略可用于使应用程序所需的格式的消息生成更简单。在设置策略时,不必记住在所有调用generator的地方指定linesep='\r\n'parserMessage使用,无论您的程序用于创建Message对象。另一方面,如果您需要生成多种形式的消息,您仍然可以在相应的generator调用中指定参数。或者,您可以为不同的情况创建自定义策略实例,并在创建generator时传递这些实例。

Provisional Policy with New Header API

尽管策略框架本身是值得的,但是引入它的主要动机是允许创建新策略,以便为不使用新策略的用户保持向后兼容性的方式实现电子邮件包的新功能。因为新政策引入了一个新的API,我们将在Python 3.3中作为provisional policy发布它们。如果核心开发人员认为有必要,可能会发生向后不兼容的更改(直到并包括删除代码)。

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

refold_source Controls whether or not headers parsed by a parser are refolded by the generator. It can be none, long, or all. The default is long, which means that source headers with a line longer than max_line_length get refolded. none means no line get refolded, and all means that all lines get refolded.
header_factory A callable that take a name and value and produces a custom header object.

header_factory是新策略提供的新功能的关键。当使用新策略之一时,从Message对象检索的任何头都是由header_factory生成的对象,并且只要在Message将成为header_factory生成的对象。所有此类标头对象都具有等于头名称的name属性。地址和日期标头具有其他属性,您可以访问解析的标头数据。这意味着你现在可以这样做:

>>> m = Message(policy=SMTP)
>>> m['To'] = 'Éric <[email protected]>'
>>> m['to']
'Éric <[email protected]>'
>>> 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?= <[email protected]>
Date: Fri, 25 May 2012 21:44:27 -0400

您将注意到,当消息被序列化时,unicode显示名称将自动编码为utf-8,但是当直接访问标题时,您将获得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='[email protected]')]
>>> print(m)
To: =?utf-8?q?=C3=89ric?= <[email protected]>
Date: Fri, 25 May 2012 21:44:27 -0400
cc: pals: Bob <[email protected]>, Sally <[email protected]>;, Bonzo <[email protected]>

解码到unicode是自动完成的:

>>> m2 = message_from_string(str(m))
>>> m2['to']
'Éric <[email protected]>'

解析邮件时,您可以使用标头对象的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'),))

总之,如果您使用其中一个新的策略,头处理的工作方式应该是:您的应用程序使用unicode字符串,电子邮件包透明编码和解码unicode到和从RFC标准内容传输编码。

Other API Changes

BytesHeaderParser添加到parser模块以补充HeaderParser并完成Bytes API。

新的实用功能:

ftplib

  • ftplib.FTP现在接受source_address关键字参数以指定(主机, 端口) t5>在创建传出套接字时用作绑定调用中的源地址。(由GiampaoloRodolà在issue 8594中提供。)
  • FTP_TLS类现在提供了一个新的ccc()函数将控制通道恢复为纯文本。这可以有利于利用防火墙知道如何使用非安全FTP处理NAT,而无需打开固定端口。(由GiampaoloRodolà在issue 12139提供。)
  • 添加了ftplib.FTP.mlsd()方法,它提供了可解析的目录列表格式,并且弃用了ftplib.FTP.nlst()ftplib.FTP.dir()(由GiampaoloRodolà在issue 11072中提供。)

functools

functools.lru_cache()装饰器现在接受typed关键字参数(默认为False,以确保它缓存不同类型的值在单独的缓存槽中比较相等。(由Raymond Hettinger在issue 13227中提供。)

gc

现在可以注册由容器使用新的callbacks列表之前和之后由垃圾收集器调用的回调。

hmac

添加了新的compare_digest()函数,以防止通过时序分析对摘要进行侧信道攻击。(由Nick Coghlan和Christian Heimes提供,载于issue 15061。)

http

http.server.BaseHTTPRequestHandler现在缓冲头并在调用end_headers()时一次性写入所有头。新方法flush_headers()可以用于直接管理何时发送累积的头。(由Andrew Schaaf在issue 3709中提供。)

http.server现在产生有效的HTML 4.01 严格输出。(由Ezio Melotti在issue 13295中提供。)

http.client.HTTPResponse现在有一个readinto()方法,这意味着它可以用作io.RawIOBase类。(由John Kuhn在issue 13464中提供。)

html

html.parser.HTMLParser现在可以解析破损的标记,而不会引发错误,因此构造函数的严格参数和HTMLParseError异常现在已弃用。解析破坏的标记的能力是Python 2.7 / 3.2的最新错误修复版本中提供的许多错误修复的结果。(Contributed by Ezio Melotti in issue 15114, and issue 14538, issue 13993, issue 13960, issue 13358, issue 1745761, issue 755670, issue 13357, issue 12629, issue 1200313, issue 670664, issue 13273, issue 12888, issue 7311.)

新的html5字典,用于将HTML5命名的字符引用映射到等效的Unicode字符。html5['gt;'] == '>') has been added to the html.entities module. 字典现在也由HTMLParser使用。(由Ezio Melotti在问题11113问题15156提供)。

imaplib

IMAP4_SSL构造函数现在接受SSLContext参数以控制安全通道的参数。

(由Sijin Joseph提供在issue 8808。)

inspect

已添加了一个新的getclosurevars()函数。此函数报告从函数主体引用的所有名称的当前绑定,以及解析这些名称的位置,以便在测试依赖于状态关闭的代码时更容易验证正确的内部状态。

(由Meador Inge和Nick Coghlan在问题13062中提供。)

已添加了一个新的getgeneratorlocals()函数。此函数报告生成器堆栈帧中的局部变量的当前绑定,使得在测试生成器时更容易验证正确的内部状态。

(Contributed by Meador Inge in issue 15153。)

io

open()函数有一个新的'x'模式,可用于专门创建一个新文件,并引入FileExistsError文件已存在。它基于C11'x'模式到fopen()。

(由David Townshend在issue 12760提供)。

TextIOWrapper类的构造函数有一个新的write_through可选参数。如果write_throughTrue,对write()的调用不会被缓冲:TextIOWrapper

itertools

accumulate()现在提供一个可选的func参数,用于提供用户提供的二进制函数。

logging

basicConfig()函数现在支持一个可选的handlers参数,它将可迭代的处理程序添加到根记录器。

类属级属性append_nul已添加到SysLogHandler,以允许控制NUL\000 )字节到syslog记录,因为对于一些deamons它是必需的,而对于其他人,它被传递到日志。

math

math模块具有新的函数log2(),它返回x的以2为底的对数。

(由Mark Dickinson在问题11888中撰写。)

mmap

read()方法现在与其他类文件对象更兼容:如果参数被省略或指定为None,它会将当前文件位置的字节结束映射。(由Petri Lehtinen提供,载于issue 12021。)

multiprocessing

新的multiprocessing.connection.wait()函数允许使用超时轮询多个对象(例如连接,套接字和管道)。(由Richard Oudkerk在issue 12328中提供。)

multiprocessing.Connection对象现在可以通过多处理连接传输。(由Richard Oudkerk在issue 4892中提供。)

multiprocessing.Process现在接受daemon关键字参数,以覆盖从父进程继承daemon标志的默认行为(issue 6064 )。

新属性multiprocessing.Process.sentinel允许程序使用适当的OS原语一次等待多个Process对象(例如,select在posix系统)。

新方法multiprocessing.pool.Pool.starmap()starmap_async()提供itertools.starmap()等同于现有的multiprocessing.pool.Pool.map()map_async()函数。(由Hynek Schlawack在issue 12708提供。)

nntplib

nntplib.NNTP类现在支持上下文管理协议无条件地使用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à在issue 9795中提供。)

os

pdb

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

(由Georg Brandl撰写,issue 14210

pickle

pickle.Pickler对象现在具有可选的dispatch_table属性,允许设置每个拾取器缩减函数。

(由Richard Oudkerk在issue 14166中提供。)

pydoc

已从pydoc模块中删除Tk GUI和serve()函数:pydoc -g t7 >serve()在Python 3.2中已被弃用。

re

str正则表达式现在支持\u\U转义。

(由Serhiy Storchaka在issue 3665中提供。)

sched

  • run()现在接受阻塞参数,该参数在设置为False时会由于最快到期(如果有)而立即返回,从而执行预定事件。如果要在非阻塞应用程序中使用scheduler,这是非常有用的。(由GiampaoloRodolà提供在issue 13449。)
  • scheduler类现在可以安全地在多线程环境中使用。(由Josiah Carlson和GiampaoloRodolà在issue 8684中提供。)
  • scheduler类构造函数的timefuncdelayfunct参数现在是可选的,默认为time.time()time.sleep()(由克里斯·克拉克在问题13245中提供。)
  • enter()enterabs() 参数参数现在是可选的。(由克里斯·克拉克在问题13245中提供。)
  • enter()enterabs()现在接受kwargs参数。(由克里斯·克拉克在问题13245中提供。)

select

Solaris和衍生平台对于通过/dev/poll的高性能异步套接字有一个新类select.devpoll(由JesúsCeaAvión在问题6397中提供。)

shlex

来自pipes模块的先前未记录的帮助函数quote已移至shlex模块并记录。quote()正确转义字符串中可能由shell给出特殊含义的所有字符。

shutil

  • 新功能:
    • disk_usage():提供总的,已用和可用的磁盘空间统计信息。(由GiampaoloRodolà在issue 12442中提供。)
    • chown():允许更改给定路径的用户和/或组,还指定用户/组名称,而不仅仅是其数字ID。(由Sandro Tosi提供,issue 12191。)
    • shutil.get_terminal_size():返回解释器附加到的终端窗口的大小。(Contributed by ZbigniewJędrzejewski-Szmek in issue 13609。)
  • copy2()copystat()现在在支持它的平台上保留纳秒精度的文件时间戳。它们还在Linux上保留文件“扩展属性”。(由Larry Hastings在issue 14127发出15238提供)。
  • 几个函数现在接受一个可选的symlinks参数:当该参数为true时,不解除引用符号链接,而操作反而作用于符号链接本身(或创建一个,如果相关)。(由Hynek Schlawack在issue 12715中提供。)
  • 当将文件复制到不同的文件系统时,move()现在以posix mv命令的方式处理符号链接,重新创建符号链接,而不是复制目标文件内容。(由Jonathan Niehof在issue 9993中提供。)move()现在也返回dst参数作为其结果。
  • rmtree() is now resistant to symlink attacks on platforms which support the new dir_fd parameter in os.open() and os.unlink(). (由Martin vonLöwis和Hynek Schlawack在issue 4489中提供。)

signal

smtpd

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

(Alberto Trevino的初始ELHO支持。大小扩展由Juhana Jauhiainen。由MicheleOrrù和Dan Boswell贡献的补丁的大量额外工作。issue 8739

smtplib

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

SMTP现在支持上下文管理协议,允许在with语句中使用SMTP实例。(由GiampaoloRodolà在issue 11289中提供。)

SMTP_SSL构造函数和starttls()方法现在接受SSLContext参数以控制安全通道的参数。(由Kasun Herath在issue 8809中提供。)

socket

socketserver

BaseServer现在具有可由服务循环中的serve_forever()方法调用的可覆盖方法service_actions()ForkingMixIn现在使用它来清理僵尸子进程。(Contributed by Justin Warkentin in issue 11109。)

sqlite3

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

ssl

stat

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

(由GiampaoloRodolà提供在issue 14807。)

struct

struct模块现在通过新代码nN支持ssize_tsize_t , 分别。(由Antoine Pitrou提供issue 3163。)

subprocess

命令字符串现在可以是posix平台上的字节对象。(由Victor Stinner在issue 8513中提供。)

新的常数DEVNULL允许以平台无关的方式抑制输出。(由Ross Lagerwall在issue 5870中提供。)

sys

sys模块有一个新的thread_info struct sequence保存有关线程实现的信息(issue 11223)。

tarfile

tarfile现在通过lzma模块支持lzma编码。(由LarsGustäbel在问题5689中提供。)

tempfile

tempfile.SpooledTemporaryFiletruncate()方法现在接受size参数。(由Ryan Kelly在问题9957提供。)

textwrap

textwrap模块有一个新的indent(),可以直接在文本块中选择行添加一个公共前缀(issue 13857 )。

threading

threading.Conditionthreading.Semaphorethreading.BoundedSemaphorethreading.Eventthreading.Timer,所有这些都是返回类实例的工厂函数,现在是类,可以是子类。(由ÉricAraujo在问题10968提供。)

The threading.Thread constructor now accepts a daemon keyword argument to override the default behavior of inheriting the deamon flag value from the parent thread (issue 6064).

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

time

PEP 418time模块添加了新功能:

  • get_clock_info():获取时钟信息。
  • monotonic():单调时钟(不能后退),不受系统时钟更新的影响。
  • perf_counter():具有最高可用分辨率的性能计数器,用于测量短持续时间。
  • process_time():当前进程的系统和用户CPU时间的总和。

其他新功能:

为了提高跨平台一致性,sleep()现在在传递负睡眠值时引发ValueError以前这是posix上的错误,但在Windows上产生了无限睡眠。

types

添加新的types.MappingProxyType类:映射的只读代理。发行14386

新函数types.new_class()types.prepare_class()支持PEP 3115兼容的动态类型创建。issue 14588

unittest

assertRaises(), assertRaisesRegex(), assertWarns(), and assertWarnsRegex() now accept a keyword argument msg when used as context managers. (由Ezio Melotti和Winston Ewert在issue 10775中提供。)

unittest.TestCase.run()现在返回TestResult对象。

urllib

Request类现在接受get_method()使用的方法参数,以确定应使用哪种HTTP方法。例如,这将发送一个'HEAD'请求:

>>> urlopen(Request('https://www.python.org', method='HEAD'))

问题1673007

webbrowser

The webbrowser module supports more “browsers”: Google Chrome (named chrome, chromium, chrome-browser or chromium-browser depending on the version and operating system), and the generic launchers xdg-open, from the FreeDesktop.org project, and gvfs-open, which is the default URI handler for GNOME 3. (前者由Arnaud Calmettes在问题13620 t>中提供,后者由Matthias Klose在问题14493中提供)

xml.etree.ElementTree

xml.etree.ElementTree模块现在默认导入其C加速器;不再需要显式导入xml.etree.cElementTree(此模块保留向后兼容性,但现在已被弃用)。此外,Elementiter方法系列已经优化(在C中重写)。通过添加示例和更详细的参考,模块的文档也得到了极大的改进。

zlib

新属性zlib.Decompress.eof可以区分正确形成的压缩流和不完整或截断的压缩流。(由Nadeem Vawda在issue 12646中提供。)

新属性zlib.ZLIB_RUNTIME_VERSION报告在运行时加载的底层zlib库的版本字符串。(由Torsten Landschoff在issue 12306提供。)

Optimizations

增加了主要性能增强:

  • 感谢 PEP 393,对Unicode字符串的一些操作已优化:

    • 根据文本,内存占用除以2至4
    • 将ASCII字符串编码为UTF-8不再需要对字符进行编码,UTF-8表示与ASCII表示共享
    • UTF-8编码器已经过优化
    • None
  • UTF-8现在是2倍到4倍更快。UTF-16编码现在的速度提高了10倍。

    (由Serhiy Storchaka提供,发行14624发行14738发行15026

Deprecated

Unsupported Operating Systems

由于缺少维护者,不再支持OS / 2和VMS。

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

OSF支持已在3.2中弃用,已完全删除。

Deprecated Python modules, functions and methods

Deprecated functions and types of the C API

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

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

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

编码器:

Deprecated features

array模块的'u'格式代码现在已弃用,并将与Python 4中的其余部分(Py_UNICODE)一起删除。

Porting to Python 3.3

本节列出了之前描述的更改和其他可能需要更改代码的错误。

Porting Python code

  • 默认情况下启用哈希随机化。 PYTHONHASHSEED环境变量设置为0以禁用哈希随机化。另请参见object.__hash__()方法。
  • issue 12326:在Linux上,sys.platform不再包含主版本。它现在总是“linux”,而不是“linux2”或“linux3”,这取决于用于构建Python的Linux版本。如果你不需要支持旧的Python版本,请将sys.platform =='linux2'替换为sys.platform.startswith('linux'),或直接替换为sys.platform =='linux'。
  • 发出13847发出14180timedatetimeOverflowError如果时间戳超出范围,则为ValueError如果C函数gmtime()localtime()失败,OSError
  • 导入使用的默认查找器现在使用特定目录中包含的内容的缓存。如果您创建一个Python源文件或无源字节码文件,请务必调用importlib.invalidate_caches()清除查找器的缓存以注意到新文件。
  • ImportError现在使用尝试导入的模块的全名。需要更新检查ImportErrors消息的Doctest以使用模块的全名,而不仅仅是名称的尾部。
  • __import__()index参数现在默认为0而不是-1,不再支持负值。在实施 PEP 328时,这是一个疏忽,默认值保持为-1。如果需要继续执行相对导入,然后执行绝对导入,则使用索引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的值可向后兼容。这将导致旧版本的Python重新插入Nonesys.path_importer_cache中的额外开销,它反映了隐式查找器的使用,但在语义上它不应该更改任何东西。
  • importlib.abc.Finder不再指定必须实现的find_module()抽象方法。如果你依靠子类来实现该方法,请务必首先检查方法的存在。您可能希望首先检查find_loader(),但在使用path entry finders的情况下。
  • pkgutil已在内部转换为使用importlib这消除了许多边缘情况,其中PEP 302导入仿真的旧行为不能与真实导入系统的行为匹配。导入仿真本身仍然存在,但现在已被弃用。pkgutil.iter_importers()pkgutil.walk_packages()函数特殊情况下标准导入钩子,因此即使它们不提供非标准iter_modules()方法。
  • email.header.decode_header()完成的解析中的长期RFC合规性错误(问题1079)已修复。使用标准习语将编码头转换为unicode(str(make_header(decode_header(h)))的代码将看不到更改,但是查看decode_header返回的各个元组的代码将看到空格之前或之后ASCII部分现在包含在ASCII部分中。使用make_header构建头的代码也应该继续正常工作,因为make_header继续在ASCII和非ASCII节(如果它尚未存在于输入字符串中)。
  • email.utils.formataddr()在传递非ASCII显示名称时,会执行正确的内容传输编码。任何依赖于在格式化输出字符串中保留非ASCII unicode的上一个错误行为的代码都需要更改(issue 1690608)。
  • poplib.POP3.quit()现在可以像所有其他poplib方法一样引入协议错误。Code that assumes quit does not raise poplib.error_proto errors may need to be changed if errors on quit are encountered by a particular application (issue 11291).
  • email.parser.Parserstrict参数(从Python 2.4开始弃用)已终止删除。
  • 已弃用已弃用的方法unittest.TestCase.assertSameElements
  • 已弃用的变量time.accept2dyear已被移除。
  • 已弃用的Context._clamp属性已从decimal模块中删除。之前已由公共属性clamp替换。(请参阅issue 8540。)
  • 未归档的内部辅助类SSLFakeFile已从smtplib中删除,因为其功能早已由socket.socket.makefile()直接提供。
  • 在Windows上传递负值到time.sleep()现在引发错误,而不是永远休眠。它总是在posix上引发一个错误。
  • 已删除ast.__version__常数。如果你需要做决定受AST版本影响,使用sys.version_info做出决定。
  • 用于解决threading模块通过子类化私有类使用工厂函数的事实的代码需要更改为now-public类的子类。
  • 在线程模块中的未记录的调试机器已被删除,简化代码。这应该对生产代码没有影响,但是在这里提到任何应用程序调试框架与它交互(issue 13550)。

Porting C code

Building C extensions

  • C扩展名的可能文件名范围已缩小。Very rarely used spellings have been suppressed: under POSIX, files named xxxmodule.so, xxxmodule.abi3.so and xxxmodule.cpython-*.so are no longer recognized as implementing the xxx module. 如果您已生成此类文件,则必须切换到其他拼写(即,从文件名中删除module字符串)。

    (在问题14040中实现)。

Command Line Switch Changes

  • 代码检查sys.flags.division_warning将需要更新。

    issue 10998,由ÉricAraujo提供)。

  • python-S开始,import site 到模块搜索路径的特定路径。在以前的版本中,它做到了。

    issue 11591,由Carl Meyer提供,版本为ÉricAraujo。)