python 3.5的新功能¶
- 编辑
埃尔维斯·普兰斯基·维库斯<elvis@magic.io>,尤里·塞利万诺夫<yury@magic.io>
本文解释了与3.4相比,python 3.5中的新特性。python 3.5于2015年9月13日发布。参见 changelog 以获取完整的更改列表。
参见
PEP 478 -python 3.5发布计划
总结——发布亮点¶
新语法功能:
新库模块:
新的内置功能:
bytes % args,bytearray % args: PEP 461 --加法%格式化为字节和字节数组。新的
bytes.hex(),bytearray.hex()和memoryview.hex()方法。(由Arnon Yaari在 bpo-9951 )memoryview现在支持元组索引(包括多维)。(由Antoine Pitrou在 bpo-23632 )生成器有新的
gi_yieldfrom属性,返回被迭代的对象yield from表达。(由Benno Leslie和Yury Selivanov在 bpo-24450 )一个新的
RecursionError当达到最大递归深度时,现在引发异常。(乔治布兰德尔在 bpo-19235 )
CPython实施改进:
当
LC_TYPE区域设置是posix区域设置 (C区域设置),sys.stdin和sys.stdout现在使用surrogateescape错误处理程序,而不是strict错误处理程序。(由Victor Stinner在 bpo-19977 ).pyo文件不再使用,已被一个更灵活的方案替换,该方案在.pyc姓名。(见 PEP 488 overview )内置模块和扩展模块现在是在多阶段过程中初始化的,这类似于如何加载Python模块。(见 PEP 489 overview )
标准库的重大改进:
collections.OrderedDict现在是 implemented in C 这使得它的速度快了4到100倍。这个
ssl模块获得 support for Memory BIO 将SSL协议处理与网络IO分离。新的
os.scandir()函数提供 better and significantly faster way 目录遍历。functools.lru_cache()主要是 reimplemented in C ,产生更好的性能。新的
subprocess.run()函数提供 streamlined way to run subprocesses .
安全改进:
SSLv3现在在整个标准库中都被禁用。它仍然可以通过实例化
ssl.SSLContext手动。(参见 bpo-22638 有关更多详细信息,此更改已返回到CPython 3.4和2.7。)为了防止潜在的注入攻击,HTTP cookie解析现在更严格了。(由Antoine Pitrou在 bpo-22796 )
Windows改进:
新的Windows安装程序替换了旧的MSI。见 在Windows上使用python 更多信息。
Windows构建现在使用微软Visual C++ 14,扩展模块应该使用相同的。
请继续阅读有关面向用户的更改的全面列表,包括许多其他较小的改进、cpython优化、拒绝以及潜在的移植问题。
新特点¶
PEP 492-带有异步和等待语法的协程¶
PEP 492 通过添加 awaitable objects , coroutine functions , asynchronous iteration 和 asynchronous context managers .
协程函数是使用 async def 语法:
>>> async def coro():
... return 'spam'
在协程函数中, await 表达式可用于挂起协同程序执行,直到结果可用为止。任何对象都可以 等待 ,只要它实现 awaitable 通过定义 __await__() 方法。
PEP492也补充说 async for 在异步iterables上方便迭代的语句。
使用新语法编写的基本HTTP客户端示例:
import asyncio
async def http_get(domain):
reader, writer = await asyncio.open_connection(domain, 80)
writer.write(b'\r\n'.join([
b'GET / HTTP/1.1',
b'Host: %b' % domain.encode('latin-1'),
b'Connection: close',
b'', b''
]))
async for line in reader:
print('>>>', line)
writer.close()
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(http_get('example.com'))
finally:
loop.close()
与异步迭代类似,异步上下文管理器也有一种新的语法。以下脚本:
import asyncio
async def coro(name, lock):
print('coro {}: waiting for lock'.format(name))
async with lock:
print('coro {}: holding the lock'.format(name))
await asyncio.sleep(1)
print('coro {}: releasing the lock'.format(name))
loop = asyncio.get_event_loop()
lock = asyncio.Lock()
coros = asyncio.gather(coro(1, lock), coro(2, lock))
try:
loop.run_until_complete(coros)
finally:
loop.close()
输出:
coro 2: waiting for lock
coro 2: holding the lock
coro 1: waiting for lock
coro 2: releasing the lock
coro 1: holding the lock
coro 1: releasing the lock
注意这两者 async for 和 async with 只能在用声明的协程函数内部使用 async def .
协程函数旨在在兼容的事件循环内运行,例如 asyncio loop .
注解
在 3.5.2 版更改: 从CPython 3.5.2开始, __aiter__ 可以直接返回 asynchronous iterators . 返回一个 awaitable 对象将导致 PendingDeprecationWarning .
在中查看更多详细信息 异步迭代器 文档部分。
参见
- PEP 492 --带有异步和等待语法的协程
由Yury Selivanov编写和实施的PEP。
PEP 465-用于矩阵乘法的专用中缀运算符¶
PEP 465 添加 @ 矩阵乘法的中缀运算符。目前,没有内置的python类型实现新的操作符,但是可以通过定义 __matmul__() , __rmatmul__() 和 __imatmul__() 用于常规、反射和就地矩阵乘法。这些方法的语义与定义其他中缀算术运算符的方法的语义相似。
矩阵乘法是数学、科学、工程和加法等许多领域的一种常见运算。 @ 允许写入清除代码::
S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)
而不是::
S = dot((dot(H, beta) - r).T,
dot(inv(dot(dot(H, V), H.T)), dot(H, beta) - r))
Numpy 1.10支持新操作员:
>>> import numpy
>>> x = numpy.ones(3)
>>> x
array([ 1., 1., 1.])
>>> m = numpy.eye(3)
>>> m
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
>>> x @ m
array([ 1., 1., 1.])
参见
- PEP 465 --矩阵乘法专用中缀运算符
PEP由Nathaniel J.Smith编写;由Benjamin Peterson实施。
PEP 448-其他解包概括¶
PEP 448 扩展了 * 不可撤销的开箱操作人员和 ** 字典解包运算符。现在可以在 function calls ::
>>> print(*[1], *[2], 3, *[4, 5])
1 2 3 4 5
>>> def fn(a, b, c, d):
... print(a, b, c, d)
...
>>> fn(**{'a': 1, 'c': 3}, **{'b': 2, 'd': 4})
1 2 3 4
同样,tuple、list、set和dictionary显示允许多次解包(请参见 表达式列表 和 词典显示 ):
>>> *range(4), 4
(0, 1, 2, 3, 4)
>>> [*range(4), 4]
[0, 1, 2, 3, 4]
>>> {*range(4), 4, *(5, 6, 7)}
{0, 1, 2, 3, 4, 5, 6, 7}
>>> {'x': 1, **{'y': 2}}
{'x': 1, 'y': 2}
参见
- PEP 448 --其他解包归纳
由Joshua Landau编写的PEP;由Neil Girdhar、Thomas Wouters和Joshua Landau实施。
PEP 461-字节和字节数组的百分比格式支持¶
PEP 461 为添加支持 % interpolation operator 到 bytes 和 bytearray .
虽然插值通常被认为是一个字符串操作,但在某些情况下,插值 bytes 或 bytearrays 这是有道理的,弥补这个缺失功能所需的工作会降低代码的整体可读性。这个问题在处理有线格式协议时特别重要,这种协议通常是二进制和ASCII兼容文本的混合。
实例:
>>> b'Hello %b!' % b'World'
b'Hello World!'
>>> b'x=%i y=%f' % (1, 2.5)
b'x=1 y=2.500000'
不允许使用Unicode %b ,但它被接受了 %a (相当于 repr(obj).encode('ascii', 'backslashreplace') ):
>>> b'Hello %b!' % 'World'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: %b requires bytes, or an object that implements __bytes__, not 'str'
>>> b'price: %a' % '10€'
b"price: '10\\u20ac'"
注意 %s 和 %r 尽管支持转换类型,但只应在需要与Python2兼容的代码基中使用。
参见
- PEP 461 --正在将%格式添加到字节和字节数组中
PEP由Ethan Furman编写;由Neil Schemenauer和Ethan Furman实施。
PEP 484-类型提示¶
函数注释语法自3.0版以来一直是一个python特性 (PEP 3107 但是注释的语义没有定义。
经验表明,大多数函数注释使用的是为函数参数和返回值提供类型提示。很明显,如果标准库包含类型注释的基本定义和工具,那么它将有利于Python用户。
PEP 484 介绍 provisional module 提供这些标准定义和工具,以及一些注释不可用的情况下的约定。
例如,这里有一个简单的函数,其参数和返回类型在注释中声明:
def greeting(name: str) -> str:
return 'Hello ' + name
而这些注释在运行时通过 __annotations__ 属性, 运行时不进行自动类型检查 . 相反,假设单独的离线类型检查器(例如 mypy )将用于按需源代码分析。
类型系统支持联合、泛型类型和名为 Any 与所有类型一致(即可分配给和分配给所有类型)。
pep 471-os.scandir()函数--更好更快的目录迭代器¶
PEP 471 添加新的目录迭代函数, os.scandir() ,到标准库。此外, os.walk() 现在使用实现 scandir 这使得POSIX系统的速度提高了3到5倍,Windows系统的速度提高了7到20倍。这主要是通过大大减少 os.stat() 需要浏览目录树。
此外, scandir 返回一个迭代器,而不是返回一个文件名列表,这样可以提高在非常大的目录上进行迭代时的内存效率。
下面的示例显示了 os.scandir() 显示给定目录中的所有文件(不包括目录) path 这不是从 '.' . 这个 entry.is_file() 调用通常不会进行额外的系统调用::
for entry in os.scandir(path):
if not entry.name.startswith('.') and entry.is_file():
print(entry.name)
参见
- PEP 471 --函数——更好更快的目录迭代器
PEP由本霍伊特在维克托·斯廷纳的帮助下编写和实施。
PEP 475:用eintr重试系统调用失败¶
安 errno.EINTR 每当等待I/O的系统调用被信号中断时,都会返回错误代码。以前,python会引发 InterruptedError 在这种情况下。这意味着,在编写Python应用程序时,开发人员有两个选择:
忽略
InterruptedError.处理
InterruptedError并尝试在每个调用站点重新启动中断的系统调用。
第一个选项使应用程序间歇性失败。第二个选项添加了大量样板文件,使代码几乎不可读。比较:
print("Hello World")
和:
while True:
try:
print("Hello World")
break
except InterruptedError:
continue
PEP 475 对上的系统调用实现自动重试 EINTR . 这消除了处理的负担 EINTR 或 InterruptedError 在大多数情况下,在用户代码中,使包括标准库在内的Python程序更加健壮。请注意,只有在信号处理程序没有引发异常时才会重试系统调用。
下面是一个函数列表,当被信号中断时,将重试这些函数:
的功能
faulthandler模块;os功能:fchdir(),fchmod(),fchown(),fdatasync(),fstat(),fstatvfs(),fsync(),ftruncate(),mkfifo(),mknod(),open(),posix_fadvise(),posix_fallocate(),pread(),pwrite(),read(),readv(),sendfile(),wait3(),wait4(),wait(),waitid(),waitpid(),write(),writev();特殊情况:
os.close()和os.dup2()现在忽略EINTR错误;不重试系统调用(有关基本原理,请参阅PEP);select功能:devpoll.poll(),epoll.poll(),kqueue.control(),poll.poll(),select();方法
socket类:accept(),connect()(非阻塞Socket除外)recv(),recvfrom(),recvmsg(),send(),sendall(),sendmsg(),sendto();
参见
- PEP 475 --用eintr重试失败的系统调用
由查尔斯·弗朗索瓦·纳塔利和维克托·斯廷纳在安托万·皮特鲁(法国连接)的帮助下撰写的《PEP与执行》。
PEP 479:更改生成器内的停止迭代处理¶
生成器和 StopIteration 在Python3.4和更早的版本中,有时会令人惊讶,并且可以隐藏隐藏隐藏的bug。以前, StopIteration 在生成器函数内部意外引发被驱动生成器的循环构造解释为迭代结束。
PEP 479 更改生成器的行为:当 StopIteration 在生成器内部引发异常,将其替换为 RuntimeError 在它离开生成器框架之前。这种变化的主要目标是在没有人保护的情况下简化调试。 next() 调用引发 StopIteration 并使由生成器控制的迭代安静地终止。这与 yield from 构造。
这是一个向后不兼容的更改,因此为了启用新的行为, __future__ 需要导入:
>>> from __future__ import generator_stop
>>> def gen():
... next(iter([]))
... yield
...
>>> next(gen())
Traceback (most recent call last):
File "<stdin>", line 2, in gen
StopIteration
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: generator raised StopIteration
没有 __future__ 导入,A PendingDeprecationWarning 在任何时候 StopIteration 在生成器内部引发异常。
参见
- PEP 479 --更改生成器内的StopIteration处理
由ChrisAngelico和Guido van Rossum撰写的PEP。由Chris Angelico、Yury Selivanov和Nick Coghlan实施。
PEP 485:用于测试近似相等性的函数¶
PEP 485 添加 math.isclose() 和 cmath.isclose() 指示两个值之间是近似相等还是“接近”的函数。根据给定的绝对和相对公差确定两个值是否接近。相对公差是指 isclose 参数,相对于较大的绝对值:
>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, rel_tol=1e-5)
True
>>> math.isclose(a, b, rel_tol=1e-6)
False
也可以使用绝对公差比较两个值,绝对公差必须是非负值:
>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, abs_tol=0.00003)
True
>>> math.isclose(a, b, abs_tol=0.00001)
False
参见
- PEP 485 --一个检验近似相等性的函数
由Christopher Barker编写的PEP;由Chris Barker和Tal Einat实施。
PEP486:让python启动程序了解虚拟环境¶
PEP 486 使Windows启动程序(请参见 PEP 397 )了解活动的虚拟环境。当使用默认解释器时, VIRTUAL_ENV 设置环境变量后,将使用虚拟环境中的解释器。
参见
- PEP 486 --使python启动程序了解虚拟环境
PEP由Paul Moore编写并实施。
PEP 488:消除PYO文件¶
PEP 488 摒弃了 .pyo 文件夹。这意味着 .pyc 文件代表未优化和优化的字节码。为了防止需要不断地重新生成字节码文件, .pyc 文件现在有一个可选的 opt- 当字节码被优化时,用他们的名字标记。这样做的副作用是,在任何一种情况下运行时,都不会再出现字节码文件名冲突。 -O 或 -OO .因此,字节码文件由 -O 和 -OO 现在可以同时存在。 importlib.util.cache_from_source() 有更新的API来帮助进行此更改。
参见
- PEP 488 --消除PYO文件
由Brett Cannon编写和实现。
PEP 489:多相扩展模块初始化¶
PEP 489 更新扩展模块初始化,以利用由 PEP 451 在Python 3.4中。
这一变化使得选择使用新机制的扩展模块的导入语义更接近于Python源代码和字节码模块,包括使用任何有效标识符作为模块名的能力,而不是仅限于ASCII。
参见
- PEP 489 --多相扩展模块初始化
Pep由Petr Viktorin、Stefan Behnel和Nick Coghlan编写;由Petr Viktorin实施。
其他语言更改¶
对核心python语言所做的一些较小的更改是:
增加了
"namereplace"错误处理程序。这个"backslashreplace"错误处理程序现在可用于解码和翻译。(Serhiy Storchaka在 bpo-19676 和 bpo-22286 )这个
-b选项现在影响比较bytes具有int. (Serhiy Storchaka在 bpo-23681 )新哈萨克
kz1048塔吉克koi8_tcodecs . (Serhiy Storchaka在 bpo-22682 和 bpo-22681 )属性docStrings现在是可写的。这对
collections.namedtuple()文档字符串。(由Berker Peksag在 bpo-24064 )现在支持涉及相对导入的循环导入。(布雷特·坎农和安托万·皮特鲁在 bpo-17636 )
新模块¶
typing¶
新的 typing provisional 模块为函数类型注释提供标准定义和工具。见 Type Hints 更多信息。
zipapp¶
新的 zipapp 模块(在 PEP 441 )提供用于创建可执行的python-zip应用程序的API和命令行工具,该工具在 bpo-1739468 但无论是在当时还是从那以后都没有得到很好的宣传。
使用这个新模块,捆绑应用程序就像放置所有文件一样简单,包括 __main__.py 文件,进入目录 myapp 和运行:
$ python -m zipapp myapp
$ python myapp.pyz
模块实现由Paul Moore在 bpo-23491 .
参见
PEP 441 --改进了对python-zip应用程序的支持
改进的模块¶
argparse¶
这个 ArgumentParser 类现在允许禁用 abbreviated usage 通过设置的长选项 allow_abbrev 到 False . (年由乔纳森·保罗、史蒂文·贝萨德、保罗·J3和丹尼尔·埃里克森撰稿) bpo-14910 )
asyncio¶
自从 asyncio 模块是 provisional ,python 3.5中引入的所有更改也都已返回到python 3.4.x。
中的显著变化 asyncio 自python 3.4.0以来的模块:
新的调试API:
loop.set_debug()和loop.get_debug()方法。(维克多·斯廷纳供稿)主动事件循环现在支持SSL。(由Antoine Pitrou和Victor Stinner在 bpo-22560 )
一个新的
loop.is_closed()方法检查事件循环是否已关闭。(由Victor Stinner在 bpo-21326 )一个新的
loop.create_task()方便地创建和安排新的Task做协同程序。这个create_task方法也被所有将协程封装到任务中的异步函数使用,例如asyncio.wait(),asyncio.gather()等等(由维克多·斯廷纳贡献)一个新的
transport.get_write_buffer_limits()要查询的方法 high- 和 low- 流量控制的水限。(维克多·斯廷纳供稿)这个
async()函数已弃用,取而代之的是ensure_future(). (由尤里·塞利万诺夫供稿)新的
loop.set_task_factory()和loop.get_task_factory()自定义任务工厂的方法loop.create_task()方法使用。(由尤里·塞利万诺夫供稿)新的
Queue.join()和Queue.task_done()队列方法。(维克多·斯廷纳供稿)这个
JoinableQueue为了支持asyncio.Queue类。(维克多·斯廷纳供稿)
3.5.1中的更新:
这个
ensure_future()函数和所有使用它的函数,例如loop.run_until_complete(),现在接受各种 awaitable objects . (由尤里·塞利万诺夫供稿)新的
run_coroutine_threadsafe()函数将协程从其他线程提交到事件循环。(文森特·米歇尔供稿)新的
Transport.is_closing()方法检查传输是关闭还是关闭。(由尤里·塞利万诺夫供稿)这个
loop.create_server()方法现在可以接受主机列表。(Yann Sineau供稿)
3.5.2中的更新:
新的
loop.create_future()创建未来对象的方法。这允许其他事件循环实现,例如 uvloop ,以提供更快的asyncio.Future实施。(由尤里·塞利万诺夫供稿)新的
loop.get_exception_handler()方法获取当前异常处理程序。(由尤里·塞利万诺夫供稿)新的
StreamReader.readuntil()方法从流中读取数据,直到出现分隔符字节序列。(马克·科伦伯格贡献)这个
loop.create_connection()和loop.create_server()优化方法以避免调用系统getaddrinfo如果地址已解析,则函数。(A.Jesse Jiryu Davis撰稿)这个
loop.sock_connect(sock, address)不再需要 地址 在调用前解决。(A.Jesse Jiryu Davis撰稿)
BZ2¶
这个 BZ2Decompressor.decompress 方法现在接受一个可选的 max_length 用于限制已解压缩数据的最大大小的参数。(Nikolaus Rath于 bpo-15955 )
CGI¶
这个 FieldStorage 类现在支持 context manager 协议。(由Berker Peksag在 bpo-20289 )
cmath¶
一个新函数 isclose() 提供一种测试近似相等性的方法。(由Chris Barker和Tal Einat在 bpo-24270 )
代码¶
这个 InteractiveInterpreter.showtraceback() 方法现在打印全链的回溯,就像交互式解释器一样。(克劳迪乌波巴在 bpo-17442 )
收藏¶
这个 OrderedDict 类现在在C中实现,这使得它的速度快了4到100倍。(埃里克·斯诺在 bpo-16991 )
OrderedDict.items() , OrderedDict.keys() , OrderedDict.values() 视图现在支持 reversed() 迭代。(Serhiy Storchaka在 bpo-19505 )
这个 deque 类现在定义 index() , insert() 和 copy() 并支持 + 和 * 运算符。这使得Deques可以被识别为 MutableSequence 并提高了列表的可替换性。(由Raymond Hettinger在 bpo-23704 )
文档字符串生成者 namedtuple() 现在可以更新:
Point = namedtuple('Point', ['x', 'y'])
Point.__doc__ += ': Cartesian coodinate'
Point.x.__doc__ = 'abscissa'
Point.y.__doc__ = 'ordinate'
(由Berker Peksag在 bpo-24064 )
这个 UserString 类现在实现 __getnewargs__() , __rmod__() , casefold() , format_map() , isprintable() 和 maketrans() 方法匹配相应的方法 str . (由Joe Jevnik在 bpo-22189 )
collections.abc¶
这个 Sequence.index() 方法现在接受 开始 和 stop 要匹配的相应方法的参数 tuple , list 等(由Devin Jeanpierre在 bpo-23086 )
一个新的 Generator 抽象基类。(由Stefan Behnel在 bpo-24018 )
新的 Awaitable , Coroutine , AsyncIterator 和 AsyncIterable 抽象基类。(由Yury Selivanov在 bpo-24184 )
对于早期的python版本,可以在外部 PyPI package .
编译所有¶
一个新的 compileall 选项, -j {N} ,允许运行 N 同时工作以执行并行字节码编译。这个 compile_dir() 函数具有相应的 workers 参数。(克劳迪乌波巴在 bpo-16104 )
另一个新的选择, -r ,允许控制子目录的最大递归级别。(克劳迪乌波巴在 bpo-19628 )
这个 -q 现在可以多次指定命令行选项,在这种情况下,包括错误在内的所有输出都将被抑制。相应的 quiet 参数在 compile_dir() , compile_file() 和 compile_path() 现在可以接受指示输出抑制级别的整数值。(托马斯·克鲁弗在 bpo-21338 )
concurrent.futures¶
这个 Executor.map() 方法现在接受 chunksize 允许成批处理任务以提高性能的参数 ProcessPoolExecutor() 使用。(Dan O'Reilly在 bpo-11271 )
中的工人数量 ThreadPoolExecutor 构造函数现在是可选的。默认值是CPU数量的5倍。(克劳迪乌波巴在 bpo-21527 )
配置分析器¶
configparser 现在提供了一种自定义值转换的方法,方法是在 ConfigParser 或通过将它们定义为 ConfigParser 子类。解析器实例中定义的转换器由其部分代理继承。
例子::
>>> import configparser
>>> conv = {}
>>> conv['list'] = lambda v: [e.strip() for e in v.split() if e.strip()]
>>> cfg = configparser.ConfigParser(converters=conv)
>>> cfg.read_string("""
... [s]
... list = a b c d e f g
... """)
>>> cfg.get('s', 'list')
'a b c d e f g'
>>> cfg.getlist('s', 'list')
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> section = cfg['s']
>>> section.getlist('list')
['a', 'b', 'c', 'd', 'e', 'f', 'g']
(由Ukasz Langa在 bpo-18159 )
contextlib¶
新的 redirect_stderr() context manager (类似于 redirect_stdout() )使实用程序脚本更容易处理将输出写入的不灵活API sys.stderr 不要提供任何重定向选项:
>>> import contextlib, io, logging
>>> f = io.StringIO()
>>> with contextlib.redirect_stderr(f):
... logging.warning('warning')
...
>>> f.getvalue()
'WARNING:root:warning\n'
(由Berker Peksag在 bpo-22389 )
csv¶
这个 writerow() 方法现在支持任意iterables,而不仅仅是序列。(Serhiy Storchaka在 bpo-23171 )
curses¶
新的 update_lines_cols() 函数更新 LINES 和 COLS 环境变量。这对于检测手动调整屏幕大小很有用。(由Arnon Yaari在 bpo-4254 )
dbm¶
difflib¶
由生成的HTML文档的字符集 HtmlDiff.make_file() 现在可以使用新的 charset 仅关键字参数。HTML文档的默认字符集从 "ISO-8859-1" 到 "utf-8" . (由Berker Peksag在 bpo-2052 )
这个 diff_bytes() 函数现在可以比较字节字符串列表。这修复了从python 2回归的问题。(由特里·J·雷迪和格雷格·沃德在 bpo-17445 )
distutils¶
两个 build 和 build_ext 命令现在接受 -j 选项以启用扩展模块的并行构建。(由Antoine Pitrou在 bpo-5309 )
这个 distutils 模块现在支持 xz 压缩,并且可以通过传递启用 xztar 作为一个参数 bdist --format . (Serhiy Storchaka在 bpo-16314 )
doctest¶
这个 DocTestSuite() 函数返回空 unittest.TestSuite 如果 模块 不包含docstring,而不是引发 ValueError . (由格伦·琼斯在 bpo-15916 )
email¶
新的政策选择 Policy.mangle_from_ 控制是否以开头的行 "From " 在电子邮件中,正文的前缀是 ">" 由生成器生成的字符。默认值为 True 对于 compat32 和 False 所有其他政策。(米兰奥伯基赫在 bpo-20098 )
一个新的 Message.get_content_disposition() 方法可以方便地访问 Content-Disposition 标题。(由Abhilash Raj在 bpo-21083 )
新的政策选择 EmailPolicy.utf8 可以设置为 True 使用UTF-8字符集而不是编码字对电子邮件头进行编码。这允许 Messages 格式依据 RFC 6532 并与支持 RFC 6531 SMTPUTF8 延伸。(R.David Murray在 bpo-24211 )
这个 mime.text.MIMEText 构造函数现在接受 charset.Charset 实例。(Claude Paroz和Berker Peksag在 bpo-16324 )
枚举¶
这个 Enum Callable有一个新参数 开始 指定枚举值的初始数目 姓名 提供:
>>> Animal = enum.Enum('Animal', 'cat dog', start=10)
>>> Animal.cat
<Animal.cat: 10>
>>> Animal.dog
<Animal.dog: 11>
(伊桑·弗曼在 bpo-21706 )
faulthandler¶
这个 enable() , register() , dump_traceback() 和 dump_traceback_later() 函数现在除了接受类似文件的对象外,还接受文件描述符。(魏武年供稿) bpo-23566 )
功能工具¶
大部分的 lru_cache() 机器现在在C语言中实现,使其速度显著加快。(由Matt Joiner、Alexey Kachayev和Serhiy Storchaka在 bpo-14373 )
格洛布¶
这个 iglob() 和 glob() 函数现在支持子目录中的递归搜索,使用 "**" 模式。(Serhiy Storchaka在 bpo-13968 )
GZIP¶
HEAPQ¶
元素比较 merge() 现在可以通过传递 key function 在新选项中 key 关键字参数和新的可选参数 reverse 关键字参数可用于反转元素比较::
>>> import heapq
>>> a = ['9', '777', '55555']
>>> b = ['88', '6666']
>>> list(heapq.merge(a, b, key=len))
['9', '88', '777', '6666', '55555']
>>> list(heapq.merge(reversed(a), reversed(b), key=len, reverse=True))
['55555', '6666', '777', '88', '9']
(由Raymond Hettinger在 bpo-13742 )
HTTP协议¶
一个新的 HTTPStatus 定义一组HTTP状态代码、原因短语和用英语编写的长描述的枚举。(德米安·布莱希特在 bpo-21793 )
http.client¶
HTTPConnection.getresponse() 现在提出一个 RemoteDisconnected 远程服务器连接意外关闭时出现异常。此外,如果 ConnectionError (其中 RemoteDisconnected 是一个子类)被引发,客户端套接字现在自动关闭,并将在下一个请求时重新连接::
import http.client
conn = http.client.HTTPConnection('www.python.org')
for retries in range(3):
try:
conn.request('GET', '/')
resp = conn.getresponse()
except http.client.RemoteDisconnected:
pass
(马丁·潘特在 bpo-3566 )
idlelib和idle¶
由于idlelib实现了idle shell和编辑器,并且不打算由其他程序导入,所以它在每个版本中都得到了改进。见 Lib/idlelib/NEWS.txt 对于自3.4.0以来的累积更改列表,以及在未来3.5.x版本中所做的更改。此文件也可从空闲 对话框。
IMAPLIB¶
这个 IMAP4 类现在支持 context manager 协议。当用于 with 语句,imap4 LOGOUT 命令将在块末尾自动调用。(由Tarek Ziad_和Serhiy Storchaka于 bpo-4972 )
这个 imaplib 模块现在支持 RFC 5161 (启用扩展)和 RFC 6855 (支持UTF-8)通过 IMAP4.enable() 方法。一个新的 IMAP4.utf8_enabled 属性跟踪是否 RFC 6855 支持已启用。(米兰•奥伯基赫、R.大卫•穆雷和麦基•斯图利克于年撰稿) bpo-21800 )
这个 imaplib 模块现在按照RFC的建议,使用UTF-8自动编码非ASCII字符串用户名和密码。(米兰奥伯基赫在 bpo-21800 )
IMGHDR¶
这个 what() 函数现在识别 OpenEXR 格式(由Martin Vignali和Claudiu Popa在 bpo-20295 ) WebP 格式(由Fabrice Aneche和Claudiu Popa在 bpo-20197 )
importlib¶
这个 util.LazyLoader 类允许在启动时间很重要的应用程序中延迟加载模块。(布雷特·坎农在 bpo-17621 )
这个 abc.InspectLoader.source_to_code() 方法现在是静态方法。这使得通过运行从字符串编译的代码来初始化模块对象更加容易。 exec(code, module.__dict__) .(布雷特·坎农在 bpo-21156 )
新的 util.module_from_spec() 函数现在是创建新模块的首选方法。与创建 types.ModuleType 直接实例,这个新函数将根据传入的spec对象设置各种导入控制的属性。(布雷特·坎农在 bpo-20383 )
检查¶
两个 Signature 和 Parameter 类现在可以选择和散列。(由Yury Selivanov在 bpo-20726 和 bpo-20334 )
一个新的 BoundArguments.apply_defaults() 方法提供了一种为缺少参数设置默认值的方法:
>>> def foo(a, b='ham', *args): pass
>>> ba = inspect.signature(foo).bind('spam')
>>> ba.apply_defaults()
>>> ba.arguments
OrderedDict([('a', 'spam'), ('b', 'ham'), ('args', ())])
(由Yury Selivanov在 bpo-24190 )
一种新的类方法 Signature.from_callable() 使子类化 Signature 更容易的。(由Yury Selivanov和Eric Snow在 bpo-17373 )
这个 signature() 函数现在接受 follow_wrapped 可选关键字参数,当设置为 False ,禁用自动跟踪 __wrapped__ 链接。(由Yury Selivanov在 bpo-20691 )
要检查的一组新功能 coroutine functions 和 coroutine objects 已被添加: iscoroutine() , iscoroutinefunction() , isawaitable() , getcoroutinelocals() 和 getcoroutinestate() . (由Yury Selivanov在 bpo-24017 和 bpo-24400 )
这个 stack() , trace() , getouterframes() 和 getinnerframes() 函数现在返回命名元组的列表。(丹尼尔·沙哈夫在 bpo-16808 )
io¶
一个新的 BufferedIOBase.readinto1() 方法,最多使用一个对基础原始流的调用 RawIOBase.read() 或 RawIOBase.readinto() 方法。(Nikolaus Rath于 bpo-20578 )
IP地址¶
两个 IPv4Network 和 IPv6Network 课程现在接受 (address, netmask) tuple参数,以便从现有地址轻松构造网络对象:
>>> import ipaddress
>>> ipaddress.IPv4Network(('127.0.0.0', 8))
IPv4Network('127.0.0.0/8')
>>> ipaddress.IPv4Network(('127.0.0.0', '255.0.0.0'))
IPv4Network('127.0.0.0/8')
(由Peter Moody和Antoine Pitrou在 bpo-16531 )
一个新的 reverse_pointer 的属性 IPv4Network 和 IPv6Network 类返回反向DNS PTR记录的名称::
>>> import ipaddress
>>> addr = ipaddress.IPv4Address('127.0.0.1')
>>> addr.reverse_pointer
'1.0.0.127.in-addr.arpa'
>>> addr6 = ipaddress.IPv6Address('::1')
>>> addr6.reverse_pointer
'1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa'
(Leon Weber在 bpo-20480 )
json¶
这个 json.tool 命令行接口现在保留输入中传递的JSON对象中键的顺序。新的 --sort-keys 选项可用于按字母顺序对键排序。(由Berker Peksag在 bpo-21650 )
JSON解码器现在引发 JSONDecodeError 而不是 ValueError 提供关于错误的更好的上下文信息。(Serhiy Storchaka在 bpo-19361 )
缓存线¶
一个新的 lazycache() 函数可用于捕获有关非基于文件的模块的信息,以便以后通过 getline() . 这样可以避免在实际需要线路之前进行I/O,而不必无限期地携带模块全局数据。(罗伯特·柯林斯在 bpo-17911 )
locale¶
一个新的 delocalize() 函数可用于将字符串转换为规范化的数字字符串,使用 LC_NUMERIC 帐户设置:
>>> import locale
>>> locale.setlocale(locale.LC_NUMERIC, 'de_DE.UTF-8')
'de_DE.UTF-8'
>>> locale.delocalize('1.234,56')
'1234.56'
>>> locale.setlocale(locale.LC_NUMERIC, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.delocalize('1,234.56')
'1234.56'
(由C_dric krier在 bpo-13918 )
登录¶
所有日志记录方法 (Logger log() , exception() , critical() , debug() 等),现在接受异常实例作为 exc_info 参数,除了布尔值和异常元组:
>>> import logging
>>> try:
... 1/0
... except ZeroDivisionError as ex:
... logging.error('exception', exc_info=ex)
ERROR:root:exception
(由Yury Selivanov在 bpo-20537 )
这个 handlers.HTTPHandler 类现在接受可选 ssl.SSLContext 用于配置HTTP连接中使用的SSL设置的实例。(由Alex Gaynor在 bpo-22788 )
这个 handlers.QueueListener 现在上课需要 respect_handler_level 关键字参数,如果设置为 True ,将消息传递给考虑处理程序级别的处理程序。(由Vinay Sajip提供。)
LZMA¶
这个 LZMADecompressor.decompress() 方法现在接受一个可选的 max_length 用于限制已解压缩数据的最大大小的参数。(马丁·潘特在 bpo-15955 )
数学¶
两个新常量已添加到 math 模块: inf 和 nan . (马克·狄金森在 bpo-23185 )
一个新函数 isclose() 提供一种测试近似相等性的方法。(由Chris Barker和Tal Einat在 bpo-24270 )
一个新的 gcd() 已添加函数。这个 fractions.gcd() 函数现在已弃用。(由Mark Dickinson和Serhiy Storchaka在 bpo-22486 )
多重处理¶
sharedctypes.synchronized() 对象现在支持 context manager 协议。(由Charles Fran_ois Natali于 bpo-21565 )
操作人员¶
attrgetter() , itemgetter() 和 methodcaller() 对象现在支持酸洗。(由Josh Rosenberg和Serhiy Storchaka在 bpo-22955 )
操作系统¶
新的 scandir() 函数返回的迭代器 DirEntry 已添加个对象。如果可能的话, scandir() 在扫描目录时提取文件属性,从而消除了执行后续系统调用以确定文件类型或属性的需要,这可以显著提高性能。(本·霍伊特在维克托·斯廷纳的帮助下 bpo-22524 )
在Windows上,一个新的 stat_result.st_file_attributes 属性现在可用。它对应于 dwFileAttributes 会员 BY_HANDLE_FILE_INFORMATION 结构返回者 GetFileInformationByHandle() .(由Ben Hoyt在 bpo-21719 )
这个 urandom() 函数现在使用 getrandom() Linux 3.17或更新版本上的系统调用,以及 getentropy() 在OpenBSD 5.6及更高版本上,不再需要使用 /dev/urandom 以及避免由于潜在的文件描述符耗尽而导致的失败。(由Victor Stinner在 bpo-22181 )
新的 get_blocking() 和 set_blocking() 函数允许获取和设置文件描述符的阻止模式 (O_NONBLOCK (由Victor Stinner在 bpo-22054 )
这个 truncate() 和 ftruncate() 现在Windows支持函数。(史蒂夫·道尔在 bpo-23668 )
有一种新的 os.path.commonpath() 函数返回每个传递路径名的最长公共子路径。不同于 os.path.commonprefix() 函数,它始终返回有效路径:
>>> os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
'/usr/l'
>>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
'/usr'
(由Rafik Draoui和Serhiy Storchaka在 bpo-10395 )
pathlib¶
新的 Path.samefile() 方法可用于检查路径是否指向与另一个路径相同的文件,该路径可以是另一个路径 Path 对象或字符串:
>>> import pathlib
>>> p1 = pathlib.Path('/etc/hosts')
>>> p2 = pathlib.Path('/etc/../etc/hosts')
>>> p1.samefile(p2)
True
(由金刚角和安托万·皮特鲁于 bpo-19775 )
这个 Path.mkdir() 方法现在接受一个新的可选 exist_ok 要匹配的参数 mkdir -p 和 os.makedirs() 功能。(由Berker Peksag在 bpo-21539 )
有一种新的 Path.expanduser() 展开的方法 ~ 和 ~user 前缀。(由Serhiy Storchaka和Claudiu Popa在 bpo-19776 )
一个新的 Path.home() 类方法可用于获取 Path 表示用户主目录的实例。(由Victor Salgado和Mayank Tripathi在 bpo-19777 )
新的 Path.write_text() , Path.read_text() , Path.write_bytes() , Path.read_bytes() 方法来简化对文件的读/写操作。
以下代码段将创建或重写现有文件 ~/spam42 ::
>>> import pathlib
>>> p = pathlib.Path('~/spam42')
>>> p.expanduser().write_text('ham')
3
(克里斯托弗·韦尔伯恩于 bpo-20218 )
泡菜¶
嵌套对象(如未绑定的方法或嵌套类)现在可以使用pickle pickle protocols 早于协议版本4。协议版本4已经支持这些情况。(Serhiy Storchaka在 bpo-23611 )
poplib¶
一个新的 POP3.utf8() 命令使能 RFC 6856 (国际化电子邮件)支持,如果pop服务器支持。(米兰奥伯基赫在 bpo-21804 )
re¶
现在lookbehind断言中允许对具有固定长度的组的引用和条件引用::
>>> import re
>>> pat = re.compile(r'(a|b).(?<=\1)c')
>>> pat.match('aac')
<_sre.SRE_Match object; span=(0, 3), match='aac'>
>>> pat.match('bbc')
<_sre.SRE_Match object; span=(0, 3), match='bbc'>
(Serhiy Storchaka在 bpo-9179 )
在正则表达式中捕获组的数量不再局限于100个。(Serhiy Storchaka在 bpo-22437 )
这个 sub() 和 subn() 函数现在用空字符串替换不匹配的组,而不是引发异常。(Serhiy Storchaka在 bpo-1519638 )
这个 re.error 异常具有新属性, msg , pattern , pos , lineno 和 colno ,提供有关错误的更好的上下文信息:
>>> re.compile("""
... (?x)
... .++
... """)
Traceback (most recent call last):
...
sre_constants.error: multiple repeat at position 16 (line 3, column 7)
(Serhiy Storchaka在 bpo-22578 )
readline¶
一个新的 append_history_file() 函数可用于将历史记录中指定数量的尾随元素追加到给定文件中。(由Bruno Cauet在 bpo-22940 )
选择器¶
新的 DevpollSelector 支持高效 /dev/poll 在Solaris上轮询。(由Giampaolo Rodola在 bpo-18931 )
shutil¶
这个 move() 函数现在接受 copy_function 参数,例如,允许 copy() 要使用的函数,而不是默认值 copy2() 如果在移动时需要忽略文件元数据。(克劳迪乌波巴在 bpo-19840 )
这个 make_archive() 函数现在支持 xztar 格式。(Serhiy Storchaka在 bpo-5411 )
信号¶
在Windows上 set_wakeup_fd() 函数现在还支持套接字句柄。(由Victor Stinner在 bpo-22018 )
各种各样 SIG* 中的常量 signal 模块已转换为 Enums . 这允许在调试期间打印有意义的名称,而不是整数“幻数”。(由Giampaolo Rodola在 bpo-21076 )
短信网关¶
两个 SMTPServer 和 SMTPChannel 课程现在接受 decode_data 关键字参数来确定 DATA SMTP事务的一部分使用 "utf-8" codec或被提供给 SMTPServer.process_message() 方法作为字节字符串。默认值为 True 由于向后兼容的原因,但将更改为 False 在python 3.6中。如果 decode_data 设置为 False , the process_message 方法必须准备接受关键字参数。(由Maciej Szulik在 bpo-19662 )
这个 SMTPServer`类现在发布了 ``8BITMIME` 延伸 (RFC 6152 如果 decode_data 已经被设定 True . 如果客户指定 BODY=8BITMIME 上 MAIL 命令,它被传递给 SMTPServer.process_message() 通过 mail_options 关键字。(米兰·奥伯基赫和R.大卫·默里在 bpo-21795 )
这个 SMTPServer 类现在还支持 SMTPUTF8 延伸 (RFC 6531 :国际化电子邮件)。如果客户指定 SMTPUTF8 BODY=8BITMIME 上 MAIL 命令,它们被传递给 SMTPServer.process_message() 通过 mail_options 关键字。这是 process_message 正确处理 SMTPUTF8 数据。(米兰奥伯基赫在 bpo-21725 )
现在可以直接或通过名称解析在 SMTPServer 并使其成功连接。(米兰奥伯基赫在 bpo-14758 )
SMTPLIB¶
一个新的 SMTP.auth() 方法为实现自定义身份验证机制提供了一种方便的方法。(米兰奥伯基赫在 bpo-15014 )
这个 SMTP.set_debuglevel() 方法现在接受一个额外的调试级别(2),它在调试消息中启用时间戳。(由Gavin Chappell和Maciej Szulik于 bpo-16914 )
两个 SMTP.sendmail() 和 SMTP.send_message() 方法现在支持 RFC 6531 (SMTPFF8)。(米兰·奥伯基赫和R.大卫·默里在 bpo-22027 )
SNDHDR¶
这个 what() 和 whathdr() 函数现在返回 namedtuple() . (克劳迪乌波巴在 bpo-18615 )
Socket¶
带有超时的函数现在使用单调的时钟,而不是系统时钟。(由Victor Stinner在 bpo-22043 )
一个新的 socket.sendfile() 方法允许使用高性能通过套接字发送文件 os.sendfile() 在Unix上运行,导致上载速度比使用plain时快2到3倍 socket.send() . (由Giampaolo Rodola在 bpo-17552 )
这个 socket.sendall() 方法不再在每次接收或发送字节时重置套接字超时。套接字超时现在是发送所有数据的最大总持续时间。(由Victor Stinner在 bpo-23853 )
这个 积压 论证 socket.listen() 方法现在是可选的。默认设置为 SOMAXCONN 或 128 ,以较小者为准。(由Charles Fran_ois Natali于 bpo-21455 )
SSL¶
记忆生物支持¶
(由Geert Jansen在 bpo-21965 )
新的 SSLObject 已添加类,以便为以下情况提供SSL协议支持: SSLSocket 不必要或不理想。 SSLObject 表示一个SSL协议实例,但不实现任何网络I/O方法,而是提供一个内存缓冲区接口。新的 MemoryBIO 类可用于在Python和SSL协议实例之间传递数据。
内存bio-ssl支持主要用于实现异步I/O的框架,其中 SSLSocket 的就绪模型(“select/poll”)效率低下。
一个新的 SSLContext.wrap_bio() 方法可用于创建新的 SSLObject 实例。
应用层协议协商支持¶
(本杰明·彼得森于 bpo-20188 )
如果存在openssl支持,则 ssl 模块现在实现 Application-Layer Protocol Negotiation 如中所述的TLS扩展 RFC 7301 .
新的 SSLContext.set_alpn_protocols() 可用于指定套接字在TLS握手期间应公布哪些协议。
新的 SSLSocket.selected_alpn_protocol() 返回在TLS握手期间选择的协议。这个 HAS_ALPN 标志指示是否存在alpn支持。
其他变化¶
有一种新的 SSLSocket.version() 方法查询正在使用的实际协议版本。(由Antoine Pitrou在 bpo-20421 )
这个 SSLSocket 类现在实现 SSLSocket.sendfile() 方法。(由Giampaolo Rodola在 bpo-17552 )
这个 SSLSocket.send() 方法现在引发 ssl.SSLWantReadError 或 ssl.SSLWantWriteError 如果操作将阻塞,则在非阻塞套接字上出现异常。以前,它会返回 0 . (Nikolaus Rath于 bpo-20951 )
这个 cert_time_to_seconds() 函数现在将输入时间解释为UTC,而不是本地时间,根据 RFC 5280 . 此外,返回值始终是 int . (李秋拉在 bpo-19940 )
新的 SSLObject.shared_ciphers() 和 SSLSocket.shared_ciphers() 方法返回客户端在握手过程中发送的密码列表。(本杰明·彼得森于 bpo-23186 )
这个 SSLSocket.do_handshake() , SSLSocket.read() , SSLSocket.shutdown() 和 SSLSocket.write() 方法 SSLSocket 类不再在每次接收或发送字节时重置套接字超时。套接字超时现在是该方法的最大总持续时间。(由Victor Stinner在 bpo-23853 )
这个 match_hostname() 函数现在支持IP地址的匹配。(由Antoine Pitrou在 bpo-23239 )
sqlite3¶
这个 Row 类现在完全支持序列协议,特别是 reversed() 迭代和切片索引。(克劳迪乌波巴在 bpo-10203 由卢卡斯·辛克莱、杰西卡·麦凯拉和塞尔希·斯托查卡在 bpo-13583 )
子过程¶
新的 run() 已添加函数。它运行指定的命令并返回 CompletedProcess 对象,描述完成的进程。新的API更加一致,是在不需要与早期的Python版本保持兼容性的Python代码中调用子流程的推荐方法。(托马斯·克鲁弗在 bpo-23342 )
实例:
>>> subprocess.run(["ls", "-l"]) # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)
>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1
>>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')
系统¶
一个新的 set_coroutine_wrapper() 函数允许设置将在 coroutine object 由创建 async def 功能。相应的 get_coroutine_wrapper() 可用于获取当前设置的包装。两种功能都是 provisional ,仅用于调试目的。(由Yury Selivanov在 bpo-24017 )
一个新的 is_finalizing() 函数可用于检查python解释器是否 shutting down . (由Antoine Pitrou在 bpo-22696 )
系统配置¶
Windows上用户脚本目录的名称现在包含了Python版本的前两个组件。(保罗·摩尔在 bpo-23437 )
tarfile¶
这个 mode 论证 open() 函数现在接受 "x" 请求独占创建。(由Berker Peksag在 bpo-21717 )
这个 TarFile.extractall() 和 TarFile.extract() 方法现在采用关键字参数 numeric_owner . 如果设置为 True ,提取的文件和目录将由数字 uid 和 gid 从tarfile。如果设置为 False (默认值,以及3.5之前版本中的行为),它们将由tarfile中的命名用户和组拥有。(由Michael Vogt和Eric Smith在 bpo-23193 )
这个 TarFile.list() 现在接受一个可选的 成员 关键字参数,可设置为返回的列表的子集 TarFile.getmembers() . (Serhiy Storchaka在 bpo-21549 )
线程加工¶
两个 Lock.acquire() 和 RLock.acquire() 方法现在使用一个单调的时钟进行超时管理。(由Victor Stinner在 bpo-22043 )
时间¶
这个 monotonic() 功能现在始终可用。(由Victor Stinner在 bpo-22043 )
timeit¶
新的命令行选项 -u 或 --unit={U} 可用于指定计时器输出的时间单位。支持的选项包括 usec , msec 或 sec . (朱利安·金迪在 bpo-18983 )
这个 timeit() 函数有一个新的 globals 用于指定运行代码的命名空间的参数。(由Ben Roberts在 bpo-2527 )
tkinter¶
这个 tkinter._fix 用于在Windows上设置tcl/tk环境的模块已由 _tkinter 不会对环境变量进行永久性更改的模块。(由Zachary Ware在 bpo-20035 )
追溯¶
新的 walk_stack() 和 walk_tb() 函数可以方便地遍历框架和追溯对象。(罗伯特·柯林斯在 bpo-17911 )
新的轻量级类: TracebackException , StackSummary 和 FrameSummary . (罗伯特·柯林斯在 bpo-17911 )
两个 print_tb() 和 print_stack() 函数现在支持 limit 参数。(由Dmitry Kazakov于 bpo-22619 )
类型¶
一个新的 coroutine() 要转换的函数 generator 和 generator-like 对象进入 awaitables . (由Yury Selivanov在 bpo-24017 )
名为 CoroutineType ,用于 coroutine 对象创建者 async def 功能。(由Yury Selivanov在 bpo-24400 )
unicodedata¶
这个 unicodedata 模块现在使用来自 Unicode 8.0.0 .
单元测试¶
这个 TestLoader.loadTestsFromModule() 方法现在只接受关键字参数 模式 传递给 load_tests 作为第三个参数。现在检查找到的包 load_tests 不管他们的路径是否匹配 模式 ,因为包名称不可能与默认模式匹配。(罗伯特·柯林斯和巴里·A·华沙在 bpo-16662 )
UnitTest发现错误现在暴露在 TestLoader.errors 的属性 TestLoader 实例。(罗伯特·柯林斯在 bpo-19746 )
新的命令行选项 --locals 在回溯中显示局部变量。(罗伯特·柯林斯在 bpo-22936 )
unittest.mock¶
这个 Mock 类有以下改进:
类构造函数有一个新的 不安全的 参数,使模拟对象
AttributeError关于以开头的属性名"assert". (由Kushal Das在 bpo-21238 )一个新的
Mock.assert_not_called()方法来检查是否调用了模拟对象。(由Kushal Das在 bpo-21262 )
这个 MagicMock 类现在支持 __truediv__() , __divmod__() 和 __matmul__() 运算符。(约翰内斯·拜尔在 bpo-20968 和h_kan l_vdahl in bpo-23581 和 bpo-23568 )
不再需要显式传递 create=True 到 patch() 函数在修补内置名称时。(由Kushal Das在 bpo-17660 )
urllib¶
一个新的 request.HTTPPasswordMgrWithPriorAuth 类允许管理HTTP基本身份验证凭据,以消除不必要的 401 响应处理,或者在第一个请求时无条件地发送凭据,以便与返回 404 响应而不是 401 如果 Authorization 未发送标题。(由Matej Cepl在 bpo-19494 还有阿卡什·库拉纳 bpo-7159 )
一个新的 quote_via 的参数 parse.urlencode() 函数提供了一种方法,可以根据需要控制查询部分的编码。(由Samwyse和Arnon Yaari在 bpo-13866 )
这个 request.urlopen() 函数接受 ssl.SSLContext 对象作为 context 参数,将用于HTTPS连接。(由Alex Gaynor在 bpo-22366 )
这个 parse.urljoin() 已更新为使用 RFC 3986 解析相对URL的语义,而不是 RFC 1808 和 RFC 2396 . (由Demian Brecht和Senthil Kumaran在 bpo-22118 )
wsgiref¶
这个 headers 论证 headers.Headers 类构造函数现在是可选的。(由Pablo Torres Navarrete和SilentGhost在 bpo-5800 )
xmlrpc¶
这个 client.ServerProxy 类现在支持 context manager 协议。(克劳迪乌波巴在 bpo-20627 )
这个 client.ServerProxy 构造函数现在接受一个可选的 ssl.SSLContext 实例。(由Alex Gaynor在 bpo-22960 )
xml.sax¶
SAX解析器现在支持 xmlreader.InputSource 对象。(Serhiy Storchaka在 bpo-2175 )
parseString() 现在接受 str 实例。(Serhiy Storchaka在 bpo-10590 )
压缩文件¶
现在可以将ZIP输出写入不可访问的流。(Serhiy Storchaka在 bpo-23252 )
这个 mode 的参数 ZipFile.open() 方法现在接受 "x" 请求独占创建。(Serhiy Storchaka在 bpo-21717 )
其他模块级别更改¶
中的许多功能 mmap , ossaudiodev , socket , ssl 和 codecs 模块现在接受可写 bytes-like objects . (Serhiy Storchaka在 bpo-23001 )
优化¶
这个 os.walk() 在POSIX系统上,函数的速度提高了3到5倍,在Windows上提高了7到20倍。这是用新的 os.scandir() 函数,它公开来自底层的文件信息 readdir or FindFirstFile/FindNextFile 系统调用。(本·霍伊特在维克托·斯廷纳的帮助下 bpo-23605 )
建设 bytes(int) (由零字节填充)速度更快,对大型对象使用的内存更少。 calloc() 使用而不是 malloc() 为这些对象分配内存。(由Victor Stinner在 bpo-21233 )
一些操作 ipaddress IPv4Network 和 IPv6Network 已经大大加快了速度,例如 subnets() , supernet() , summarize_address_range() , collapse_addresses() .速度可以从3到15倍不等。(安托万·皮特鲁、米歇尔·阿尔伯特和马库斯在 bpo-21486 , bpo-21487 , bpo-20826 , bpo-23266 )
酸洗 ipaddress 对象被优化以产生明显较小的输出。(Serhiy Storchaka在 bpo-23133 )
许多操作 io.BytesIO 现在快了50%到100%。(Serhiy Storchaka在 bpo-15381 大卫·威尔逊在 bpo-22003 )
这个 marshal.dumps() 功能现在更快了:65-85%的版本是3和4,20-25%的版本是典型数据的0到2,在最好的情况下最多是5倍。(Serhiy Storchaka在 bpo-20416 和 bpo-23344 )
UTF-32编码器现在快了3到7倍。(Serhiy Storchaka在 bpo-15027 )
现在,正则表达式的解析速度提高了10%。(Serhiy Storchaka在 bpo-19380 )
这个 json.dumps() 优化函数以运行 ensure_ascii=False 和一样快 ensure_ascii=True .(Naoki Inada在 bpo-23206 )
这个 PyObject_IsInstance() 和 PyObject_IsSubclass() 在第二个参数 type 作为它的元类。(年由乔治·布兰德供稿) bpo-22540 )
方法缓存稍有改进,在一些基准测试中性能提高了5%。(由Antoine Pitrou在 bpo-22847 )
对象来自 random 模块现在在64位版本上使用的内存减少了50%。(Serhiy Storchaka在 bpo-23488 )
这个 property() getter调用速度快25%。(由Joe Jevnik在 bpo-23910 )
实例化 fractions.Fraction 现在快了30%。(由Stefan Behnel在 bpo-22464 )
字符串方法 find() , rfind() , split() , partition() 以及 in 字符串运算符现在搜索1个字符的子字符串的速度显著加快。(Serhiy Storchaka在 bpo-23573 )
构建和C API更改¶
新的 calloc 新增功能:
(由Victor Stinner在 bpo-21233 )
新的编码/解码助手函数:
Py_DecodeLocale()(替换)_Py_char2wchar())Py_EncodeLocale()(替换)_Py_wchar2char())
(由Victor Stinner在 bpo-18395 )
一个新的 PyCodec_NameReplaceErrors() 函数将Unicode编码错误替换为 \N{{...}} 逃逸。(Serhiy Storchaka在 bpo-19676 )
一个新的 PyErr_FormatV() 功能类似于 PyErr_Format() 但接受 va_list 参数。(由Antoine Pitrou在 bpo-18711 )
一个新的 PyExc_RecursionError 例外。(乔治布兰德尔在 bpo-19235 )
新的 PyModule_FromDefAndSpec() , PyModule_FromDefAndSpec2() 和 PyModule_ExecDef() 功能介绍人 PEP 489 --多相扩展模块初始化。(由Petr Viktorin在 bpo-24268 )
新的 PyNumber_MatrixMultiply() 和 PyNumber_InPlaceMatrixMultiply() 执行矩阵乘法的函数。(本杰明·彼得森于 bpo-21176 .另请参见 PEP 465 详情。
这个 PyTypeObject.tp_finalize 时隙现在是稳定ABI的一部分。
Windows构建现在需要微软Visual C++ 14,这是可用的一部分。 Visual Studio 2015 .
扩展模块现在在某些平台的文件名中包含一个平台信息标记(标记是可选的,cpython将导入不带它的扩展,尽管如果标记存在且不匹配,则不会加载扩展):
在Linux上,扩展模块文件名以
.cpython-<major><minor>m-<architecture>-<os>.pyd:<major>是python版本的主要编号;对于python 3.5,这是3.<minor>是python版本的次要编号;对于python 3.5,这是5.<architecture>扩展模块是为运行而构建的硬件体系结构。这也是最常见的i386对于32位Intel平台或x86_64对于64位Intel(和AMD)平台。<os>总是linux-gnu,除了在64位平台上为与32位ABI对话而构建的扩展之外,在这种情况下它是linux-gnu32(和<architecture>将x86_64)
在Windows上,扩展模块文件名以
<debug>.cp<major><minor>-<platform>.pyd:<major>是python版本的主要编号;对于python 3.5,这是3.<minor>是python版本的次要编号;对于python 3.5,这是5.<platform>扩展模块是为其构建的平台吗win32对于Win32,win_amd64对于Wi64,win_ia64对于Windows Itanium 64,以及win_arm手臂上的Windows。如果内置调试模式,
<debug>将_d,否则为空。
在OS X平台上,扩展模块文件名现在以
-darwin.so.在所有其他平台上,扩展模块文件名与Python3.4相同。
已弃用¶
新关键词¶
async 和 await 不建议用作变量、类、函数或模块名称。介绍通过 PEP 492 在python 3.5中,它们将成为python 3.7中合适的关键字。
已弃用的python行为¶
提高 StopIteration 生成器内部的异常现在将生成静默 PendingDeprecationWarning 将成为Python3.6中的非静默拒绝警告,并将触发 RuntimeError 在Python 3.7中。见 PEP 479: Change StopIteration handling inside generators 有关详细信息。
不支持的操作系统¶
Microsoft不再支持Windows XP,因此 PEP 11 ,cpython 3.5不再在此操作系统上得到正式支持。
不推荐使用的python模块、函数和方法¶
这个 formatter 模块现在已经完全弃用了,在python 3.6中仍将被删除。
这个 asyncio.async() 函数已弃用,取而代之的是 ensure_future() .
这个 smtpd 模块过去总是使用 utf-8 编解码器。现在可以由新的 decode_data 关键字到 SMTPServer . 默认值为 True ,但不推荐使用此默认值。指定 decode_data 具有适当值的关键字,以避免出现拒绝警告。
直接将值分配给 key , value 和 coded_value 属于 http.cookies.Morsel 对象已弃用。使用 set() 方法。此外,未登记的 LegalChars 参数 set() 已弃用,现在被忽略。
将格式字符串作为关键字参数传递 format_string 到 format() 方法 string.Formatter 类已被弃用。(Serhiy Storchaka在 bpo-23671 )
这个 platform.dist() 和 platform.linux_distribution() 现在不推荐使用函数。Linux发行版使用了太多不同的方式来描述它们自己,所以功能留给了一个包。(由Vajrasky Kok和Berker Peksag于 bpo-1322 )
以前未登记的 from_function 和 from_builtin 方法 inspect.Signature 已弃用。使用新的 Signature.from_callable() 方法。(由Yury Selivanov在 bpo-24248 )
这个 inspect.getargspec() 函数已弃用,并计划在python 3.6中删除。(见 bpo-20438 详情。
这个 inspect getfullargspec() , getcallargs() 和 formatargspec() 函数被弃用,取而代之的是 inspect.signature() 应用程序编程接口。(由Yury Selivanov在 bpo-20438 )
getargvalues() 和 formatargvalues() 在发布python 3.5.0时,无意中将函数标记为已弃用。
使用 re.LOCALE 带有str模式的标志或 re.ASCII 现已弃用。(Serhiy Storchaka在 bpo-22407 )
使用不可识别的特殊序列,包括 '\' 正则表达式模式和替换模式中的一个ASCII字母现在会引发一个拒绝警告,在Python3.6中是禁止的。(Serhiy Storchaka在 bpo-23622 )
无证和非官方的 use_load_tests 的默认参数 unittest.TestLoader.loadTestsFromModule() 方法现在已被弃用并忽略。(罗伯特·柯林斯和巴里·A·华沙在 bpo-16662 )
弃用¶
API和功能删除¶
已删除以下过时和以前不推荐使用的API和功能:
移植到python 3.5¶
本节列出了前面描述的更改和可能需要更改代码的其他错误修复。
python行为的变化¶
由于疏忽,早期的Python版本错误地接受了以下语法:
f(1 for x in [1], *args) f(1 for x in [1], **kwargs)
python 3.5现在正确地引发了
SyntaxError如果不是函数的唯一参数,则as generator表达式必须放在括号中。
python api中的更改¶
PEP 475 :系统调用现在在被信号中断时重试,而不是引发
InterruptedError如果python信号处理程序没有引发异常。在python 3.5之前,a
datetime.time如果对象以UTC表示午夜,则该对象被认为是错误的。这种行为被认为是不明显且容易出错的,已经在Python3.5中被删除。见 bpo-13936 详细信息。这个
ssl.SSLSocket.send()方法现在引发ssl.SSLWantReadError或ssl.SSLWantWriteError在非阻塞套接字上,如果操作将阻塞。以前,它会返回0. (Nikolaus Rath于 bpo-20951 )这个
__name__生成器的属性现在是从函数名设置的,而不是从代码名设置的。使用gen.gi_code.co_name检索代码名。生成器也有新的__qualname__属性,限定名,现在用于表示生成器 (repr(gen))(由Victor Stinner在 bpo-21205 )已弃用的“严格”模式和参数
HTMLParser,HTMLParser.error()和HTMLParserError已删除异常。(由Ezio Melotti在 bpo-15114 ) convert_charrefs 的参数HTMLParser现在是True默认情况下。(由Berker Peksag在 bpo-21047 )尽管它不是API的正式组成部分,但出于移植目的(即:修复测试),值得注意的是,以前的“someType”形式不支持缓冲协议的错误消息现在是“A”形式 bytes-like object 是必需的,而不是“someType”。(由Ezio Melotti在 bpo-16518 )
如果当前目录设置为不再存在的目录,则
FileNotFoundError将不再被引发,取而代之的是find_spec()将返回None没有 高速缓存None在里面sys.path_importer_cache与典型情况不同 (bpo-22834 )HTTP状态代码和来自的消息
http.client和http.server被重构成HTTPStatus枚举。中的值http.client和http.server保持向后兼容性。(德米安·布莱希特在 bpo-21793 )当导入加载程序定义
importlib.machinery.Loader.exec_module()现在还需要定义create_module()(提出一个DeprecationWarning现在,在python 3.6中是一个错误)。如果加载程序继承自importlib.abc.Loader那就没什么事可做了,只需定义create_module()归来None. (布雷特·坎农在 bpo-23014 )这个
re.split()函数始终忽略空模式匹配,因此"x*"工作模式与"x+"和"\b"模式从未起作用。现在re.split()如果模式可以匹配空字符串,则引发警告。为了兼容性,请使用从不匹配空字符串的模式(例如"x+"而不是"x*")只能匹配空字符串的模式(例如"\b")现在提出一个错误。(Serhiy Storchaka在 bpo-22818 )这个
http.cookies.Morsel类似dict的界面已经变得自始至终:莫尔斯比较现在采用key和value考虑到,copy()现在结果是Morsel实例而不是dict和update()如果更新字典中的任何键无效,将立即引发异常。此外,未登记的 LegalChars 参数set()已弃用,现在被忽略。(德米安·布莱希特在 bpo-2211 )PEP 488 已经移除
.pyo来自python的文件并引入了可选的opt-标签.pyc文件名。这个importlib.util.cache_from_source()获得了 optimization 用于帮助控制opt-标签。因此, debug_override 函数的参数现在已弃用。 .pyo 文件也不再作为python解释器的文件参数来支持,因此当单独分发时(即无源代码分发),它们就没有任何作用。由于在python 3.5中字节码的幻数发生了变化,所有这些都是旧的 .pyo 无论此PEP如何,来自以前版本的python的文件都是无效的。这个
socket模块现在导出CAN_RAW_FD_FRAMESLinux 3.6及更高版本上的常量。这个
ssl.cert_time_to_seconds()函数现在将输入时间解释为UTC,而不是本地时间,根据 RFC 5280 . 此外,返回值始终是int. (李秋拉在 bpo-19940 )这个
pygettext.py工具现在使用标准+nnnn格式在pot创建日期标题中设置时区。这个
smtplib模块现在使用sys.stderr而不是以前的模块级别stderr用于调试输出的变量。如果(测试)程序依赖于修补模块级变量以捕获调试输出,则需要更新它以捕获sys.stderr。这个
str.startswith()和str.endswith()方法不再返回True当查找空字符串时,索引完全超出范围。(Serhiy Storchaka在 bpo-24284 )这个
inspect.getdoc()函数现在返回从基类继承的文档字符串。如果继承的文档是适当的,则不再需要复制文档字符串。若要禁止继承的字符串,必须指定空字符串(或者可以填写文档)。此更改会影响pydoc模块与help()功能。(Serhiy Storchaka在 bpo-15582 )嵌套的
functools.partial()调用现在被压平。如果您依赖于以前的行为,现在可以向functools.partial()或者您可以创建functools.partial(). (亚历山大·伯罗波尔斯基于年 bpo-7830 )
C API中的更改¶
无证件者
format成员(非公开)PyMemoryViewObject结构已被删除。所有扩展依赖于中的相关部分memoryobject.h必须重建。这个
PyMemAllocator结构已重命名为PyMemAllocatorEx和一个新的calloc字段已添加。删除了未记录的宏
PyObject_REPR泄露了参考资料。使用格式字符%R在里面PyUnicode_FromFormat()-像函数一样格式化repr()对象的(Serhiy Storchaka在 bpo-22453 )因为缺少
__module__属性中断了pickle和自省,现在对没有__module__属性。这将是未来的一个属性错误。(Serhiy Storchaka在 bpo-20204 )作为 PEP 492 实施
tp_reserved槽PyTypeObject被替换为tp_as_async狭槽。参照 协程对象 对于新的类型、结构和功能。
python 3.5.4的显著变化¶
新的 make regen-all 建立目标¶
为了简化交叉编译,并确保在不需要现有的python版本可用的情况下可靠地编译cpython,基于autotools的构建系统不再尝试根据文件修改时间隐式地重新编译生成的文件。
相反,一个新的 make regen-all 已添加命令以在需要时强制重新生成这些文件(例如,在基于预生成版本构建了Python的初始版本之后)。
还定义了更多选择性再生目标-参见 Makefile.pre.in 有关详细信息。
(由Victor Stinner在 bpo-23404 )
3.5.4 新版功能.
移除 make touch 建立目标¶
这个 make touch 以前用于通过更新所生成文件的修改时间请求隐式重新生成的生成目标已被删除。
它已被新的 make regen-all 目标。
(由Victor Stinner在 bpo-23404 )
在 3.5.4 版更改.