python 3.3的新功能

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

参见

PEP 398 -python 3.3发布计划

总结——发布亮点

新语法功能:

新库模块:

新的内置功能:

实施改进:

显著改进了库模块:

安全改进:

  • 默认情况下,hash随机化处于打开状态。

请继续阅读以获得面向用户的更改的全面列表。

PEP 405:虚拟环境

虚拟环境有助于在共享整个系统的基本安装时创建单独的python设置,以便于维护。虚拟环境有自己的一组专用站点包(即本地安装的库),可以选择与系统范围的站点包隔离。他们的理念和实施受到大众的启发 virtualenv 第三方软件包,但受益于与解释器核心的紧密集成。

这个PEP补充说 venv 程序访问模块,以及 pyvenv 用于命令行访问和管理的脚本。python解释器检查 pyvenv.cfg ,文件,其存在表示虚拟环境目录树的基础。

参见

PEP 405 -python虚拟环境

由Carl Meyer编写的PEP;由Carl Meyer和Vinay Sajip实施

PEP 420:隐式命名空间包

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

参见

PEP 420 -隐式命名空间包

由Eric v.Smith撰写的PEP;由Eric v.Smith和Barry Warsaw实施

PEP 3118:新的内存查看实现和缓冲协议文档

实施 PEP 3118 得到了显著改善。

新的memoryview实现全面修复了py_buffer结构中动态分配字段的所有所有权和生存期问题,这些问题导致了多个崩溃报告。此外,对于非连续或多维输入,一些崩溃或返回错误结果的函数已被修复。

memoryView对象现在有一个符合PEP-3118的getBufferProc(),用于检查使用者的请求类型。已经添加了许多新特性,其中大多数都适用于非连续数组和具有子偏移集的数组。

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

