Python3.5中的新功能¶
编辑: | Elvis Pranskevichus <elvis@magic.io>, Yury Selivanov <yury@magic.io> |
---|
本文将为你介绍Python从3.4到3.5新加入的特性。Python3.5于2015年9月13日正式发布。你可以点击 更新日志 了解详细情况。
参见
PEP 478 - Python3.5发布时间表
概要 – 新版本亮点¶
新语法特性:
新的库模块︰
新的内置功能︰
bytes % args
,bytearray % args
: PEP 461 – 向bytes和bytearray添加%
格式。- 新的
bytes.hex()
,bytearray.hex()
和memoryview.hex()
方法。(供稿人:Arnon Yaari,issue 9951。) memoryview
现在支持元组索引(包括多维)。(由Antoine Pitrou在issue 23632中提供。)- 生成器有一个新的
yield from
属性,它返回被yield 从
表达式迭代的对象。(由Benno Leslie和Yury Selivanov在版本24450提供)。 - 新增
RecursionError
异常。当达到最大递归深度限制时,会抛出此异常。(由Georg Brandl在issue 19235中提供。)
CPython改进实现:
- 当
LC_TYPE
语言代码是POSIX语言代码(C
语言代码),sys.stdin
和sys.stdout
surrogateescape
错误处理程序,而不是strict
错误处理程序。(由Victor Stinner在issue 19977中提供。) .pyo
文件已不再使用,并已被包含.pyc
名称中明确显示的优化级别的更灵活的方案替换。(参见PEP 488 overview。)- 内置和扩展模块现在在多阶段过程中初始化,这与Python模块的加载方式类似。(参见PEP 489 overview。)
对标准程序库有以下几方面的显著改善:
collections.OrderedDict
现在在C中实现,这使其快4到100倍。ssl
模块获得了对内存BIO的支持,它将SSL协议处理与网络IO分离。- 新的
os.scandir()
函数提供了目录遍历的更好和显着更快的方式。 functools.lru_cache()
大多在C中重新实现,从而产生更好的性能。- 新的
subprocess.run()
函数提供了一种简化的方法来运行子进程。 traceback
模块已被显着地增强,以提高性能和开发人员的便利性。
安全改进:
- SSLv3现在在标准库中已禁用。仍然可以通过手动实例化
ssl.SSLContext
启用。(有关更多详细信息,请参阅issue 22638;此更改已反向运行到CPython 3.4和2.7.) - HTTP cookie解析现在更加严格,以防止潜在的注入攻击。(由Antoine Pitrou在issue 22796中提供。)
Windows用户的福音:
- 用于Windows的新安装程序已替换旧的MSI。有关详细信息,请参阅在Windows上使用Python。
- 现在在 Windows 下使用 Microsoft Visual C++ 14.0 构建,扩展模块此时应同步跟进。
请阅读面向用户的更改的完整列表,包括许多其他较小的改进,CPython优化,弃用和潜在的移植问题。
新特征¶
PEP 492 - 具有async和await语法的协同程序。¶
PEP 492 通过添加 awaitable objects, coroutine functions, asynchronous iteration, 和 asynchronous context managers大大的提高了PYTHON的异步编程.
协程函数使用新的async def
语法声明:
>>> async def coro():
... return 'spam'
在协程函数内,新的await
表达式可用于暂停协程执行,直到结果可用。任何对象可以等待,只要通过定义__await__()
方法实现awaitable协议即可。
PEP 492还为 t>语句添加async for
使用新语法编写的基本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
。
有关详细信息,请参见Asynchronous Iterators文档部分。
也可以看看
- PEP 492 - 具有async和await语法的协程
- PEP由Yury Selivanov编写和实施。
PEP 465 - 用于矩阵乘法的专用中缀操作符¶
PEP 465为矩阵乘法添加了@
infix操作符号。目前,没有内置的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编写;由本杰明·彼得森执行。
PEP 448 - Additional Unpacking Generalizations¶
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
类似地,元组,列表,集合和字典显示允许多个解压缩(参见Expression lists和Dictionary displays):
>>> *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 - 附加拆分广义
- PEP由Joshua Landau编写;由Neil Girdhar,Thomas Wouters和Joshua Landau执行。
PEP 461 - percent formatting support for bytes and bytearray¶
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' / t5> '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
转换类型只应在需要与Python 2兼容的代码库中使用。
也可以看看
- PEP 461 - 将%格式化添加到字节和bytearray
- PEP由Ethan Furman编写;由Neil Schemenauer和Ethan Furman执行。
PEP 484 - Type Hints¶
函数注释语法自版本3.0( PEP 3107)起就是一个Python特性,但是注释的语义未定义。
经验表明,大多数函数注解使用都是为函数参数和返回值提供类型提示。很明显,如果标准库包括类型注释的基本定义和工具,这对Python用户将是有益的。
PEP 484引入了provisional module来提供这些标准定义和工具,以及注解不可用的情况的一些约定。
例如,这里是一个简单的函数,其参数和返回类型在注解中声明:
def greeting(name: str) -> str:
return 'Hello ' + name
虽然这些注解在运行时通过通常的__annotations__
属性可用,但在运行时不会进行自动类型检查。相反,假设单独的离线型检查器(例如,mypy)将用于按需源代码分析。
类型系统支持联合,通用类型和名为Any
的特殊类型,它与(即可分配到和来自)所有类型。
PEP 471 - os.scandir() function – a better and faster directory iterator¶
PEP 471向标准库添加了一个新的目录迭代函数os.scandir()
。此外,os.walk()
现在使用scandir
实现,这使得POSIX系统的速度提高了3到5倍,Windows系统的速度提高了7到20倍。这在很大程度上是通过大大减少调用os.stat()
遍历目录树所需的次数来实现的。
此外,scandir
返回一个迭代器,而不是返回一个文件名列表,这样可以在遍历非常大的目录时提高内存效率。
以下示例显示了使用os.scandir()
显示给定路径中不以'.'
。entry.is_file()
调用通常不会进行额外的系统调用:
for entry in os.scandir(path):
if not entry.name.startswith('.') and entry.is_file():
print(entry.name)
也可以看看
- PEP 471 - os.scandir()函数 - 一个更好,更快的目录迭代器
- PEP由Ben Hoyt在Victor Stinner的帮助下编写和实施。
PEP 475: Retry system calls failing with EINTR¶
每当系统调用(等待I / O)被信号中断时,将返回errno.EINTR
错误代码。以前,在这种情况下,Python会引发InterruptedError
。这意味着,当编写Python应用程序时,开发人员有两个选择:
- 忽略
InterruptedError
。 - 处理
InterruptedError
并尝试在每个调用站点重新启动中断的系统调用。
第一个选项使应用程序间歇性失败。第二个选项添加了大量的样板,使代码几乎不可读。比较:
print("Hello World")
和:
while True:
try:
print("Hello World")
break
except InterruptedError:
continue
PEP 475在EINTR
上实现系统调用的自动重试。这消除了在大多数情况下在用户代码中处理EINTR
或InterruptedError
的负担,并使Python程序(包括标准库)更加健壮。注意,只有在信号处理程序不引发异常时才重试系统调用。
以下是由信号中断时重试的函数列表:
open()
和io.open()
;faulthandler
模块的功能;os
functions: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
functions:devpoll.poll()
,epoll.poll()
,kqueue.control()
,poll.poll()
,select()
;- methods of the
socket
class:accept()
,connect()
(except for non-blocking sockets),recv()
,recvfrom()
,recvmsg()
,send()
,sendall()
,sendmsg()
,sendto()
; signal.sigtimedwait()
和signal.sigwaitinfo()
;time.sleep()
。
也可以看看
- PEP 475 - 使用EINTR重试系统调用失败
- PEP和执行由Charles-FrançoisNatali和Victor Stinner在Antoine Pitrou(法语连接)的帮助下编写。
PEP 479: Change StopIteration handling inside generators¶
生成器和StopIteration
在Python 3.4和更早版本中的交互有时是令人惊讶的,并且可以隐藏模糊的错误。以前,生成器函数内意外引发的StopIteration
被解释为驱动生成器的循环结构的迭代结束。
PEP 479更改生成器的行为:当在生成器内引发StopIteration
异常时,它将替换为RuntimeError
,然后退出生成器框架。此更改的主要目标是在未受保护的next()
调用引发StopIteration
并导致由生成器控制的迭代以静默方式终止的情况下,轻松调试。这与产生 从
构造结合是特别有害的。
这是向后不兼容的更改,因此要启用新行为,必须执行__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
如果未在生成器中引发StopIteration
异常,则未引入__future__
导入,将会引发PendingDeprecationWarning
。
也可以看看
- PEP 479 - 更改生成器内的StopIteration处理
- PEP由Chris Angelico和Guido van Rossum写。由Chris Angelico,Yury Selivanov和Nick Coghlan执行。
PEP 485: A function for testing approximate equality¶
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 - 测试近似相等的函数
- PEP由Christopher Barker编写;由Chris Barker和Tal Einat执行。
PEP 486: Make the Python Launcher aware of virtual environments¶
PEP 486使Windows启动程序(请参阅 PEP 397)了解活动虚拟环境。当使用默认解释器并设置了VIRTUAL_ENV
环境变量时,将使用虚拟环境中的解释器。
也可以看看
- PEP 486 - 让Python Launcher知道虚拟环境
- PEP由Paul Moore编写和实施。
Other Language Changes¶
核心Python语言的一些较小的更改是:
- 添加了
"namereplace"
错误处理程序。"backslashreplace"
错误处理程序现在可以解码和翻译。(由Serhiy Storchaka在问题19676和问题22286提供)。 -b
选项现在影响bytes
与int
的比较。(由Serhiy Storchaka在issue 23681中提供。)- 新哈萨克语
kz1048
和Tajikkoi8_t
codecs。(由Serhiy Storchaka在issue 22682和发出22681提供)。 - 属性文档字符串现在是可写的。这对于
collections.namedtuple()
文档字符串特别有用。(由Berker Peksag提供在issue 24064。) - 现在支持涉及相对进口的循环进口。(由Brett Cannon和Antoine Pitrou在问题17636提供。)
New Modules¶
typing¶
新的typing
provisional模块为函数类型注释提供了标准定义和工具。有关详细信息,请参阅Type Hints。
Improved Modules¶
argparse¶
ArgumentParser
类现在允许通过将allow_abbrev设置为False
来禁用长选项的abbreviated usage。(供稿人:Jonathan Paugh,Steven Bethard,paul j3和Daniel Eriksson在问题14910。)
asyncio¶
由于asyncio
模块是provisional,所以Python 3.5中引入的所有更改也已反向运行到Python 3.4.x.
从Python 3.4.0起,asyncio
模块中的显着变化:
- 新的调试API:
loop.set_debug()
和loop.get_debug()
方法。(由Victor Stinner撰稿) - proactor事件循环现在支持SSL。(由Antoine Pitrou和Victor Stinner在问题22560提供。)
- 新的
loop.is_closed()
方法来检查事件循环是否关闭。(由Victor Stinner在问题21326提供。) - 新的
loop.create_task()
可方便地为协程创建和计划新的Task
。create_task
方法也被所有asyncio函数使用,将协程封装到任务中,例如asyncio.wait()
,asyncio.gather()
(由Victor Stinner撰稿) - A new
transport.get_write_buffer_limits()
method to inquire for high- and low- water limits of the flow control. (由Victor Stinner撰稿) - 不建议使用
async()
函数,而使用ensure_future()
。(供稿:Yury Selivanov。) - 新的
loop.set_task_factory()
和loop.set_task_factory()
方法来定制loop.create_task()
方法使用的任务工厂。(供稿:Yury Selivanov。) - 新的
Queue.join()
和Queue.task_done()
队列方法。(由Victor Stinner撰稿) JoinableQueue
类已删除,以支持asyncio.Queue
类。(由Victor Stinner撰稿)
3.5.1中的更新:
ensure_future()
函数和所有使用它的函数,例如loop.run_until_complete()
现在接受所有种类的awaitable objects。(供稿:Yury Selivanov。)- 新的
run_coroutine_threadsafe()
函数将协程提交给其他线程的事件循环。(由Vincent Michel提供) - 新的
Transport.is_closing()
方法来检查传输是关闭还是关闭。(供稿:Yury Selivanov。) loop.create_server()
方法现在可以接受主机列表。(供稿人:Yann Sionneau。)
3.5.2中的更新:
- 新
loop.create_future()
方法来创建Future对象。这允许可选的事件循环实现,例如uvloop,以提供更快的asyncio.Future
实现。(供稿:Yury Selivanov。) - 新的
loop.get_exception_handler()
方法来获取当前的异常处理程序。(供稿:Yury Selivanov。) - 新
StreamReader.readuntil()
方法从流中读取数据,直到出现分隔符字节序列。(供稿:Mark Korenberg。) - 如果地址已经解决,则优化
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在issue 15955中提供。)
cgi¶
FieldStorage
类现在支持context manager协议。(由Berker Peksag提供,载于第20289期。)
cmath¶
新函数isclose()
提供了一种测试近似相等的方法。(由Chris Barker和Tal Einat在issue 24270中提供。)
code¶
InteractiveInterpreter.showtraceback()
方法现在可以打印完整链接的追溯,就像交互式解释器一样。(Contributed by Claudiu Popa in issue 17442。)
collections¶
OrderedDict
类现在在C中实现,这使得它的4到100倍更快。(由 span> 问题16991提供。)
OrderedDict.items()
,OrderedDict.keys()
,OrderedDict.values()
查看现在支持reversed()
(由Serhiy Storchaka在issue 19505中提供。)
The deque
class now defines index()
, insert()
, and copy()
, and supports the +
and *
operators. 这允许将deques识别为MutableSequence
并且提高它们对列表的可替换性。(由Raymond Hettinger在issue 23704中提供。)
现在可以更新namedtuple()
生成的Docstring:
Point = namedtuple('Point', ['x', 'y'])
Point.__doc__ += ': Cartesian coodinate'
Point.x.__doc__ = 'abscissa'
Point.y.__doc__ = 'ordinate'
(由Berker Peksag提供在issue 24064。)
UserString
类现在实现__getnewargs__()
,__rmod__()
,casefold()
,format_map()
,isprintable()
和maketrans()
方法匹配str
(由Joe Jevnik提供,载于issue 22189。)
collections.abc¶
The Sequence.index()
method now accepts start and stop arguments to match the corresponding methods of tuple
, list
, etc. (供稿人:Devin Jeanpierre in issue 23086。)
一个新的Generator
抽象基类。(由Stefan Behnel在问题24018中提供。)
新的Awaitable
,Coroutine
,AsyncIterator
和AsyncIterable
抽象基类。(由Yury Selivanov在issue 24184提供。)
对于早期的Python版本,外部PyPI包中提供了新ABCs的反向端口。
compileall¶
新的compileall
选项-j N
允许同时运行N执行并行字节码编译。compile_dir()
函数具有相应的workers
参数。(Contributed by Claudiu Popa in issue 16104。)
另一个新选项-r
允许控制子目录的最大递归级别。(Contributed by Claudiu Popa in issue 19628。)
现在可以多次指定-q
命令行选项,在这种情况下,所有输出(包括错误)都将被抑制。在compile_dir()
,compile_file()
和compile_path()
中的相应quiet
参数现在可以接受整数表示输出抑制电平的值。(Contributed by Thomas Kluyver in issue 21338。)
concurrent.futures¶
Executor.map()
方法现在接受chunksize参数,以允许批量处理任务,以提高使用ProcessPoolExecutor()
时的性能。(由Dan O'Reilly在问题11271中提供。)
ThreadPoolExecutor
构造函数中的工人数现在是可选的。默认值为CPU数量的5倍。(Contributed by Claudiu Popa in issue 21527。)
configparser¶
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']
(由ŁukaszLanga提供,issue 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提供在issue 22389。)
csv¶
writerow()
方法现在支持任意迭代,而不仅仅是序列。(由Serhiy Storchaka提供在issue 23171。)
curses¶
新update_lines_cols()
函数更新 LINES
和 COLS
环境变量。这对于检测手动屏幕调整大小很有用。(由Arnon Yaari在issue 4254中提供。)
dbm¶
dumb.open
在标记值为"n"
时始终创建新数据库。(Contributed by Claudiu Popa in issue 18039。)
difflib¶
由HtmlDiff.make_file()
生成的HTML文档的字符集现在可以使用新的字符集关键字参数进行自定义。HTML文档的默认字符集从"ISO-8859-1"
更改为"utf-8"
。(由Berker Peksag提供在issue 2052。)
diff_bytes()
函数现在可以比较字节字符串列表。这修复了Python 2的回归。(由Terry J.Reedy和Greg Ward在issue 17445中提供。)
distutils¶
build
和build_ext
命令现在接受一个-j
选项,以启用扩展模块的并行构建。(由Antoine Pitrou在发行5309提供。)
distutils
模块现在支持xz
压缩,并且可以通过将xztar
作为参数传递到bdist t8 > - format
。(由Serhiy Storchaka提供在issue 16314。)
doctest¶
如果模块不包含docstrings,而不是提高ValueError
,DocTestSuite()
函数将返回空的unittest.TestSuite
。(供稿人:Glenn Jones in issue 15916。)
email¶
新的政策选项Policy.mangle_from_
控制在电子邮件正文中以“From ”
开头的行是否生成器以前缀为">"
字符。对于所有其他策略,默认值为compat32
和False
的True
。(由Milan Oberkirch在issue 20098提供。)
新的Message.get_content_disposition()
方法可以方便地访问Content-Disposition标题的规范值。(由Abhilash Raj撰写,问题21083。)
可以将新的策略选项EmailPolicy.utf8
设置为True
,使用UTF-8字符集而不是使用编码字对电子邮件标头进行编码。这允许Messages
根据 RFC 6532格式化,并与支持 RFC 6531 SMTPUTF8
扩展。(由R. David Murray提供,issue 24211。)
mime.text.MIMEText
构造函数现在接受charset.Charset
实例。(由Claude Paroz和Berker Peksag提供,载于issue 16324。)
enum¶
如果只提供名称,Enum
callable有一个新参数start指定枚举值的初始值:
>>> Animal = enum.Enum('Animal', 'cat dog', start=10)
>>> Animal.cat
<Animal.cat: 10>
>>> Animal.dog
<Animal.dog: 11>
(由Ethan Furman在问题21706提供。)
faulthandler¶
enable()
,register()
,dump_traceback()
和dump_traceback_later()
(由Wei Wu在issue 23566提供。)
functools¶
大多数lru_cache()
机制现在在C中实现,使其显着更快。(由Matt Joiner,Alexey Kachayev和Serhiy Storchaka在问题14373提供。)
gzip¶
GzipFile
构造函数的mode参数现在接受"x"
以请求独占创建。(由Tim Heaney在issue 19222中提供。)
heapq¶
Element comparison in merge()
can now be customized by passing a key function in a new optional key keyword argument, and a new optional reverse keyword argument can be used to reverse element comparison:
>>> 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在issue 13742中提供。)
http¶
新的HTTPStatus
枚举,用于定义一组以英文书写的HTTP状态代码,原因短语和详细说明。(由Demian Brecht在问题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
(由Martin Panter在issue 3566中提供。)
idlelib and IDLE¶
由于idlelib实现了IDLE shell和编辑器,并且不打算由其他程序导入,因此每个版本都会得到改进。请参见Lib/idlelib/NEWS.txt
查看自3.4.0以来的更改的累积列表,以及在将来的3.5.x版本中所做的更改。此文件也可从IDLE 对话框中获取。
imaplib¶
IMAP4
类现在支持context manager协议。当在with
语句中使用时,IMAP4 LOGOUT
命令将在块结束时自动调用。(由TarekZiadé和Serhiy Storchaka在issue 4972提供。)
imaplib
模块现在支持 RFC 5161(ENABLE扩展)和 RFC 6855 UTF-8支持)通过IMAP4.enable()
方法。新的IMAP4.utf8_enabled
属性会跟踪是否启用 RFC 6855支持。(由Milan Oberkirch,R.David Murray和Maciej Szulik提供,在问题21800。)
imaplib
模块现在根据RFC建议,使用UTF-8自动编码非ASCII字符串用户名和密码。(由Milan Oberkirch提供在issue 21800。)
imghdr¶
what()
函数现在识别OpenEXR格式(由Martin Vignali和Claudiu Popa在问题20295中提供)和WebP 格式(由Fabrice Aneche和Claudiu Popa在20197年版中提供)。
importlib¶
util.LazyLoader
类允许在启动时间很重要的应用程序中延迟加载模块。(由Brett Cannon在issue 17621中提供。)
abc.InspectLoader.source_to_code()
方法现在是一个静态方法。这样,通过运行exec(code, module .__ dict __)
,可以更容易地初始化包含从字符串编译的代码的模块对象。(由Brett Cannon在问题21156提供。)
新的util.module_from_spec()
函数现在是创建新模块的首选方法。与直接创建types.ModuleType
实例相反,此新函数将基于传入的spec对象设置各种导入控制的属性。(由Brett Cannon在issue 20383中提供。)
inspect¶
Signature
和Parameter
类现在是可拾取和哈希的。(由Yury Selivanov在问题20726和问题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在issue 24190提供。)
新类方法Signature.from_callable()
使得Signature
的子类化更容易。(由Yury Selivanov和Eric Snow在问题17373提供)。
signature()
函数现在接受follow_wrapped可选关键字参数,当设置为False
时,禁用__wrapped__
(由Yury Selivanov在问题20691提供。)
A set of new functions to inspect coroutine functions and coroutine objects has been added: iscoroutine()
, iscoroutinefunction()
, isawaitable()
, getcoroutinelocals()
, and getcoroutinestate()
. (由Yury Selivanov在发行24017和发行24400提供)。
stack()
,trace()
,getouterframes()
和getinnerframes()
(由Daniel Shahaf在issue 16808中提供。)
io¶
新的BufferedIOBase.readinto1()
方法最多使用对底层原始流RawIOBase.read()
或RawIOBase.readinto()
(由Nikolaus Rath在issue 20578中提供。)
ipaddress¶
IPv4Network
和IPv6Network
类现在接受(地址, 网络掩码)
参数,以便轻松地从现有地址构造网络对象:
>>> 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提供,载于问题16531。)
IPv4Network
和IPv6Network
类的新reverse_pointer
属性返回反向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'
(Contributed by Leon Weber in issue 20480。)
json¶
json.tool
命令行界面现在保留在输入中传递的JSON对象中键的顺序。新的--sort-keys
选项可用于按字母顺序对键进行排序。(由Berker Peksag提供,载于issue 21650。)
JSON解码器现在引发JSONDecodeError
而不是ValueError
,以提供有关错误的更好的上下文信息。(由Serhiy Storchaka在issue 19361中提供。)
linecache¶
新的lazycache()
函数可用于捕获有关非基于文件的模块的信息,以允许稍后通过getline()
获取其行。这避免了做I / O直到实际需要一行,而不必无限地携带模块全局变量。(由Robert Collins在问题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édricKrier在issue 13918中提供。)
logging¶
所有记录方法(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在issue 20537中提供。)
handlers.HTTPHandler
类现在接受可选的ssl.SSLContext
实例来配置在HTTP连接中使用的SSL设置。(由 P> 发行22788提供的Alex Gaynor。)
handlers.QueueListener
类现在采用respect_handler_level关键字参数,如果设置为True
,则会将消息传递给处理程序,并将处理程序级别考虑在内。(供稿人:Vinay Sajip。)
lzma¶
LZMADecompressor.decompress()
方法现在接受可选的max_length参数,以限制解压缩数据的最大大小。(由Martin Panter在发行15955提供。)
math¶
math
模块中添加了两个新常数:inf
和nan
。(由Mark Dickinson在issue 23185中提供。)
新函数isclose()
提供了一种测试近似相等的方法。(由Chris Barker和Tal Einat在issue 24270中提供。)
已添加了一个新的gcd()
函数。fractions.gcd()
函数现已不推荐使用。(由Mark Dickinson和Serhiy Storchaka在issue 22486中提供。)
multiprocessing¶
sharedctypes.synchronized()
对象现在支持context manager协议。(由Charles-FrançoisNatali在问题21565提供。)
operator¶
attrgetter()
,itemgetter()
和methodcaller()
现在支持pickling。(由Josh Rosenberg和Serhiy Storchaka在问题22955提供。)
新的matmul()
和imatmul()
函数执行矩阵乘法。(由Benjamin Peterson在issue 21176中提供。)
os¶
添加了返回DirEntry
对象的迭代器的新scandir()
函数。如果可能,scandir()
在扫描目录时提取文件属性,无需执行后续系统调用以确定文件类型或属性,这可以显着提高性能。(由Ben Hoyt在Victor Stinner的帮助下,在issue 22524中提供。)
在Windows上,新的stat_result.st_file_attributes
属性现在可用。它对应于由GetFileInformationByHandle()
返回的BY_HANDLE_FILE_INFORMATION
结构的dwFileAttributes
成员。(由Ben Hoyt在问题21719中提供。)
The urandom()
function now uses the getrandom()
syscall on Linux 3.17 or newer, and getentropy()
on OpenBSD 5.6 and newer, removing the need to use /dev/urandom
and avoiding failures due to potential file descriptor exhaustion. (由Victor Stinner在issue 22181发表。)
新get_blocking()
和set_blocking()
函数允许获取和设置文件描述器的阻塞模式(O_NONBLOCK
。)(由Victor Stinner在issue 22054中提供。)
Windows上现在支持truncate()
和ftruncate()
函数。(由Steve Dower撰写,第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在issue 10395中提供。)
pathlib¶
新的Path.samefile()
方法可用于检查路径是否指向与另一个路径相同的文件,可以是另一个Path
对象,也可以是字符串:
>>> import pathlib
>>> p1 = pathlib.Path('/etc/hosts')
>>> p2 = pathlib.Path('/etc/../etc/hosts')
>>> p1.samefile(p2)
True
(由Vajrasky Kok和Antoine Pitrou提供,载于issue 19775。)
Path.mkdir()
方法现在接受一个新的可选exists_ok参数以匹配mkdir -p
和os.makedirs()
功能。(由Berker Peksag提供在issue 21539。)
有一个新的Path.expanduser()
方法来展开~
和~user
前缀。(由Serhiy Storchaka和Claudiu Popa提供,issue 19776。)
新的Path.home()
类方法可用于获取表示用户主目录的Path
实例。(Contributed by Victor Salgado and Mayank Tripathi in issue 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
(由Christopher Welborn在issue 20218中提供。)
pickle¶
嵌套对象(例如未绑定方法或嵌套类)现在可以使用协议版本4之前的pickle protocols进行选择。协议版本4已经支持这些情况。(由Serhiy Storchaka在issue 23611中提供。)
poplib¶
如果POP服务器支持,则新的POP3.utf8()
命令启用 RFC 6856(国际化电子邮件)支持。(供稿人:Milan OberKirch在issue 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提供在issue 9179。)
正则表达式中的捕获组的数量不再限于100。(由Serhiy Storchaka在issue 22437中提供。)
sub()
和subn()
现在用空字符串替换未匹配的组,而不是引发异常。(由Serhiy Storchaka提供在issue 1519638。)
The re.error
exceptions have new attributes, msg
, pattern
, pos
, lineno
, and colno
, that provide better context information about the error:
>>> re.compile("""
... (?x)
... .++
... """)
Traceback (most recent call last):
...
sre_constants.error: multiple repeat at position 16 (line 3, column 7)
(由Serhiy Storchaka在issue 22578中提供。)
readline¶
可以使用新的append_history_file()
函数将历史中指定数量的拖尾元素附加到给定文件。(由Bruno Cauet在issue 22940提供。)
selectors¶
新的DevpollSelector
支持在Solaris上进行高效的/dev/poll
轮询。(由Giampaolo Rodola在issue 18931中提供。)
shutil¶
The move()
function now accepts a copy_function argument, allowing, for example, the copy()
function to be used instead of the default copy2()
if there is a need to ignore file metadata when moving.(Contributed by Claudiu Popa in issue 19840。)
make_archive()
函数现在支持xztar格式。(由Serhiy Storchaka在issue 5411中提供。)
signal¶
在Windows上,set_wakeup_fd()
函数现在也支持套接字句柄。(由Victor Stinner在issue 22018中提供。)
signal
模块中的各种SIG*
常量已转换为Enums
。这允许在调试期间打印有意义的名称,而不是整数“魔术数字”。(由Giampaolo Rodola在问题21076提供。)
smtpd¶
Both the SMTPServer
and SMTPChannel
classes now accept a decode_data keyword argument to determine if the DATA
portion of the SMTP transaction is decoded using the "utf-8"
codec or is instead provided to the SMTPServer.process_message()
method as a byte string. 出于向后兼容性的原因,默认值为True
,但会在Python 3.6中更改为False
。如果decode_data设置为False
,则必须准备process_message
方法接受关键字参数。(由Maciej Szulik在issue 19662提供。)
SMTPServer
类现在通告8BITMIME
扩展( RFC 6152),如果decode_data已设置为True
。如果客户端在MAIL
命令上指定BODY=8BITMIME
,则通过mail_options传递到SMTPServer.process_message()
(由Milan Oberkirch和R. David Murray提供,载于问题21795。)
SMTPServer
类现在还支持SMTPUTF8
扩展( RFC 6531:国际化电子邮件)。如果客户端在MAIL
命令上指定SMTPUTF8 BODY = 8BITMIME
,则会将它们传递到SMTPServer.process_message()
通过mail_options关键字。正确处理SMTPUTF8
数据是process_message
方法的责任。(由Milan Oberkirch提供,载于issue 21725。)
现在可以直接或通过名称解析在SMTPServer
构造函数中提供IPv6地址,并使其成功连接。(供稿人:Milan Oberkirch在issue 14758。)
smtplib¶
新的SMTP.auth()
方法提供了实现自定义认证机制的便捷方法。(由Milan Oberkirch提供,载于issue 15014。)
SMTP.set_debuglevel()
方法现在接受一个额外的调试级别(2),它启用调试消息中的时间戳。(由Gavin Chappell和Maciej Szulik在issue 16914中提供。)
SMTP.sendmail()
和SMTP.send_message()
方法现在支持 RFC 6531(SMTPUTF8)。(由Milan Oberkirch和R. David Murray提供,载于issue 22027。)
sndhdr¶
what()
和whathdr()
函数现在返回一个namedtuple()
。(Contributed by Claudiu Popa in issue 18615。)
socket¶
具有超时的函数现在使用单调时钟,而不是系统时钟。(由Victor Stinner在issue 22043中提供。)
新的socket.sendfile()
方法允许通过使用UNIX上的高性能os.sendfile()
函数在套接字上发送文件,导致上传从2比使用简单socket.send()
快3倍。(由Giampaolo Rodola在issue 17552提供。)
socket.sendall()
方法不再在每次接收或发送字节时重置套接字超时。套接字超时现在是发送所有数据的最大总持续时间。(由Victor Stinner在发行23853提供。)
socket.listen()
方法的backlog参数现在是可选的。默认情况下,它设置为SOMAXCONN
或128
,取较小值。(由Charles-FrançoisNatali在问题21455提供。)
ssl¶
Memory BIO Support¶
(由Geert Jansen在issue 21965中提供。)
已添加新的SSLObject
类,以在SSLSocket
的网络I / O功能不必要或次优时为SSL协议提供支持。SSLObject
表示SSL协议实例,但不实现任何网络I / O方法,而是提供了一个内存缓冲区接口。新的MemoryBIO
类可用于在Python和SSL协议实例之间传递数据。
内存BIO SSL支持主要用于实现SSLSocket
就绪模型(“select / poll”)效率低下的异步I / O的框架中。
可以使用新的SSLContext.wrap_bio()
方法创建新的SSLObject
实例。
Application-Layer Protocol Negotiation Support¶
(由Benjamin Peterson在20188年版提供。)
在存在OpenSSL支持的情况下,ssl
模块现在实现应用层协议协商 t> TLS扩展,如 RFC 7301
新的SSLContext.set_alpn_protocols()
可用于指定套接字在TLS握手期间应通告哪些协议。
新的SSLSocket.selected_alpn_protocol()
返回在TLS握手期间选择的协议。HAS_ALPN
标志指示是否存在ALPN支持。
Other Changes¶
有一个新的SSLSocket.version()
方法来查询实际使用的协议版本。(由Antoine Pitrou在issue 20421中提供。)
SSLSocket
类现在实现了一个SSLSocket.sendfile()
方法。(由Giampaolo Rodola在issue 17552提供。)
SSLSocket.send()
方法现在在非阻塞套接字上引入ssl.SSLWantReadError
或ssl.SSLWantWriteError
异常块。以前,它将返回0
。(由Nikolaus Rath在问题20951中提供。)
cert_time_to_seconds()
函数现在根据 RFC 5280将输入时间解释为UTC,而不是本地时间。此外,返回值始终为int
。(由Akira Li在issue 19940中提供。)
新的SSLObject.shared_ciphers()
和SSLSocket.shared_ciphers()
方法返回客户端在握手期间发送的密码列表。(由Benjamin Peterson在第23186期提供。)
The SSLSocket.do_handshake()
, SSLSocket.read()
, SSLSocket.shutdown()
, and SSLSocket.write()
methods of the SSLSocket
class no longer reset the socket timeout every time bytes are received or sent. 套接字超时现在是方法的最大总持续时间。(由Victor Stinner在发行23853提供。)
match_hostname()
函数现在支持IP地址的匹配。(由Antoine Pitrou在issue 23239提供。)
sqlite3¶
Row
类现在完全支持序列协议,特别是reversed()
迭代和片索引。(Contributed by Claudiu Popa in issue 10203;由Lucas Sinclair,Jessica McKellar和Serhiy Storchaka在问题13583中提供。)
subprocess¶
已添加新的run()
函数。它运行指定的命令并返回一个CompletedProcess
对象,它描述一个完成的进程。新的API更加一致,是在Python代码中调用子进程的推荐方法,不需要保持与早期Python版本的兼容性。(Contributed by Thomas Kluyver in issue 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')
sys¶
A new set_coroutine_wrapper()
function allows setting a global hook that will be called whenever a coroutine object is created by an async def
function. 相应的get_coroutine_wrapper()
可用于获取当前设置的包装器。这两个函数都是provisional,仅用于调试目的。(由Yury Selivanov在issue 24017中提供。)
新的is_finalizing()
函数可用于检查Python解释器是否shutting down。(由Antoine Pitrou提供,载于issue 22696。)
sysconfig¶
Windows上的用户脚本目录的名称现在包括Python版本的前两个组件。(Paul Moore在issue 23437中提供。)
tarfile¶
open()
函数的模式参数现在接受"x"
以请求独占创建。(由Berker Peksag提供在issue 21717。)
TarFile.extractall()
和TarFile.extract()
方法现在采用关键字参数numeric_only。如果设置为True
,则提取的文件和目录将由来自tarfile的数字uid
和gid
拥有。如果设置为False
(默认值和3.5之前的版本中的行为),则它们将由tarfile中的命名用户和组拥有。(由Michael Vogt和Eric Smith在issue 23193中提供。)
TarFile.list()
现在接受可选的成员关键字参数,可以设置为TarFile.getmembers()
(由Serhiy Storchaka提供在issue 21549。)
threading¶
Lock.acquire()
和RLock.acquire()
方法现在使用单调时钟进行超时管理。(由Victor Stinner在issue 22043中提供。)
time¶
monotonic()
函数现在始终可用。(由Victor Stinner在issue 22043中提供。)
timeit¶
新的命令行选项-u
或 - unit = U
可用于指定时间单位定时器输出。支持的选项为usec
,msec
或sec
。(由Julian Gindi在issue 18983中提供。)
timeit()
函数有一个新的全局参数,用于指定代码将在其中运行的命名空间。(由Ben Roberts在issue 2527中提供。)
tkinter¶
用于在Windows上设置Tcl / Tk环境的tkinter._fix
模块已被_tkinter
模块中的私有函数替代,该模块不会永久更改环境变量。(由Zachary Ware在issue 20035中提供。)
traceback¶
新walk_stack()
和walk_tb()
函数可方便地遍历框架和回溯对象。(由Robert Collins在问题17911中提供。)
新的轻量级类:TracebackException
,StackSummary
和FrameSummary
。(由Robert Collins在问题17911中提供。)
print_tb()
和print_stack()
函数现在支持limit参数的负值。(Contributed by Dmitry Kazakov in issue 22619。)
types¶
用于将generator和generator-like
对象转换为awaitables的新coroutine()
函数。(由Yury Selivanov在issue 24017中提供。)
A new type called CoroutineType
, which is used for coroutine objects created by async def
functions. (由Yury Selivanov提供在issue 24400。)
unicodedata¶
unicodedata
模块现在使用来自Unicode 8.0.0的数据。
unittest¶
TestLoader.loadTestsFromModule()
方法现在接受作为第三个参数传递给load_tests
的仅关键字参数模式。发现的包现在检查load_tests
,无论它们的路径是否与模式匹配,因为包名称不能匹配默认模式。(由Robert Collins和Barry A. Warsaw提供,载于issue 16662。)
单元测试发现错误现在显示在TestLoader
实例的TestLoader.errors
属性中。(由Robert Collins在issue 19746中提供。)
新的命令行选项--locals
用于在traceback中显示局部变量。(由Robert Collins在issue 22936中提供。)
unittest.mock¶
Mock
类具有以下改进:
- 类构造函数具有一个新的unsafe参数,它导致模拟对象以
"assert"
开头的属性名称引发AttributeError
。(由Kushal Das在问题21238提供。) - 新的
Mock.assert_not_called()
方法来检查是否调用了mock对象。(由Kushal Das在问题21262提供。)
MagicMock
类现在支持__truediv__()
,__divmod__()
和__matmul__()
运算符。(由Johannes Baiter在问题20968和HåkanLövdahl在发行23581和发行23568提供。)
在修补内置名称时,不再需要将create=True
明确传递给patch()
函数。(由Kushal Das提供,问题17660。)
urllib¶
A new request.HTTPPasswordMgrWithPriorAuth
class allows HTTP Basic Authentication credentials to be managed so as to eliminate unnecessary 401
response handling, or to unconditionally send credentials on the first request in order to communicate with servers that return a 404
response instead of a 401
if the Authorization
header is not sent. (由Matej Cepl在issue 19494和Akshit Khurana在问题7159中提供。)
parse.urlencode()
函数的新quote_via参数提供了一种控制查询部分的编码的方法。(由Samwyse和Arnon Yaari在issue 13866中提供。)
request.urlopen()
函数接受ssl.SSLContext
对象作为上下文参数,将用于HTTPS连接。(由 P> 问题22366提供的Alex Gaynor。)
parse.urljoin()
更新为使用 RFC 3986语义解析相对网址,而不是 t6 > RFC 1808和 RFC 2396。(由Demian Brecht和Senthil Kumaran在issue 22118提供。)
wsgiref¶
headers.Headers
类构造函数的头参数现在是可选的。(由Pablo Torres Navarrete和SilentGhost在issue 5800中提供。)
xmlrpc¶
client.ServerProxy
类现在支持context manager协议。(Contributed by Claudiu Popa in issue 20627。)
client.ServerProxy
构造函数现在接受可选的ssl.SSLContext
实例。(由 P> 第22960号提供的Alex Gaynor。)
xml.sax¶
SAX解析器现在支持xmlreader.InputSource
对象的字符流。(由Serhiy Storchaka在issue 2175中提供。)
parseString()
现在接受str
实例。(由Serhiy Storchaka在issue 10590中提供。)
zipfile¶
ZIP输出现在可以写入不可搜索的流。(由Serhiy Storchaka在issue 23252中提供。)
ZipFile.open()
方法的模式参数现在接受"x"
以请求独占创建。(由Serhiy Storchaka在问题21717中提供。)
Other module-level changes¶
mmap
,ossaudiodev
,socket
,ssl
和codecs
模块中的许多功能现在接受可写的bytes-like objects。(由Serhiy Storchaka在issue 23001中提供。)
Optimizations¶
在POSIX系统上,os.walk()
的速度提高了3到5倍,在Windows上提高了7到20倍。这是使用新的os.scandir()
函数完成的,该函数暴露来自底层readdir
或FindFirstFile
/ FindNextFile
(由Ben Hoyt在Victor Stinner的帮助下在问题23605中提供。)
bytes(int)
(由零字节填充)的构造更快,对大对象使用更少的内存。使用calloc()
代替malloc()
为这些对象分配内存。(由Victor Stinner在问题21233提供。)
ipaddress
IPv4Network
和IPv6Network
上的某些操作已大规模升级,例如subnets()
,supernet()
,summarize_address_range()
,collapse_addresses()
。加速可以从3到15倍。(由Antoine Pitrou,Michel Albert和Markus在问题21486 t>,发出21487,发出20826,发出23266 t3 >。)
对ipaddress
对象的腌制进行了优化,以产生显着更小的输出。(由Serhiy Storchaka在issue 23133提供。)
io.BytesIO
上的许多操作现在快50%至100%。(由Serhiy Storchaka在issue 15381和David Wilson在问题22003中提供。)
marshal.dumps()
函数现在更快:版本3和4为65-85%,典型数据为20-25%,版本0-2,最佳情况下最多为5次。(由Serhiy Storchaka在问题20416和发布23344提供)。
UTF-32编码器现在的速度是3到7倍。(由Serhiy Storchaka在issue 15027中提供。)
正则表达式现在可以快速解析10%。(由Serhiy Storchaka在issue 19380中提供。)
json.dumps()
函数优化为使用ensure_ascii=False
运行,与ensure_ascii=True
一样快。(由Naoki Inada在问题23206提供。)
在第二个参数具有type
作为其元类的常见情况下,PyObject_IsInstance()
和PyObject_IsSubclass()
(Contributed Georg Brandl by in issue 22540。)
方法缓存略有改进,在一些基准测试中可提高5%的性能提升。(由Antoine Pitrou在issue 22847中提供。)
来自random
模块的对象现在在64位构建上使用50%的内存。(由Serhiy Storchaka提供在issue 23488。)
property()
getter调用速度提高了25%。(由Joe Jevnik在issue 23910中提供。)
实例化fractions.Fraction
现在的速度提高了30%。(由Stefan Behnel在issue 22464中提供)。
String methods find()
, rfind()
, split()
, partition()
and the in
string operator are now significantly faster for searching 1-character substrings. (由Serhiy Storchaka在issue 23573中提供。)
Build and C API Changes¶
添加了新calloc
功能:
PyMem_RawCalloc()
,PyMem_Calloc()
,PyObject_Calloc()
,_PyObject_GC_Calloc()
。
(由Victor Stinner在问题21233提供。)
新的编码/解码助手功能:
Py_DecodeLocale()
(替换为_Py_char2wchar()
),Py_EncodeLocale()
(替换为_Py_wchar2char()
)。
(由Victor Stinner在发行18395提供。)
新的PyCodec_NameReplaceErrors()
函数用\N{...}
转义替换unicode编码错误。(由Serhiy Storchaka在issue 19676中提供。)
与PyErr_Format()
类似的新PyErr_FormatV()
函数,但接受va_list
参数。(由Antoine Pitrou在问题18711提供。)
新的PyExc_RecursionError
异常。(由Georg Brandl在issue 19235中提供。)
New PyModule_FromDefAndSpec()
, PyModule_FromDefAndSpec2()
, and PyModule_ExecDef()
functions introduced by PEP 489 – multi-phase extension module initialization. (供稿人:Petr Viktorin,issue 24268。)
新PyNumber_MatrixMultiply()
和PyNumber_InPlaceMatrixMultiply()
用于执行矩阵乘法。(由Benjamin Peterson在问题21176提供。有关详细信息,另见 PEP 465)。
PyTypeObject.tp_finalize
槽现在是稳定ABI的一部分。
Windows构建现在需要Microsoft Visual C ++ 14.0,它作为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>
是构建为运行的扩展模块的硬件架构。最常见的是32位Intel平台的i386
或64位Intel(和AMD)平台的x86_64
。<os>
is alwayslinux-gnu
, except for extensions built to talk to the 32-bit ABI on 64-bit platforms, in which case it islinux-gnu32
(and<architecture>
will bex86_64
).
- 在Windows上,扩展模块文件名以
<debug>.cp<major><minor>-<platform>.pyd
<major>
是Python版本的主要编号;对于Python 3.5,这是3
。<minor>
是Python版本的次要编号;对于Python 3.5,这是5
。<platform>
is the platform the extension module was built for, eitherwin32
for Win32,win_amd64
for Win64,win_ia64
for Windows Itanium 64, andwin_arm
for Windows on ARM.- 如果内置在调试模式下,
<debug>
将为_d
,否则为空。
- 在OS X平台上,扩展模块文件名现在以
-darwin.so
结尾。 - 在所有其他平台上,扩展模块文件名与Python 3.4相同。
Deprecated¶
Deprecated Python Behavior¶
在生成器中提升StopIteration
异常现在将生成一个无声的PendingDeprecationWarning
,它将在Python 3.6中成为非静默的弃用警告,并将触发RuntimeError
有关详细信息,请参阅PEP 479: Change StopIteration handling inside generators中的更改StopIteration处理。
Deprecated Python modules, functions and methods¶
formatter
模块现在已经完全弃用,并且仍然可以在Python 3.6中删除。
不建议使用asyncio.async()
函数,而使用ensure_future()
。
smtpd
模块在过去总是使用utf-8
编解码器解码电子邮件的DATA部分。现在可以通过SMTPServer
的新decode_data关键字控制。默认值为True
,但此默认值已弃用。使用适当的值指定decode_data关键字,以避免弃用警告。
直接将值分配给http.cookies.Morsel
对象的key
,value
和coded_value
请改用set()
方法。此外,set()
的未记录的LegalChars参数已被弃用,现在被忽略。
将格式字符串作为关键字参数format_string传递到string.Formatter
类的format()
方法已被弃用。(由Serhiy Storchaka在issue 23671中提供。)
The platform.dist()
and platform.linux_distribution()
functions are now deprecated. Linux发行版使用太多不同的方式描述自己,所以功能留给包。(由Vajrasky Kok和Berker Peksag提供,载于第1322期。)
已弃用inspect.Signature
的以前未记录的from_function
和from_builtin
方法。请改用新的Signature.from_callable()
方法。(由Yury Selivanov在issue 24248提供。)
inspect.getargspec()
函数已弃用,计划在Python 3.6中删除。(有关详情,请参阅issue 20438)。
The inspect
getfullargspec()
, getargvalues()
, getcallargs()
, getargvalues()
, formatargspec()
, and formatargvalues()
functions are deprecated in favor of the inspect.signature()
API. (由Yury Selivanov在issue 20438提供。)
使用带有str模式或re.ASCII
的re.LOCALE
标志现已不推荐使用。(由Serhiy Storchaka在issue 22407中提供。)
在正则表达式模式和替换模式中使用由'\'
组成的无法识别的特殊序列和ASCII字母引发弃用警告,并将在Python 3.6中禁止。(由Serhiy Storchaka在issue 23622中提供。)
现在,不再推荐并忽略unittest.TestLoader.loadTestsFromModule()
方法的未记录和非正式的use_load_tests默认参数。(由Robert Collins和Barry A. Warsaw提供,载于issue 16662。)
Removed¶
API and Feature Removals¶
以下已过时且以前已弃用的API和特征已删除:
- 已从电子邮件包中删除
__version__
属性。电子邮件代码长时间未从stdlib单独发运,并且在最近几个版本中未更新__version__
字符串。 ftplib
模块中的内部Netrc
类在3.4中已弃用,现在已被删除。(由Matt Chaput在issue 6623中提供。).pyo
文件的概念已删除。- 临时
asyncio
模块中的JoinableQueue类已在3.4.4中被弃用,现在已被删除。(由A. Jesse Jiryu Davis在issue 23464中提供。)
Porting to Python 3.5¶
本节列出了之前描述的更改和其他可能需要更改代码的错误。
Changes in Python behavior¶
由于监督,早期的Python版本错误地接受以下语法:
f(1 for x in [1], *args) f(1 for x in [1], **kwargs)
Python 3.5现在正确引用了一个
SyntaxError
,因为生成器表达式必须放在括号中,如果不是函数的唯一参数。
Changes in the Python API¶
- PEP 475:如果Python信号处理程序不引发异常,系统调用现在在信号中断时重试,而不是提高
InterruptedError
。 - 在Python 3.5之前,如果某个
datetime.time
对象表示UTC的午夜,则该对象被视为false。这个行为被认为是晦涩和容易出错,已在Python 3.5中删除。有关详细信息,请参见问题13936。 ssl.SSLSocket.send()
方法现在在非阻塞套接字上引入ssl.SSLWantReadError
或ssl.SSLWantWriteError
块。以前,它将返回0
。(由Nikolaus Rath在问题20951中提供。)- 生成器的
__name__
属性现在从函数名称设置,而不是从代码名称设置。使用gen.gi_code.co_name
检索代码名称。生成器还具有新的__qualname__
属性,限定名,现在用于生成器(repr(gen)
)的表示。(由Victor Stinner在问题21205提供。) - 已删除过时的“严格”模式和参数
HTMLParser
,HTMLParser.error()
和HTMLParserError
异常。(由Ezio Melotti在issue 15114中提供。)默认情况下,HTMLParser
的convert_charrefs参数现在为True
。(由Berker Peksag提供在issue 21047。) - 虽然它不是API的正式组成部分,但是值得注意的是移植目的(即:修复测试)以前的形式“'sometype'的错误消息不支持缓冲区协议”现在的形式“a bytes-like object是必需的,而不是'sometype'“。(由Ezio Melotti在问题16518中提供。)
- If the current directory is set to a directory that no longer exists then
FileNotFoundError
will no longer be raised and insteadfind_spec()
will returnNone
without cachingNone
insys.path_importer_cache
, which is different than the typical case (issue 22834). - 来自
http.client
和http.server
的HTTP状态代码和邮件已重构为常见的HTTPStatus
枚举。http.client
和http.server
中的值仍然可用于向后兼容。(由Demian Brecht在问题21793提供。) - 当导入加载器定义
importlib.machinery.Loader.exec_module()
时,现在希望还定义create_module()
(引用DeprecationWarning
,将在Python 3.6中出现错误)。如果加载器继承自importlib.abc.Loader
,则无需做任何事情,否则只需定义create_module()
返回None
。(由Brett Cannon在issue 23014中提供。) re.split()
函数总是忽略空模式匹配,因此"x*"
模式与"x+"
"\b"
模式从未工作过。现在re.split()
如果模式可以匹配空字符串,则引发警告。为了兼容性,请使用从不匹配空字符串的模式。"x+"
而不是"x*"
)。只能匹配空字符串(如"\b"
)的模式现在引发错误。(由Serhiy Storchaka在issue 22818中提供。)http.cookies.Morsel
类字符接口已经自我一致:morsel比较现在将key
和value
纳入考虑,copy()
现在会导致Morsel
实例而不是dict
,并且update()
此外,set()
的未记录的LegalChars参数已被弃用,现在被忽略。(由Demian Brecht在issue 2211中提供。)- PEP 488 has removed
.pyo
files from Python and introduced the optionalopt-
tag in.pyc
file names.importlib.util.cache_from_source()
已获得优化参数,以帮助控制opt-
标记。因此,函数的debug_override参数现在已被弃用。.pyo文件也不再支持作为Python解释器的文件参数,因此当它们自己分发时不起作用。无源代码分布)。由于字节码的幻数在Python 3.5中已经改变,所以来自以前版本的Python的所有旧的.pyo文件都是无效的,与此PEP无关。 socket
模块现在在linux 3.6及更高版本上导出CAN_RAW_FD_FRAMES
常量。ssl.cert_time_to_seconds()
函数现在根据 RFC 5280将输入时间解释为UTC,而不是本地时间。此外,返回值始终为int
。(由Akira Li在issue 19940中提供。)pygettext.py
工具现在在POT-Creation-Date标题中使用标准的+ NNNN格式的时区。smtplib
模块现在使用sys.stderr
而不是以前的模块级stderr
变量来进行调试输出。如果您的(测试)程序依赖于修补模块级变量来捕获调试输出,则需要更新它以捕获sys.stderr。- 在找到空字符串且索引完全不在时,
str.startswith()
和str.endswith()
方法不再返回True
范围。(由Serhiy Storchaka在issue 24284提供。) inspect.getdoc()
函数现在返回从基类继承的文档字符串。如果继承的文档是合适的,则不再需要重复文档字符串。要抑制继承的字符串,必须指定一个空字符串(或者可以填写文档)。此更改会影响pydoc
模块和help()
函数的输出。(由Serhiy Storchaka提供在issue 15582。)- 嵌套的
functools.partial()
调用现在已展开。如果您依赖于之前的行为,现在可以向functools.partial()
对象添加属性,也可以创建functools.partial()
的子类。(由Alexander Belopolsky提供,issue 7830。)
Changes in the C API¶
- 已删除(非公共)
PyMemoryViewObject
结构的未记录的format
成员。必须重新构建依赖于memoryobject.h
中相关部分的所有扩展。 - 将
PyMemAllocator
结构重命名为PyMemAllocatorEx
并添加了新的calloc
字段。 - 删除了泄露引用的未记录的宏
PyObject_REPR
。Use format character%R
inPyUnicode_FromFormat()
-like functions to format therepr()
of the object. (由Serhiy Storchaka在issue 22453中提供。) - 因为缺少
__module__
属性会中断pickling和introspection,现在针对没有__module__
属性的内置类型提出了弃用警告。这将是一个AttributeError在未来。(由Serhiy Storchaka在发行20204中提供。) - 作为 PEP 492实现的一部分,
PyTypeObject
的tp_reserved
槽替换为tp_as_async
有关新类型,结构和函数,请参阅Coroutine Objects。