python 3.3的新功能¶
本文解释了与3.2相比,python 3.3中的新特性。python 3.3于2012年9月29日发布。有关详细信息,请参阅 changelog .
参见
PEP 398 -python 3.3发布计划
总结——发布亮点¶
新语法功能:
新的
yield from
表达式 generator delegation .这个
u'unicode'
语法再次被接受str
物体。
新库模块:
faulthandler
(帮助调试低级崩溃)ipaddress
(表示IP地址和掩码的高级对象)lzma
(使用XZ/LZMA算法压缩数据)unittest.mock
(用模拟对象替换测试中的系统部分)venv
( Python ) virtual environments 就像在大众中一样virtualenv
封装)
新的内置功能:
实施改进:
重写 import machinery 基于
importlib
.更紧凑 unicode strings .
更紧凑 attribute dictionaries .
显著改进了库模块:
C加速器 decimal 模块。
更好的Unicode处理 email 模块 (provisional )
安全改进:
默认情况下,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 Changes 和 Porting 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+0000
到U+10FFFF
)窄构建和宽构建之间的区别已经不复存在,而且Python现在的行为就像一个宽构建,甚至在Windows下。随着窄版本的终结,特定于窄版本的问题也得到了解决,例如:
len()
现在总是为非BMP字符返回1,因此len('\U0010FFFF') == 1
;代理项对不在字符串文本中重新组合,因此
'\uDBFF\uDFFF' != '\U0010FFFF'
;索引或切片非BMP字符返回预期值,因此
'\U0010FFFF'[0]
现在回报'\U0010FFFF'
而不是'\uDBFF'
;标准库中的所有其他函数现在都可以正确处理非BMP代码点。
价值
sys.maxunicode
现在总是1114111
(0x10FFFF
十六进制)。这个PyUnicode_GetMax()
函数仍返回0xFFFF
或0x10FFFF
为了向后兼容,它不应该与新的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异常层次结构¶
操作系统错误引发的异常层次结构现在既简化了,也更加细化了。
您不必再担心在 OSError
, IOError
, EnvironmentError
, WindowsError
, mmap.error
, socket.error
或 select.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]
推动这一变化的主要原则是允许设计用于 send
和 throw
方法被拆分为多个子生成器,就像单个大函数一样容易,可以拆分为多个子函数。
参见
- 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.Signature
, inspect.Parameter
和 inspect.BoundArguments
保存有关调用签名的信息,如注释、默认值、参数类型和绑定参数,这大大简化了编写装饰符和验证或修改调用签名或参数的任何代码。
参见
- PEP 362 :-函数签名对象
由Brett Cannon、Yury Selivanov、Larry Hastings、Jiwon SEO编写的PEP;由Yury Selivanov实施。
PEP 421:添加sys.implementation¶
上的新属性 sys
模块公开特定于当前运行的解释器实现的详细信息。上的初始属性集 sys.implementation
是 name
, version
, hexversion
和 cache_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
. 与基于映射的命名空间不同,比如 dict
, SimpleNamespace
是基于属性的,比如 object
.但是,不同于 object
, SimpleNamespace
实例是可写的。这意味着您可以通过普通属性访问来添加、删除和修改命名空间。
参见
- 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 finders 和 path entry finders 通过介绍 importlib.abc.MetaPathFinder
和 importlib.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
现在有 name
和 path
当需要提供相关数据时设置的属性。导入失败的消息现在还将提供模块的全名,而不仅仅是模块名称的尾部。
这个 importlib.invalidate_caches()
函数现在将对缓存在中的所有查找器调用同名的方法 sys.path_importer_cache
根据需要帮助清除任何存储状态。
可见变化¶
有关可能需要对代码进行的更改,请参阅 Porting Python code 部分。
超越了什么的广袤 importlib
现在公开了,还有其他可见的更改要导入。最大的是 sys.meta_path
和 sys.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
这个
count()
,find()
,rfind()
,index()
和rindex()
方法bytes
和bytearray
对象现在接受一个介于0和255之间的整数作为其第一个参数。(由Petri Lehtinen在 bpo-12170 )
这个
rjust()
,ljust()
和center()
方法bytes
和bytearray
现在接受bytearray
对于fill
参数。(由Petri Lehtinen在 bpo-12380 )新方法已添加到
list
和bytearray
:copy()
和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()
获取新的 开瓶器 参数:然后通过调用 开瓶器 用( file , flags )它可以用于使用自定义标志,如os.O_CLOEXEC
例如。这个'x'
已添加模式:以独占创建方式打开,如果文件已存在则失败。print()
增加了 脸红 关键字参数。如果 脸红 关键字参数为true,强制刷新流。hash()
:默认情况下已启用hash随机化,请参见object.__hash__()
和PYTHONHASHSEED
.这个
str
类型获得新的casefold()
方法:返回一个折叠后的字符串副本,可以使用折叠后的字符串进行无大小写匹配。例如,'ß'.casefold()
返回'ss'
.序列文档被大量重写,以便更好地解释二进制/文本序列的区别,并为各个内置序列类型提供特定的文档部分。 (bpo-4966 )
新模块¶
faulthandler¶
这个新的调试模块 faulthandler
包含在错误(崩溃,如分段错误)、超时后或用户信号上显式转储python跟踪的函数。调用 faulthandler.enable()
为安装故障处理程序 SIGSEGV
, SIGFPE
, SIGABRT
, SIGBUS
和 SIGILL
信号。您还可以通过设置 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__
作为动态更新的属性。内置描述符已相应地更新。
abc.abstractproperty
已弃用,请使用property
具有abc.abstractmethod()
相反。
abc.abstractclassmethod
已弃用,请使用classmethod
具有abc.abstractmethod()
相反。
abc.abstractstaticmethod
已弃用,请使用staticmethod
具有abc.abstractmethod()
相反。
(由Darren Dale在 bpo-11610 )
abc.ABCMeta.register()
现在返回已注册的子类,这意味着它现在可以用作类修饰器。 (bpo-10868 )
数组¶
这个 array
模块支持 long long 使用类型 q
和 Q
类型代码。
(由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
模块已从头重写。在此过程中,添加了几个新功能:
新的
bz2.open()
函数:以二进制或文本模式打开bzip2压缩文件。bz2.BZ2File
现在可以通过其构造函数的 文件对象 参数。(Nadeem Vawda在 bpo-5863 )
bz2.BZ2File
和bz2.decompress()
现在可以解压缩多流输入(例如 pbzip2 工具)。bz2.BZ2File
现在还可以使用'a'
(追加)模式。(由NIR助手在 bpo-1625 )
bz2.BZ2File
现在实现所有io.BufferedIOBase
API,除了detach()
和truncate()
方法。
解码器¶
这个 mbcs
已重写编解码器以正确处理 replace
和 ignore
所有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 )
日期时间¶
幼稚与清醒的平等比较
datetime
实例现在返回False
而不是提高TypeError
(bpo-15006 )新的
datetime.datetime.timestamp()
方法:返回与datetime
实例。这个
datetime.datetime.strftime()
方法支持格式化早于1000年的年份。这个
datetime.datetime.astimezone()
现在可以在不带参数的情况下调用方法来将datetime实例转换为系统时区。
十进制的¶
- 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
在上下文模板中 (
DefaultContext
,BasicContext
和ExtendedContext
)的大小Emax
和Emin
已经改变为999999
.这个
Decimal
decimal.py中的构造函数不遵守上下文限制,并精确地转换具有任意指数或精度的值。由于C版本有内部限制,因此使用以下方案:如果可能,将精确转换值,否则InvalidOperation
结果是NaN。在后一种情况下,始终可以使用create_decimal()
为了获得一个四舍五入或不精确的值。decimal.py中的幂函数始终正确四舍五入。在C版本中,它是根据正确的四舍五入定义的。
exp()
和ln()
函数,但最终结果只是“几乎总是正确的四舍五入”。在C版本中,包含信号的上下文字典是
MutableMapping
. 由于速度原因,flags
和traps
总是指相同的MutableMapping
上下文是用初始化的。如果分配了新的信号字典,flags
和traps
用新值更新,但它们不引用rhs字典。腌渍A
Context
生成不同的输出,以便为Python和C版本使用通用的交换格式。这个
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
7bit
或8bit
.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
,您可以在设置 parser
或 Message
,无论您的程序使用哪个来创建 Message
物体。另一方面,如果您需要以多种形式生成消息,您仍然可以在适当的 generator
调用。或者,您可以为不同的案例拥有自定义策略实例,并在创建 generator
.
带有新标题API的临时政策¶
虽然策略框架本身是值得的,但引入它的主要动机是允许创建新的策略,以保持对不使用新策略的人的向后兼容性的方式为电子邮件包实现新功能。因为新的策略引入了新的API,所以我们在python 3.3中作为 provisional policy . 如果核心开发人员认为必要,可能会发生向后不兼容的更改(直到并包括删除代码)。
新策略是 EmailPolicy
,并添加以下附加控件:
这个 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>'
分析消息时,可以使用 addresses
和 groups
要访问组和单个地址的头对象的属性:
>>> m2['cc'].addresses
(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com'), Address(display_name='Bonzo', username='bonz', domain='laugh.com'))
>>> m2['cc'].groups
(Group(display_name='pals', addresses=(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com')), Group(display_name=None, addresses=(Address(display_name='Bonzo', username='bonz', domain='laugh.com'),))
总之,如果您使用其中一个新策略,那么头操作的工作方式应该是这样的:您的应用程序使用Unicode字符串,并且电子邮件包透明地对与RFC标准内容传输编码之间的Unicode进行编码和解码。
其他API变更¶
新的 BytesHeaderParser
,添加到 parser
补充模块 HeaderParser
并完成字节API。
新的实用功能:
format_datetime()
给定一个datetime
,生成一个格式为在电子邮件头中使用的字符串。
parsedate_to_datetime()
:给定电子邮件头中的日期字符串,将其转换为Awaredatetime
或者天真datetime
如果偏移量为-0000
.
localtime()
:不带参数,返回当前本地时间作为已知时间datetime
使用本地timezone
. 有意识的datetime
,将其转换为意识datetime
使用本地timezone
.
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-15114 和 bpo-14538 , bpo-13993 , bpo-13960 , bpo-13358 , bpo-1745761 , bpo-755670 , bpo-13357 , bpo-12629 , bpo-1200313 , bpo-670664 , bpo-13273 , bpo-12888 , bpo-7311 )
一个新的 html5
将HTML5命名字符引用映射到等效Unicode字符(例如 html5['gt;'] == '>'
)已添加到 html.entities
模块。字典现在也被 HTMLParser
. (由Ezio Melotti在 bpo-11113 和 bpo-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_through 是 True
,调用 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 )
操作系统¶
这个
os
模块有一个新的pipe2()
使创建管道O_CLOEXEC
或O_NONBLOCK
标志自动设置。这对于避免多线程程序中的竞争条件特别有用。这个
os
模块有一个新的sendfile()
函数,它为将数据从一个文件(或套接字)描述符复制到另一个文件(或套接字)描述符提供了一种有效的“零复制”方法。短语“零复制”是指两个描述符之间的所有数据复制都完全由内核完成,而不将数据复制到用户空间缓冲区。sendfile()
可用于有效地将数据从磁盘上的文件复制到网络套接字,例如用于下载文件。(补丁由Ross Lagerwall和Giampaolo Rodol_in提交 bpo-10882 )
为了避免类似symlink攻击和临时文件和目录的争用情况,更可靠(也更快)地操作文件描述符而不是文件名。python 3.3增强了现有的函数,并引入了新的函数来处理文件描述符。 (bpo-4761 , bpo-10755 和 bpo-14626 )
这个
os
模块有一个新的fwalk()
功能类似于walk()
除此之外,它还生成引用所访问目录的文件描述符。这对于避免符号链接竞赛特别有用。以下函数是新的可选函数 dir_fd (paths relative to directory descriptors )和/或 follow_symlinks (not following symlinks ):
access()
,chflags()
,chmod()
,chown()
,link()
,lstat()
,mkdir()
,mkfifo()
,mknod()
,open()
,readlink()
,remove()
,rename()
,replace()
,rmdir()
,stat()
,symlink()
,unlink()
,utime()
.可以通过集合检查使用这些参数的平台支持os.supports_dir_fd
和os.supports_follows_symlinks
.以下函数现在支持其路径参数的文件描述符:
chdir()
,chmod()
,chown()
,execve()
,listdir()
,pathconf()
,exists()
,stat()
,statvfs()
,utime()
. 平台支持可通过os.supports_fd
集合。
access()
接受一个effective_ids
要在访问检查中使用有效的uid/gid而不是实际的uid/gid打开的关键字参数。平台支持可通过supports_effective_ids
集合。这个
os
模块有两个新功能:getpriority()
和setpriority()
.它们可用于以类似于os.nice()
但扩展到所有进程,而不仅仅是当前进程。(Giampaolo Rodol_在 bpo-10784 )
新的
os.replace()
函数允许跨平台重命名覆盖目标的文件。用os.rename()
,在POSIX下覆盖现有目标文件,但在Windows下引发错误。(由Antoine Pitrou在 bpo-8828 )stat函数系列 (
stat()
,fstat()
和lstat()
)现在支持以纳秒精度读取文件的时间戳。对称地,utime()
现在可以以纳秒精度写入文件时间戳。(拉里·黑斯廷斯在 bpo-14127 )新的
os.get_terminal_size()
函数查询附加到文件描述符的终端的大小。也见shutil.get_terminal_size()
.(由Zbigniew J_Drzejewski Szmek于 bpo-13609 )
支持Linux扩展属性的新功能 (bpo-12720 ):
getxattr()
,listxattr()
,removexattr()
,setxattr()
.调度程序的新接口。这些函数控制操作系统如何分配进程的CPU时间。新功能:
sched_get_priority_max()
,sched_get_priority_min()
,sched_getaffinity()
,sched_getparam()
,sched_getscheduler()
,sched_rr_get_interval()
,sched_setaffinity()
,sched_setparam()
,sched_setscheduler()
,sched_yield()
,控制文件系统的新功能:
posix_fadvise()
:声明打算以特定模式访问数据,从而允许内核进行优化。posix_fallocate()
:确保为文件分配足够的磁盘空间。sync()
:强制将所有内容写入磁盘。
其他新的POSIX函数:
lockf()
:在打开的文件描述符上应用、测试或删除posix锁。pread()
:从文件描述符读取偏移量时,文件偏移量保持不变。pwrite()
:从偏移量写入文件描述符,保持文件偏移量不变。readv()
:从文件描述符读取到许多可写缓冲区。truncate()
:截断对应于 path 所以最多 长度 字节大小。waitid()
:等待一个或多个子进程完成。writev()
:写入 缓冲器 到文件描述符,其中 缓冲器 是一个任意的缓冲区序列。getgrouplist()
(bpo-9344 ):返回指定用户所属的组ID列表。
一些平台现在支持
lseek()
功能,例如os.SEEK_HOLE
和os.SEEK_DATA
.新常量
RTLD_LAZY
,RTLD_NOW
,RTLD_GLOBAL
,RTLD_LOCAL
,RTLD_NODELETE
,RTLD_NOLOAD
和RTLD_DEEPBIND
在支持它们的平台上可用。这些是和sys.setdlopenflags()
函数,并取代中定义的类似常量ctypes
和DLFCN
.(由Victor Stinner在 bpo-13226 )os.symlink()
现在接受(忽略)了target_is_directory
非Windows平台上的关键字参数,以简化跨平台支持。
pdb¶
选项卡完成功能现在不仅可以用于命令名,还可以用于它们的参数。例如,对于 break
命令、函数和文件名已完成。
(乔治布兰德尔在 bpo-14210 )
泡菜¶
pickle.Pickler
对象现在有一个可选的 dispatch_table
允许设置每个pickler缩减函数的属性。
(由Richard Oudkerk在 bpo-14166 )
pydoc¶
tk gui和 serve()
函数已从中删除 pydoc
模块: pydoc -g
和 serve()
在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 )
施莱克斯¶
以前未记录的助手函数 quote
从 pipes
模块已移动到 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-14127 和 bpo-15238 )现在有几个函数是可选的
symlinks
参数:当该参数为真时,符号链接不会被取消引用,而操作会作用于符号链接本身(或创建一个,如果相关的话)。(由Hynek Schlawack在 bpo-12715 )将文件复制到其他文件系统时,
move()
现在按照posix的方式处理符号链接mv
命令执行,重新创建symlink而不是复制目标文件内容。(乔纳森尼霍夫在 bpo-9993 )move()
现在还返回dst
结果是变元。rmtree()
现在可以抵抗对支持新系统的平台的symlink攻击dir_fd
参数在os.open()
和os.unlink()
. (马丁·冯·卢维斯和海尼克·施拉瓦克在 bpo-4489 )
信号¶
这个
signal
模块具有新功能:pthread_sigmask()
:获取和/或更改调用线程的信号屏蔽(由Jean-Paul Calderone在 bpo-8407 ;pthread_kill()
:向线程发送信号;sigpending()
:检查挂起的功能;sigwait()
:等待信号;sigwaitinfo()
:等待信号,返回详细信息;sigtimedwait()
类似于sigwaitinfo()
但是超时了。
信号处理程序将信号号作为单个字节而不是nul字节写入唤醒文件描述符。因此,可以等待多个信号,并知道发出了哪些信号。
signal.signal()
和signal.siginterrupt()
引发OSError,而不是运行时错误:OSError具有errno属性。
短信网关¶
这个 smtpd
模块现在支持 RFC 5321 (扩展SMTP)和 RFC 1870 (尺寸扩展)。根据标准,只有当客户端使用 EHLO
命令。
(初始) ELHO
阿尔贝托·特雷维诺的支持。Juhana Jauhiainen的尺寸扩展。Michele Orr_和Dan Boswell为该补丁提供了大量额外工作。 bpo-8739 )
SMTPLIB¶
这个 SMTP
, SMTP_SSL
和 LMTP
课程现在接受 source_address
关键字参数以指定 (host, port)
在创建传出套接字时用作绑定调用中的源地址。(保罗斯卡丁在 bpo-11281 )
SMTP
现在支持上下文管理协议,允许 SMTP
要在中使用的实例 with
语句。(由Giampaolo Rodol_在 bpo-11289 )
这个 SMTP_SSL
构造函数和 starttls()
方法现在接受sslcontext参数来控制安全通道的参数。(由Kasun Herath于 bpo-8809 )
Socket¶
这个
socket
类现在公开了在基础平台支持时处理辅助数据的其他方法:(大卫·沃森在 bpo-6560 (基于之前Heiko Wundram的补丁)
这个
socket
类现在支持Linux上的pf_can协议系列(https://en.wikipedia.org/wiki/socketcan)(https://lwn.net/articles/253425)。(由Matthias Fuchs提供,Tiago Gon_Alves in更新) bpo-10141 )
这个
socket
类现在支持pf-rds协议系列(https://en.wikipedia.org/wiki/reliable-datagram-sockets和https://oss.oracle.com/projects/rds/)。这个
socket
类现在支持PF_SYSTEM
OS X协议家族(由Michael Goderbauer在 bpo-13777 )新功能
sethostname()
如果调用进程具有足够的权限,则允许在UNIX系统上设置主机名。(由Ross Lagerwall在 bpo-10866 )
socketserver¶
BaseServer
现在有一个可重写的方法 service_actions()
那是由 serve_forever()
服务循环中的方法。 ForkingMixIn
现在使用它来清理僵尸子进程。(Justin Warkentin在 bpo-11109 )
sqlite3¶
新的 sqlite3.Connection
方法 set_trace_callback()
可用于捕获由sqlite处理的所有SQL命令的跟踪。(由Torsten Landschoff在 bpo-11688 )
SSL¶
这个
ssl
模块具有两个新的随机生成功能:RAND_bytes()
:生成加密的强伪随机字节。RAND_pseudo_bytes()
:生成伪随机字节。
(由Victor Stinner在 bpo-12049 )
这个
ssl
模块现在公开了一个更细粒度的异常层次结构,以便更容易地检查各种错误。(由Antoine Pitrou在 bpo-11183 )load_cert_chain()
现在接受 密码 用于加密私钥的参数。(由亚当·辛普金斯在 bpo-12803 )Diffie-Hellman密钥交换(基于正则和椭圆曲线)现在通过
load_dh_params()
和set_ecdh_curve()
方法。(由Antoine Pitrou在 bpo-13626 和 bpo-13627 )SSL套接字有一个新的
get_channel_binding()
方法,允许实现某些身份验证机制,如scram-sha-1-plus。(由Jacek Konieczny于 bpo-12551 )您可以查询ssl套接字使用的ssl压缩算法,这归功于它的新功能
compression()
方法。新属性OP_NO_COMPRESSION
可用于禁用压缩。(由Antoine Pitrou在 bpo-13634 )已添加对下一个协议协商扩展的支持,使用
ssl.SSLContext.set_npn_protocols()
方法。(由科林·马克在 bpo-14204 )这个
get_server_certificate()
函数现在支持IPv6。(由Charles Fran_ois Natali于 bpo-11811 )新属性
OP_CIPHER_SERVER_PREFERENCE
允许将sslv3服务器套接字设置为使用服务器的密码排序首选项,而不是客户端的 (bpo-13635 )
斯达¶
未记录的tarfile.filemode函数已移动到 stat.filemode()
.它可用于将文件模式转换为“-rwxrwxrwx”形式的字符串。
(由Giampaolo Rodol_在 bpo-14807 )
结构¶
这个 struct
模块现在支持 ssize_t
和 size_t
通过新代码 n
和 N
,分别。(由Antoine Pitrou在 bpo-3163 )
子过程¶
命令字符串现在可以是POSIX平台上的字节对象。(由Victor Stinner在 bpo-8513 )
系统¶
这个 sys
模块有一个新的 thread_info
named tuple 保存有关线程实现的信息 (bpo-11223 )
tarfile¶
tarfile
现在支持 lzma
通过 lzma
模块。(由Lars Gust_bel in提供) bpo-5689 )
临时文件¶
tempfile.SpooledTemporaryFile
的 truncate()
方法现在接受 size
参数。(由Ryan Kelly在 bpo-9957 )
文本片段¶
这个 textwrap
模块有一个新的 indent()
这使得向文本块中的选定行添加公共前缀变得简单易行。 (bpo-13857 )
线程加工¶
threading.Condition
, threading.Semaphore
, threading.BoundedSemaphore
, threading.Event
和 threading.Timer
,所有这些函数以前都是返回类实例的factory函数,现在都是类,可以是子类。(由_ric Araujo在 bpo-10968 )
这个 threading.Thread
构造函数现在接受 daemon
关键字参数来重写继承的默认行为 daemon
父线程的标志值 (bpo-6064 )
以前的私人职能 _thread.get_ident
现在作为公共功能提供 threading.get_ident()
. 这消除了几个直接访问 _thread
stdlib中的模块。使用的第三方代码 _thread.get_ident
同样,也应该更改为使用新的公共接口。
时间¶
get_clock_info()
:获取时钟上的信息。monotonic()
:单调时钟(不能后退),不受系统时钟更新的影响。perf_counter()
:具有可测量短时间的最高可用分辨率的性能计数器。process_time()
:当前进程的系统和用户CPU时间之和。
其他新功能:
clock_getres()
,clock_gettime()
和clock_settime()
函数与CLOCK_xxx
常量。(由Victor Stinner在 bpo-10278 )
为了提高跨平台的一致性, 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(命名为 chrome , chromium , chrome-browser 或 chromium-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 )
优化¶
增加了主要的性能增强:
构建和C API更改¶
对python构建过程和C API的更改包括:
新的 PEP 3118 相关功能:
PEP 393 添加了新的Unicode类型、宏和函数:
高级API:
低级API:
PyArg_ParseTuple
现在接受bytearray
对于c
格式 (bpo-12380 )
已弃用¶
不支持的操作系统¶
由于缺少维护人员,OS/2和VM不再受支持。
Windows 2000和Windows平台 COMSPEC
到 command.com
由于维护负担,不再支持。
3.2中已弃用的OSF支持已完全删除。
不推荐使用的python模块、函数和方法¶
将非空字符串传递给
object.__format__()
已弃用,将生成TypeError
在Python 3.4中 (bpo-9856 )这个
unicode_internal
编解码器已被弃用,因为 PEP 393 ,使用UTF-8、UTF-16 (utf-16-le
或utf-16-be
)或UTF 32 (utf-32-le
或utf-32-be
)ftplib.FTP.nlst()
andftplib.FTP.dir()
: useftplib.FTP.mlsd()
platform.popen()
使用subprocess
模块。特别是检查 用替换旧函数 subprocess 模块 部分 (bpo-11377 )bpo-13374 :Windows字节API在
os
模块。使用Unicode文件名,而不是字节文件名,以不再依赖于ANSI代码页,并支持任何文件名。bpo-13988 :
xml.etree.cElementTree
模块已弃用。只要可用,加速器就会自动使用。行为
time.clock()
取决于平台:使用新的time.perf_counter()
或time.process_time()
相反,根据您的需求,函数具有定义良好的行为。这个
os.stat_float_times()
函数已弃用。abc
模块:abc.abstractproperty
已弃用,请使用property
具有abc.abstractmethod()
相反。abc.abstractclassmethod
已弃用,请使用classmethod
具有abc.abstractmethod()
相反。abc.abstractstaticmethod
已弃用,请使用staticmethod
具有abc.abstractmethod()
相反。
importlib
包裹:importlib.abc.SourceLoader.path_mtime()
现在被否决,赞成importlib.abc.SourceLoader.path_stats()
字节码文件现在既存储源文件的修改时间,也存储编译字节码文件所用的源文件的大小。
C API的函数和类型已弃用¶
这个 Py_UNICODE
已被否决 PEP 393 将在python 4中删除。不推荐使用此类型的所有函数:
使用的Unicode函数和方法 Py_UNICODE
和 Py_UNICODE* 类型:
PyUnicode_FromUnicode
: usePyUnicode_FromWideChar()
orPyUnicode_FromKindAndData()
PyUnicode_AS_UNICODE
,PyUnicode_AsUnicode()
,PyUnicode_AsUnicodeAndSize()
: usePyUnicode_AsWideCharString()
PyUnicode_AS_DATA
: usePyUnicode_DATA
withPyUnicode_READ
andPyUnicode_WRITE
PyUnicode_GET_SIZE
,PyUnicode_GetSize()
: usePyUnicode_GET_LENGTH
orPyUnicode_GetLength()
PyUnicode_GET_DATA_SIZE
使用PyUnicode_GET_LENGTH(str) * PyUnicode_KIND(str)
(仅适用于准备就绪的字符串)PyUnicode_AsUnicodeCopy()
: usePyUnicode_AsUCS4Copy()
orPyUnicode_AsWideCharString()
PyUnicode_GetMax()
操作py_unicode*字符串的函数和宏:
Py_UNICODE_strlen
: usePyUnicode_GetLength()
orPyUnicode_GET_LENGTH
Py_UNICODE_strcat
: usePyUnicode_CopyCharacters()
orPyUnicode_FromFormat()
Py_UNICODE_strcpy
,Py_UNICODE_strncpy
,Py_UNICODE_COPY
: usePyUnicode_CopyCharacters()
orPyUnicode_Substring()
Py_UNICODE_strcmp
: usePyUnicode_Compare()
Py_UNICODE_strncmp
: usePyUnicode_Tailmatch()
Py_UNICODE_strchr
,Py_UNICODE_strrchr
: usePyUnicode_FindChar()
Py_UNICODE_FILL
: usePyUnicode_Fill()
Py_UNICODE_MATCH
Encoders:
PyUnicode_Encode()
: usePyUnicode_AsEncodedObject()
PyUnicode_EncodeUTF8()
: usePyUnicode_AsUTF8()
orPyUnicode_AsUTF8String()
PyUnicode_EncodeUnicodeEscape()
usePyUnicode_AsUnicodeEscapeString()
PyUnicode_EncodeRawUnicodeEscape()
usePyUnicode_AsRawUnicodeEscapeString()
PyUnicode_EncodeMBCS()
使用PyUnicode_AsMBCSString()
或PyUnicode_EncodeCodePage()
(与CP_ACP
代码页PyUnicode_EncodeDecimal()
,PyUnicode_TransformDecimalToASCII()
不推荐使用的功能¶
这个 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-13847 , bpo-14180 :
time
和datetime
:OverflowError
现在引发而不是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_path
和sys.path_hooks
现在,默认情况下会有finders,您很可能希望使用list.insert()
而不是list.append()
添加到这些列表中。因为
None
现在插入到sys.path_importer_cache
,如果清除路径字典中没有查找器的条目,则需要删除与值配对的键。None
andimp.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代码移植¶
在对缓冲区API进行更改的过程中,未记录的
smalltable
会员Py_buffer
结构已被移除,并且PyMemoryViewObject
改变了。所有扩展依赖于中的相关部分
memoryobject.h
或object.h
必须重建。由于 PEP 393 , the
Py_UNICODE
不推荐使用此类型的类型和所有函数(但将至少保留五年)。如果您使用低级别的Unicode API来构造和访问Unicode对象,并且希望从 PEP 393 ,您必须将代码转换为新的 Unicode API .但是,如果您只使用高级功能,例如
PyUnicode_Concat()
,PyUnicode_Join()
或PyUnicode_FromFormat()
,您的代码将自动利用新的Unicode表示。PyImport_GetMagicNumber()
现在回报-1
失败后。作为 level 参数
__import__()
不再有效,现在同样适用于PyImport_ImportModuleLevel()
. 这也意味着 level 被使用PyImport_ImportModuleEx()
现在是0
而不是-1
.
C栋扩建¶
C扩展名的可能文件名范围已经缩小。很少使用的拼写已被禁止:在posix下,文件名为
xxxmodule.so
,xxxmodule.abi3.so
和xxxmodule.cpython-*.so
不再被认为是执行xxx
模块。如果生成了这样的文件,则必须切换到其他拼写(即删除module
文件名中的字符串)。(实施) bpo-14040 )