特征

  • 现在支持结构模块语法(可选前缀为“@”)中的所有本机单字符格式说明符。

  • 在某些限制下,cast()方法允许更改C-连续数组的格式和形状。

  • 任何数组类型都支持多维列表表示。

  • 任何数组类型都支持多维比较。

  • 具有格式b、b或c的可散列(只读)类型的一维内存视图现在可以散列。(由Antoine Pitrou在 bpo-13411

  • 支持任意一维数组类型的切片。例如,现在可以使用负的步骤反转o(1)中的memoryView。

API更改

  • 官方规定最大尺寸限制为64。

  • 空形状、跨步和子偏移集的表示现在是一个空元组,而不是 None .

  • 访问格式为“b”(无符号字节)的memoryview元素现在返回一个整数(根据结构模块语法)。若要返回bytes对象,必须首先将视图强制转换为“c”。

  • memoryview比较现在使用操作数的逻辑结构,并按值比较所有数组元素。支持结构模块语法中的所有格式字符串。具有未识别格式字符串的视图仍然是允许的,但无论视图内容如何,都将以不相等的方式进行比较。

  • 如需进一步更改,请参阅 Build and C API ChangesPorting C code .

(由Stefan Krah在 bpo-10181

参见

PEP 3118 -修改缓冲协议

PEP 393:柔性字符串表示

Unicode字符串类型将更改为支持多个内部表示,具体取决于所表示字符串中具有最大Unicode序号(1、2或4字节)的字符。这允许在常见情况下使用节省空间的表示,但允许访问所有系统上的完整UCS-4。为了与现有的API兼容,可以并行地存在多个表示;随着时间的推移,这种兼容性应该逐步取消。

在Python方面,这种变化不应该有任何负面影响。

在C API方面, PEP 393 完全向后兼容。旧版API至少应保留五年。使用遗留API的应用程序不会完全受益于内存减少,或者更糟的是,可能会使用更多的内存,因为python可能需要维护每个字符串的两个版本(在遗留格式和新的高效存储中)。

功能

由引入的更改 PEP 393 如下所示:

  • python现在总是支持完整的Unicode代码点,包括非BMP代码点(即 U+0000U+10FFFF )窄构建和宽构建之间的区别已经不复存在,而且Python现在的行为就像一个宽构建,甚至在Windows下。

  • 随着窄版本的终结,特定于窄版本的问题也得到了解决,例如:

    • len() 现在总是为非BMP字符返回1,因此 len('\U0010FFFF') == 1

    • 代理项对不在字符串文本中重新组合,因此 '\uDBFF\uDFFF' != '\U0010FFFF'

    • 索引或切片非BMP字符返回预期值,因此 '\U0010FFFF'[0] 现在回报 '\U0010FFFF' 而不是 '\uDBFF'

    • 标准库中的所有其他函数现在都可以正确处理非BMP代码点。

  • 价值 sys.maxunicode 现在总是 1114111 (0x10FFFF 十六进制)。这个 PyUnicode_GetMax() 函数仍返回 0xFFFF0x10FFFF 为了向后兼容,它不应该与新的Unicode API一起使用(请参见 bpo-13054

  • 这个 ./configure flag --with-wide-unicode 已删除。

性能和资源使用

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编码数据等)C.)我们还希望,它也会出于同样的原因,提高非平凡应用程序的CPU缓存效率。在django基准测试中,python 3.3的内存使用量比python 3.2小2到3倍,比python 2.7稍好一点(有关详细信息,请参阅pep)。

参见

PEP 393 -灵活的字符串表示法

由Martin von L_wis编写的PEP;由Torsten Becker和Martin von L_wis实施。

PEP 397:用于Windows的python启动程序

python 3.3windows安装程序现在包括 py 可用于以独立于版本的方式启动Python应用程序的启动程序。

双击时隐式调用此启动程序 *.py 文件夹。如果系统上只安装了一个Python版本,那么该版本将用于运行该文件。如果安装了多个版本,默认情况下使用最新的版本,但是可以通过在python脚本中包含一个unix风格的“shebang line”来覆盖它。

也可以从命令行显式使用启动器作为 py 应用。运行 py 遵循与隐式启动脚本相同的版本选择规则,但可以通过传递适当的参数(例如 -3 在也安装了python 2时请求python 3,或者 -2.6 当安装了较新版本时,专门请求较早的python版本)。

除了启动程序,WindowsInstaller现在还提供了一个选项,可以将新安装的python添加到系统路径中。(Brian Curtin在 bpo-3561

参见

PEP 397 -用于Windows的python启动程序

由Mark Hammond和Martin V.l_wis编写的PEP;由Vinay Sajip实施。

启动程序文档: 用于Windows的python启动程序

安装程序路径修改: 查找python可执行文件

PEP 3151:改写操作系统和IO异常层次结构

操作系统错误引发的异常层次结构现在既简化了,也更加细化了。

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

此外,现在更容易捕获特定的错误条件。而不是检查 errno 属性(或) args[0] )对于来自 errno 模块,你可以抓住足够的 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异常层次结构

由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 -委派给子生成器的语法

由Greg Ewing编写的PEP;由Greg Ewing实施,由Renaud Blanch、Ryan Kelly和Nick Coghlan集成到3.3中;由Zbigniew J_Drzejewski Szmek和Nick Coghlan编制的文档

PEP 409:抑制异常上下文

PEP409引入了新的语法,允许禁用连锁异常上下文的显示。这允许在异常类型之间转换的应用程序中出现更清晰的错误消息:

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

不会丢失调试功能,因为如果需要,原始异常上下文仍然可用(例如,如果干预库错误地抑制了有价值的底层细节)::

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

参见

PEP 409 -抑制异常上下文

PEP由Ethan Furman编写;由Ethan Furman和Nick Coghlan实施。

PEP 414:显式Unicode文本

为了简化对大量使用Unicode文本的Unicode感知的python应用程序从python 2的转换,python 3.3再次支持“ u “字符串文本的前缀。这个前缀在python 3中没有语义意义,它的提供只是为了减少迁移到python 3时纯机械的更改数量,使开发人员更容易关注更重要的语义更改(例如更严格的二进制和文本数据的默认分隔)。

参见

PEP 414 -显式Unicode文本

由Armin Ronacher撰写的PEP。

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

参见

PEP 3155 -类和函数的限定名

PEP由Antoine Pitrou编写并实施。

PEP 412:密钥共享字典

用于存储对象属性的字典现在可以在彼此之间共享其内部存储的一部分(即存储键及其各自hash的部分)。这减少了创建许多非内置类型实例的程序的内存消耗。

参见

PEP 412 -密钥共享词典

PEP由Mark Shannon编写并实施。

PEP 362:函数签名对象

一个新函数 inspect.signature() 使对python可调用文件的内省变得简单和简单。支持广泛的可调用文件:python函数,修饰的与否,类,以及 functools.partial() 物体。新类 inspect.Signatureinspect.Parameterinspect.BoundArguments 保存有关调用签名的信息,如注释、默认值、参数类型和绑定参数,这大大简化了编写装饰符和验证或修改调用签名或参数的任何代码。

参见

PEP 362 :-函数签名对象

由Brett Cannon、Yury Selivanov、Larry Hastings、Jiwon SEO编写的PEP;由Yury Selivanov实施。

PEP 421:添加sys.implementation

上的新属性 sys 模块公开特定于当前运行的解释器实现的详细信息。上的初始属性集 sys.implementationnameversionhexversioncache_tag .

目的 sys.implementation 是将标准库使用的特定于实现的数据合并到一个命名空间中。这使得不同的Python实现更容易共享一个标准库代码库。在初始状态下, sys.implementation 只保存实现特定数据的一小部分。随着时间的推移,这一比例将发生变化,以使标准库更易于移植。

改进标准库可移植性的一个例子是 cache_tag . 从python 3.3开始, sys.implementation.cache_tag 被使用 importlib 支持 PEP 3147 顺从。任何使用 importlib 对于其内置的导入系统,可以使用 cache_tag 控制模块的缓存行为。

SimpleNamespace

实施 sys.implementation 同时还向python引入了一种新类型: types.SimpleNamespace . 与基于映射的命名空间不同,比如 dictSimpleNamespace 是基于属性的,比如 object .但是,不同于 objectSimpleNamespace 实例是可写的。这意味着您可以通过普通属性访问来添加、删除和修改命名空间。

参见

PEP 421 -添加sys.implementation

Pep由Eric Snow编写并实施。

使用importlib作为import的实现

bpo-2377 -替换 __import__ W/ importlib.__import__ :问题:13959-重新实现 imp 在纯 Python 中 bpo-14605 -明确导入机制 bpo-14646 -需要加载器套件 __loader__ 和Y-P封装

这个 __import__() 功能现在由 importlib.__import__() . 这项工作完成了 PEP 302 . 这种变化有多种好处。首先,它允许更多的驱动导入的机器被暴露出来,而不是隐藏在C代码中。它还为所有支持python 3.3的python vm提供了一个单独的实现,有助于结束导入语义中任何特定于vm的偏差。最后,它简化了输入的维持,允许未来的增长发生。

对于普通用户,语义不应该有明显的变化。对于那些当前以编程方式操作导入或调用导入的代码,可能需要的代码更改将包含在 Porting Python code 本文件的章节。

新的应用程序接口

这项工作的一大好处是暴露了使输入声明生效的因素。这意味着,曾经暗含的各种importers现在完全暴露在 importlib 包裹。

中定义的抽象基类 importlib.abc 已经扩展到适当的范围 meta path finderspath entry finders 通过介绍 importlib.abc.MetaPathFinderimportlib.abc.PathEntryFinder ,分别。旧ABC importlib.abc.Finder 现在只提供向后兼容性,不强制任何方法要求。

在寻找者方面, 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 根据需要帮助清除任何存储状态。

可见变化

有关可能需要对代码进行的更改,请参阅 Porting Python code 部分。

超越了什么的广袤 importlib 现在公开了,还有其他可见的更改要导入。最大的是 sys.meta_pathsys.path_hooks 现在存储导入使用的所有元路径查找器和路径条目挂钩。以前,查找器是隐式的,隐藏在导入的C代码中,而不是直接暴露。这意味着你现在可以很容易地删除或改变各种查找器的顺序来满足你的需要。

另一个变化是所有模块都有一个 __loader__ 属性,存储用于创建模块的加载程序。 PEP 302 已更新,使加载程序必须实现此属性,因此在将来第三方加载程序更新后,人们将能够依赖该属性的存在。不过,在这之前,import正在设置模块的后期加载。

加载器现在还需要设置 __package__ 属性来自 PEP 366 . 再一次,导入本身已经在来自的所有加载程序上设置了此设置。 importlib 导入本身正在设置属性post-load。

None 现在插入到 sys.path_importer_cache 当在上找不到查找器时 sys.path_hooks . 自从 imp.NullImporter 不直接暴露在 sys.path_hooks 它不能再依赖于始终可用作表示找不到查找器的值。

所有其他更改都与语义更改有关,在更新python 3.3的代码时应该考虑这些更改,因此应该在 Porting Python code 本文件的章节。

(Brett Cannon实施)

其他语言更改

对核心python语言所做的一些较小的更改是:

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

    (由Ezio Melotti在 bpo-12753

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

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

  • 这个 count()find()rfind()index()rindex() 方法 bytesbytearray 对象现在接受一个介于0和255之间的整数作为其第一个参数。

    (由Petri Lehtinen在 bpo-12170

  • 这个 rjust()ljust()center() 方法 bytesbytearray 现在接受 bytearray 对于 fill 参数。(由Petri Lehtinen在 bpo-12380

  • 新方法已添加到 listbytearraycopy()clear() (bpo-10516 )因此, MutableSequence 现在还定义了 clear() 方法 (bpo-11388

  • 现在可以写入原始字节文本 rb"..." 以及 br"..." .

    (由Antoine Pitrou在 bpo-13748

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

    (菲利普·格鲁兹基在 bpo-13521

  • 当函数调用与函数签名不匹配时产生的错误消息得到了显著改进。

    (本杰明·彼得森供稿)

更细粒度的导入锁

以前版本的cpython总是依赖全局导入锁。这导致了意想不到的麻烦,比如在导入模块时死锁会作为副作用触发不同线程中的代码执行。有时会采用笨拙的变通方法,例如 PyImport_ImportModuleNoBlock() C API函数。

在Python3.3中,导入一个模块需要一个每个模块的锁。这将正确序列化从多个线程导入给定模块(防止未完全初始化的模块暴露),同时消除前面提到的麻烦。

(由Antoine Pitrou在 bpo-9260

内置函数和类型

  • open() 获取新的 开瓶器 参数:然后通过调用 开瓶器 用( fileflags )它可以用于使用自定义标志,如 os.O_CLOEXEC 例如。这个 'x' 已添加模式:以独占创建方式打开,如果文件已存在则失败。

  • print() 增加了 脸红 关键字参数。如果 脸红 关键字参数为true,强制刷新流。

  • hash() :默认情况下已启用hash随机化,请参见 object.__hash__()PYTHONHASHSEED .

  • 这个 str 类型获得新的 casefold() 方法:返回一个折叠后的字符串副本,可以使用折叠后的字符串进行无大小写匹配。例如, 'ß'.casefold() 返回 'ss' .

  • 序列文档被大量重写,以便更好地解释二进制/文本序列的区别,并为各个内置序列类型提供特定的文档部分。 (bpo-4966

新模块

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

IP地址

新的 ipaddress 模块提供用于创建和操作表示IPv4和IPv6地址、网络和接口(即与特定IP子网关联的IP地址)的对象的工具。

(由Google和Peter Moody在 PEP 3144

LZMA

新增加的 lzma 模块使用LZMA算法提供数据压缩和解压,包括对 .xz.lzma 文件格式。

(由Nadeem Vawda和Per_yvind Karlsen于 bpo-6715

改进的模块

ABC公司

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

(由Darren Dale在 bpo-11610

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

数组

这个 array 模块支持 long long 使用类型 qQ 类型代码。

(由Oren Tirosh和Hirokazu Yamamoto在 bpo-1172711

Base64

ASCII的解码函数现在只接受Unicode字符串 base64 现代界面。例如, base64.b64decode('YWJj') 返回 b'abc' . (由Catalin Iacob在 bpo-13641

binascii

除了他们通常接受的二进制对象之外, a2b_ 现在所有函数都只接受ASCII字符串作为输入。(由Antoine Pitrou在 bpo-13637

BZ2

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

解码器

这个 mbcs 已重写编解码器以正确处理 replaceignore 所有Windows版本上的错误处理程序。这个 mbcs 编解码器现在支持所有错误处理程序,而不是只支持 replace 编码和 ignore 解码。

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

多字节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 编解码器已被弃用。

收藏

添加新的 ChainMap 类以允许将多个映射视为单个单元。(雷蒙德·赫廷格为 bpo-11089 ,公布于 bpo-11297

抽象基类已在新的 collections.abc 模块,以便更好地区分抽象集合类和具体集合类。ABC的别名仍存在于 collections 用于保留现有导入的模块。 (bpo-11085

这个 Counter 类现在支持一元 +- 操作员以及就地操作员 +=-=|=&= . (由Raymond Hettinger在 bpo-13121

contextlib

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

(bpo-13585

crypt

添加salt和模块化密码格式(hash方法)以及 mksalt() 函数到 crypt 模块。

(bpo-10924

curses

  • 如果 curses 模块链接到ncurssew库,在传递unicode字符串或字符时使用unicode函数(例如 waddwstr() 以及字节函数(例如 waddstr()

  • 使用区域设置编码而不是 utf-8 对Unicode字符串进行编码。

  • curses.window 有新的 curses.window.encoding 属性。

  • 这个 curses.window 类有新的 get_wch() 获取宽字符的方法

  • 这个 curses 模块有一个新的 unget_wch() 函数将宽字符推送到下一个 get_wch() 将归还它

(I_igo serna在 bpo-6755

日期时间

十进制的

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

C-module和libmpdec由stefan krah编写。

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

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

下表是为了说明。基准可以在http://www.byteref.org/mpdecimal/quickstart.html上找到。

decimal.py

_decimal

加速

圆周率

42.02s

0.345s

120倍

电信公司

172.19s

5.68s

30倍

心理医生

3.57s

0.29s

12X

特征

  • 这个 FloatOperation 信号可选地为混合浮点数和小数启用更严格的语义。

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

API更改

  • 根据机器结构,C模块具有以下上下文限制:

    32位

    64位

    MAX_PREC

    425000000

    999999999999999999

    MAX_EMAX

    425000000

    999999999999999999

    MIN_EMIN

    -425000000

    -999999999999999999

  • 在上下文模板中 (DefaultContextBasicContextExtendedContext )的大小 EmaxEmin 已经改变为 999999 .

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

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

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

  • 腌渍A Context 生成不同的输出,以便为Python和C版本使用通用的交换格式。

  • 中的参数顺序 Context 已更改构造函数以匹配 repr() .

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

电子邮件

政策框架

电子邮件包现在有一个 policy 框架。一 Policy 是一个具有多个方法和属性的对象,这些方法和属性控制电子邮件包的行为。python 3.3的主要策略是 Compat32 策略,它提供与Python3.2中的电子邮件包的向后兼容性。一 policy 当电子邮件由 parser ,或当 Message 对象,或者当使用 generator . 除非重写,否则将策略传递给 parser 被所有人继承 Message 对象和子对象由 parser . 默认情况下 generator 将使用的策略 Message 对象正在序列化。默认策略是 compat32 .

由所有 policy 对象是:

max_line_length

Message 已序列化。默认值为78。

直线扫描

用于分隔单个行的字符,当 Message 已序列化。默认为 \n .

cte_type

7bit8bit . 8bit 仅适用于 Bytes generator 也就是说,在协议允许的情况下(或者在原始输入中存在的情况下),可以使用非ASCII。

raise_on_defect

原因A parser 在遇到缺陷时引发错误,而不是将它们添加到 Message 对象的 defects 名单。

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

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

可以使用策略简化应用程序所需格式的消息生成。而不是必须记住指定 linesep='\r\n' 在所有你称之为 generator ,您可以在设置 parserMessage ,无论您的程序使用哪个来创建 Message 物体。另一方面,如果您需要以多种形式生成消息,您仍然可以在适当的 generator 调用。或者,您可以为不同的案例拥有自定义策略实例,并在创建 generator .

带有新标题API的临时政策

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

新策略是 EmailPolicy ,并添加以下附加控件:

refold_source

控制是否由 parser 被重新折叠 generator . 它可以 nonelongall . 默认值为 long ,这意味着行长于 max_line_length 重新折叠。 none 意味着没有线被重新折叠,并且 all 意味着所有的线条都会重新折叠。

header_factory

一个需要 namevalue 并生成自定义头对象。

这个 header_factory 是新策略提供的新功能的关键。当使用其中一个新策略时,从 Message 对象是由 header_factory 以及任何时候在 Message 它变成了一个由 header_factory . 所有这样的头对象都有一个 name 属性等于标题名称。地址和日期头具有其他属性,使您能够访问头的分析数据。这意味着你现在可以这样做:

>>> 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 当消息被序列化时,但是当头被直接访问时,您将得到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'),))

总之,如果您使用其中一个新策略,那么头操作的工作方式应该是这样的:您的应用程序使用Unicode字符串,并且电子邮件包透明地对与RFC标准内容传输编码之间的Unicode进行编码和解码。

其他API变更

新的 BytesHeaderParser ,添加到 parser 补充模块 HeaderParser 并完成字节API。

新的实用功能:

FTPLIB

  • ftplib.FTP 现在接受 source_address 关键字参数以指定 (host, port) 在创建传出套接字时用作绑定调用中的源地址。(由Giampaolo Rodol_在 bpo-8594

  • 这个 FTP_TLS 类现在提供了一个新的 ccc() 函数将控制通道恢复为纯文本。这对于利用知道如何在不打开固定端口的情况下使用不安全的ftp处理nat的防火墙很有用。(由Giampaolo Rodol_在 bpo-12139

  • 补充 ftplib.FTP.mlsd() 提供可分析目录列表格式和取消预测的方法 ftplib.FTP.nlst()ftplib.FTP.dir() .(由Giampaolo Rodol_在 bpo-11072

功能工具

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

GC

现在可以使用新的 callbacks 名单。

hmac

一个新的 compare_digest() 通过定时分析,增加了防止消化道侧沟道攻击的功能。(由Nick Coghlan和Christian Heimes在 bpo-15061

HTTP协议

http.server.BaseHTTPRequestHandler 现在缓冲报头,并在 end_headers() 被称为。一种新方法 flush_headers() 可用于在发送累积头时直接管理。(安德鲁沙夫在 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命名字符引用映射到等效Unicode字符(例如 html5['gt;'] == '>' )已添加到 html.entities 模块。字典现在也被 HTMLParser . (由Ezio Melotti在 bpo-11113bpo-15156

IMAPLIB

这个 IMAP4_SSL 构造函数现在接受sslcontext参数来控制安全通道的参数。

(由斯金·约瑟夫于 bpo-8808

检查

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

(由Meador Inge和Nick Coghlan在 bpo-13062

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

(由Meador Inge在 bpo-15153

io

这个 open() 函数有一个新的 'x' 可用于独占创建新文件并引发 FileExistsError 如果文件已经存在。它基于到fopen()的C11“X”模式。

(大卫汤森在 bpo-12760

的构造函数 TextIOWrapper 类有新的 write_through 可选参数。如果 write_throughTrue ,调用 write() 保证不会被缓冲:任何数据写入 TextIOWrapper 对象被立即处理到其基础二进制缓冲区。

迭代工具

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

登录

这个 basicConfig() 函数现在支持可选 handlers 获取要添加到根记录器的可ITable处理程序的参数。

类级属性 append_nul 已添加到 SysLogHandler 允许控制 NUL (\000 )字节到系统日志记录,因为对于某些守护进程,它是必需的,而对于其他守护进程,它是传递给日志的。

数学

这个 math 模块具有新功能, log2() ,返回的以2为底的对数 x .

(作者:马克·狄金森 bpo-11888

MMAP

这个 read() 方法现在与其他类似文件的对象更兼容:如果参数被省略或指定为 None ,它将当前文件位置的字节返回到映射的末尾。(由Petri Lehtinen在 bpo-12021

多重处理

新的 multiprocessing.connection.wait() 函数允许超时轮询多个对象(如连接、套接字和管道)。(由Richard Oudkerk在 bpo-12328

multiprocessing.Connection 对象现在可以通过多处理连接进行传输。(由Richard Oudkerk在 bpo-4892

multiprocessing.Process 现在接受 daemon 关键字参数来重写继承的默认行为 daemon 父进程的标志 (bpo-6064

新属性 multiprocessing.Process.sentinel 允许程序在多个 Process 使用适当的OS原语(例如, select 在POSIX系统上)。

新方法 multiprocessing.pool.Pool.starmap()starmap_async() 提供 itertools.starmap() 相当于现有 multiprocessing.pool.Pool.map()map_async() 功能。(由Hynek Schlawack在 bpo-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')
>>>

(由Giampaolo Rodol_在 bpo-9795

操作系统

pdb

选项卡完成功能现在不仅可以用于命令名,还可以用于它们的参数。例如,对于 break 命令、函数和文件名已完成。

(乔治布兰德尔在 bpo-14210

泡菜

pickle.Pickler 对象现在有一个可选的 dispatch_table 允许设置每个pickler缩减函数的属性。

(由Richard Oudkerk在 bpo-14166

pydoc

tk gui和 serve() 函数已从中删除 pydoc 模块: pydoc -gserve() 在python 3.2中已被弃用。

重新

str 正则表达式现在支持 \u\U 逃逸。

(Serhiy Storchaka在 bpo-3665

谢德

  • run() 现在接受 blocking 参数,当设置为false时,该参数使方法最快(如果有)执行因过期而导致的计划事件,然后立即返回。如果您想使用 scheduler 在非阻塞应用程序中。(由Giampaolo Rodol_在 bpo-13449

  • scheduler 类现在可以安全地在多线程环境中使用。(由Josiah Carlson和Giampaolo Rodol_在 bpo-8684

  • 时间函数延迟函数 参数 scheduler 类构造函数现在是可选的,默认为 time.time()time.sleep() 分别。(Chris Clark在 bpo-13245

  • enter()enterabs() 参数 参数现在是可选的。(Chris Clark在 bpo-13245

  • enter()enterabs() 现在接受 关键字参数 参数。(Chris Clark在 bpo-13245

选择

Solaris和衍生平台有一个新的类 select.devpoll 对于高性能异步套接字,通过 /dev/poll . (由Jes_s Cea Avi_n在 bpo-6397

施莱克斯

以前未记录的助手函数 quotepipes 模块已移动到 shlex 模块和文件。 quote() 正确地转义字符串中的所有字符,否则shell可能赋予这些字符特殊的含义。

shutil

  • 新功能:

    • disk_usage() :提供总磁盘空间、已用磁盘空间和可用磁盘空间统计信息。(由Giampaolo Rodol_在 bpo-12442

    • chown() :允许更改给定路径的用户和/或组,同时指定用户/组名称,而不仅仅是它们的数字ID。(Sandro Tosi在 bpo-12191

    • shutil.get_terminal_size() :返回解释器所连接的终端窗口的大小。(由Zbigniew J_Drzejewski Szmek于 bpo-13609

  • copy2()copystat() 现在,在支持文件时间戳的平台上以纳秒精度保留文件时间戳。它们还保留Linux上的文件“扩展属性”。(拉里·黑斯廷斯在 bpo-14127bpo-15238

  • 现在有几个函数是可选的 symlinks 参数:当该参数为真时,符号链接不会被取消引用,而操作会作用于符号链接本身(或创建一个,如果相关的话)。(由Hynek Schlawack在 bpo-12715

  • 将文件复制到其他文件系统时, move() 现在按照posix的方式处理符号链接 mv 命令执行,重新创建symlink而不是复制目标文件内容。(乔纳森尼霍夫在 bpo-9993move() 现在还返回 dst 结果是变元。

  • rmtree() 现在可以抵抗对支持新系统的平台的symlink攻击 dir_fd 参数在 os.open()os.unlink() . (马丁·冯·卢维斯和海尼克·施拉瓦克在 bpo-4489

信号

短信网关

这个 smtpd 模块现在支持 RFC 5321 (扩展SMTP)和 RFC 1870 (尺寸扩展)。根据标准,只有当客户端使用 EHLO 命令。

(初始) ELHO 阿尔贝托·特雷维诺的支持。Juhana Jauhiainen的尺寸扩展。Michele Orr_和Dan Boswell为该补丁提供了大量额外工作。 bpo-8739

SMTPLIB

这个 SMTPSMTP_SSLLMTP 课程现在接受 source_address 关键字参数以指定 (host, port) 在创建传出套接字时用作绑定调用中的源地址。(保罗斯卡丁在 bpo-11281

SMTP 现在支持上下文管理协议,允许 SMTP 要在中使用的实例 with 语句。(由Giampaolo Rodol_在 bpo-11289

这个 SMTP_SSL 构造函数和 starttls() 方法现在接受sslcontext参数来控制安全通道的参数。(由Kasun Herath于 bpo-8809

Socket

socketserver

BaseServer 现在有一个可重写的方法 service_actions() 那是由 serve_forever() 服务循环中的方法。 ForkingMixIn 现在使用它来清理僵尸子进程。(Justin Warkentin在 bpo-11109

sqlite3

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

SSL

斯达

未记录的tarfile.filemode函数已移动到 stat.filemode() .它可用于将文件模式转换为“-rwxrwxrwx”形式的字符串。

(由Giampaolo Rodol_在 bpo-14807

结构

这个 struct 模块现在支持 ssize_tsize_t 通过新代码 nN ,分别。(由Antoine Pitrou在 bpo-3163

子过程

命令字符串现在可以是POSIX平台上的字节对象。(由Victor Stinner在 bpo-8513

一个新常数 DEVNULL 允许以独立于平台的方式抑制输出。(由Ross Lagerwall在 bpo-5870

系统

这个 sys 模块有一个新的 thread_info named tuple 保存有关线程实现的信息 (bpo-11223

tarfile

tarfile 现在支持 lzma 通过 lzma 模块。(由Lars Gust_bel in提供) bpo-5689

临时文件

tempfile.SpooledTemporaryFiletruncate() 方法现在接受 size 参数。(由Ryan Kelly在 bpo-9957

文本片段

这个 textwrap 模块有一个新的 indent() 这使得向文本块中的选定行添加公共前缀变得简单易行。 (bpo-13857

线程加工

threading.Conditionthreading.Semaphorethreading.BoundedSemaphorethreading.Eventthreading.Timer ,所有这些函数以前都是返回类实例的factory函数,现在都是类,可以是子类。(由_ric Araujo在 bpo-10968

这个 threading.Thread 构造函数现在接受 daemon 关键字参数来重写继承的默认行为 daemon 父线程的标志值 (bpo-6064

以前的私人职能 _thread.get_ident 现在作为公共功能提供 threading.get_ident() . 这消除了几个直接访问 _thread stdlib中的模块。使用的第三方代码 _thread.get_ident 同样,也应该更改为使用新的公共接口。

时间

这个 PEP 418 向添加了新函数 time 模块:

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

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

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

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

其他新功能:

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

类型

添加新的 types.MappingProxyType 类:映射的只读代理。 (bpo-14386

新功能 types.new_class()types.prepare_class() 为…提供支持 PEP 3115 兼容的动态类型创建。 (bpo-14588

单元测试

assertRaises()assertRaisesRegex()assertWarns()assertWarnsRegex() 现在接受关键字参数 msg 用作上下文管理器时。(由Ezio Melotti和Winston Ewert于 bpo-10775

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

urllib

这个 Request 类,现在接受 方法 参数使用者 get_method() 确定应该使用什么HTTP方法。例如,这将发送一个 'HEAD' 要求:

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

(bpo-1673007

控件

这个 webbrowser 模块支持更多的“浏览器”:Google Chrome(命名为 chromechromiumchrome-browserchromium-browser 取决于版本和操作系统),以及通用启动器 xdg-open ,来自freedesktop.org项目,以及 gvfs-open ,这是GNOME3的默认URI处理程序。(前者由阿尔诺·卡尔梅茨在 bpo-13620 后者由马提亚斯·克洛泽在 bpo-14493

xml.etree.ElementTree

这个 xml.etree.ElementTree 模块现在默认导入其C加速器;不再需要显式导入 xml.etree.cElementTree (此模块保持向后兼容性,但现在已弃用)。此外, iter 方法家族 Element 已优化(在C中重写)。模块的文档也得到了极大的改进,增加了示例和更详细的参考资料。

ZLIB

新属性 zlib.Decompress.eof 使区分正确形成的压缩流和不完整或截断的流成为可能。(Nadeem Vawda在 bpo-12646

新属性 zlib.ZLIB_RUNTIME_VERSION 报告基础的版本字符串 zlib 运行时加载的库。(由Torsten Landschoff在 bpo-12306

优化

增加了主要的性能增强:

  • 多亏了 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

构建和C API更改

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

已弃用

不支持的操作系统

由于缺少维护人员,OS/2和VM不再受支持。

Windows 2000和Windows平台 COMSPECcommand.com 由于维护负担,不再支持。

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

不推荐使用的python模块、函数和方法

C API的函数和类型已弃用

这个 Py_UNICODE 已被否决 PEP 393 将在python 4中删除。不推荐使用此类型的所有函数:

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

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

Encoders:

不推荐使用的功能

这个 array 模块的 'u' 格式代码现在已被弃用,并将在python 4中连同 (Py_UNICODE )API。

移植到python 3.3

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

移植python代码

  • 默认情况下启用hash随机化。设置 PYTHONHASHSEED 环境变量到 0 禁用hash随机化。也见 object.__hash__() 方法。

  • bpo-12326 :在Linux上,sys.platform不再包含主版本。它现在总是“linux”,而不是“linux2”或“linux3”,这取决于用于构建python的linux版本。将sys.platform=='linux2'替换为sys.platform.startswith('linux'),或者直接将sys.platform='linux'替换为不需要支持旧版本的python。

  • bpo-13847bpo-14180timedatetimeOverflowError 现在引发而不是 ValueError 如果时间戳超出范围。 OSError 如果C函数为 gmtime()localtime() 失败。

  • 导入使用的默认查找器现在使用特定目录中包含的内容的缓存。如果创建一个python源文件或无源字节码文件,请确保调用 importlib.invalidate_caches() 清除缓存以便查找者注意新文件。

  • ImportError 现在使用尝试导入的模块的全名。检查importerrors消息的doctest需要更新以使用模块的全名,而不仅仅是名称的尾部。

  • 这个 index 参数 __import__() 现在默认为0而不是-1,不再支持负值。当时是个疏忽 PEP 328 实现了默认值保持为-1。如果需要继续执行相对导入,然后执行绝对导入,则使用索引1执行相对导入,然后使用索引0执行其他导入。不过,您最好使用 importlib.import_module() 而不是调用 __import__() 直接。

  • __import__() 对于顶级模块,不再允许使用0以外的索引值。例如。 __import__('sys', level=1) 现在是一个错误。

  • 因为 sys.meta_pathsys.path_hooks 现在,默认情况下会有finders,您很可能希望使用 list.insert() 而不是 list.append() 添加到这些列表中。

  • 因为 None 现在插入到 sys.path_importer_cache ,如果清除路径字典中没有查找器的条目,则需要删除与值配对的键。 None and imp.NullImporter 向后兼容。这将导致重新插入的旧版本python的额外开销 None 进入之内 sys.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() 方法。

  • 长期存在的RFC遵从性错误 (bpo-1079 )在分析过程中 email.header.decode_header() 已修复。使用标准惯例将编码的头转换为Unicode的代码 (str(make_header(decode_header(h)) )将看不到任何更改,但查看decode头返回的各个元组的代码将看到前面或后面的空白。 ASCII 部分现在包含在 ASCII 部分。使用生成头的代码 make_header 也应该继续工作而不改变,因为 make_header 继续添加空格 ASCII 以及非``ascii``部分(如果输入字符串中不存在)。

  • email.utils.formataddr() 现在,当传递非``ascii``显示名称时,执行正确的内容传输编码。任何依赖于以前错误行为的代码,在格式化的输出字符串中保留非``ascii``unicode,都需要更改。 (bpo-1690608

  • poplib.POP3.quit() 现在可能会像其他所有协议一样引发协议错误 poplib 方法。假设的代码 quit 不提高 poplib.error_proto 如果发生错误,可能需要更改错误 quit 特定应用程序遇到的 (bpo-11291

  • 这个 strict 参数 email.parser.Parser ,自python 2.4以来已弃用,已最终删除。

  • 弃用的方法 unittest.TestCase.assertSameElements 已删除。

  • 已弃用的变量 time.accept2dyear 已删除。

  • 被蔑视的 Context._clamp 属性已从中删除 decimal 模块。它以前被public属性替换 clamp . (见 bpo-8540

  • 未记录的内部帮助程序类 SSLFakeFile 已从中删除 smtplib ,因为它的功能早已由 socket.socket.makefile() .

  • 将负值传递给 time.sleep() 在Windows上,现在会引发错误,而不是永远休眠。它总是在POSIX上引发错误。

  • 这个 ast.__version__ 常量已删除。如果需要做出受AST版本影响的决策,请使用 sys.version_info 做出决定。

  • 用于解决以下事实的代码: threading 通过对私有类进行子类化而使用factory函数的模块将需要更改为现在的公共类的子类。

  • 线程模块中未记录的调试机器已被删除,从而简化了代码。这对生产代码应该没有影响,但是这里提到的是在任何应用程序调试框架与之交互的情况下。 (bpo-13550

C代码移植

C栋扩建

  • C扩展名的可能文件名范围已经缩小。很少使用的拼写已被禁止:在posix下,文件名为 xxxmodule.soxxxmodule.abi3.soxxxmodule.cpython-*.so 不再被认为是执行 xxx 模块。如果生成了这样的文件,则必须切换到其他拼写(即删除 module 文件名中的字符串)。

    (实施) bpo-14040

命令行开关更改

  • 已删除-q命令行标志和相关构件。代码检查sys.flags.divisionu警告需要更新。

    (bpo-10998 ,由_ric Araujo提供。)

  • 什么时候? python 开始于 -Simport site 将不再向模块搜索路径添加特定于站点的路径。在以前的版本中,它做到了。

    (bpo-11591 由Carl Meyer提供,版本由_ric Araujo提供。)