python 3.6的新功能¶
- 编辑
埃尔维斯·普兰斯基·维库斯<elvis@magic.io>,尤里·塞利万诺夫<yury@magic.io>
本文解释了与3.5相比,python 3.6中的新特性。python 3.6于2016年12月23日发布。见 changelog 以获取完整的更改列表。
参见
PEP 494 -python 3.6发布计划
总结——发布亮点¶
新语法功能:
新库模块:
CPython实施改进:
这个 dict 类型已重新实现以使用 more compact representation 基于 a proposal by Raymond Hettinger 类似于 PyPy dict implementation . 这导致字典使用的内存比Python3.5少20%到25%。
类创建的自定义已经简化为 new protocol .
类属性定义顺序为 now preserved .
元素的顺序
**kwargs
现在 corresponds to the order 其中关键字参数被传递给函数。DTrace和SystemTap probing support 已被添加。
新的 PYTHONMALLOC 环境变量现在可以用来调试解释器内存分配和访问错误。
标准库的重大改进:
这个
asyncio
模块已经收到了新的功能、显著的可用性和性能改进,以及大量的错误修复。从python 3.6开始asyncio
模块不再是临时的,其API被认为是稳定的。一个新的 file system path protocol 已实施以支持 path-like objects . 所有在路径上运行的标准库函数都已更新,以使用新协议。
这个
datetime
模块已获得支持 Local Time Disambiguation .这个
typing
模块接收到一个数字 improvements .这个
tracemalloc
模块经过了大量的改造,现在用于提供更好的输出ResourceWarning
以及为内存分配错误提供更好的诊断。见 PYTHONMALLOC section 更多信息。
安全改进:
新的
secrets
增加了模块以简化密码强伪随机数的生成,这些伪随机数适用于管理诸如帐户验证、令牌等机密。在Linux上,
os.urandom()
现在阻塞,直到系统urandom熵池初始化以提高安全性。见 PEP 524 理由是。的默认设置和功能集
ssl
模块已经改进。这个
hashlib
模块接收到对blake2、sha-3和shakehash算法以及scrypt()
密钥派生函数。
Windows改进:
这个
py.exe
当以交互方式使用时,当用户没有指定版本(通过命令行参数或配置文件)时,与python 3相比,launcher不再偏好python 2。shebang行的处理保持不变-“python”在这种情况下指的是python 2。python.exe
和pythonw.exe
已标记为长路径感知,这意味着260个字符的路径限制可能不再适用。见 removing the MAX_PATH limitation 有关详细信息。A
._pth
可以添加文件以强制隔离模式,并完全指定所有搜索路径以避免注册表和环境查找。见 the documentation 更多信息。A
python36.zip
文件现在作为一个地标来推断PYTHONHOME
. 见 the documentation 更多信息。
新特点¶
PEP 498:格式化字符串文本¶
PEP 498 介绍一种新的字符串文本: f-strings 或 formatted string literals .
带格式的字符串文本的前缀为 'f'
与接受的格式字符串类似 str.format()
. 它们包含由大括号包围的替换字段。替换字段是在运行timeit算的表达式,然后使用 format()
协议::
>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}" # nested fields
'result: 12.35'
PEP 526:变量注释的语法¶
PEP 484 介绍了函数参数类型注释的标准,A.K.A.类型提示。此PEP为python添加了语法,用于注释变量类型,包括类变量和实例变量:
primes: List[int] = []
captain: str # Note: no initial value!
class Starship:
stats: Dict[str, int] = {}
与函数注释一样,python解释器不向变量注释附加任何特定的含义,只将它们存储在 __annotations__
类或模块的属性。
与静态类型语言中的变量声明不同,注释语法的目标是通过抽象语法树和 __annotations__
属性。
PEP 515:数字文本中的下划线¶
PEP 515 添加在数字文本中使用下划线的功能,以提高可读性。例如::
>>> 1_000_000_000_000_000
1000000000000000
>>> 0x_FF_FF_FF_FF
4294967295
允许在数字之间和任何基说明符之后使用单下划线。行中不允许有前导、尾随或多个下划线。
这个 string formatting 语言现在也支持 '_'
用于指示对浮点表示类型和整数表示类型的千位分隔符使用下划线的选项 'd'
. 对于整数表示类型 'b'
, 'o'
, 'x'
和 'X'
,下划线将每隔4位插入:
>>> '{:_}'.format(1000000)
'1_000_000'
>>> '{:_x}'.format(0xFFFFFFFF)
'ffff_ffff'
参见
- PEP 515 --数字文本中的下划线
乔治·布兰德和塞尔希·斯托查卡写的PEP。
PEP 525:异步生成器¶
PEP 492 引入了对本地协同程序的支持 async
/ await
语法为python 3.5。python 3.5实现的一个显著限制是不可能使用 await
和 yield
在同一功能体中。在python 3.6中,这个限制已经解除,可以定义 异步生成器 ::
async def ticker(delay, to):
"""Yield numbers from 0 to *to* every *delay* seconds."""
for i in range(to):
yield i
await asyncio.sleep(delay)
新的语法允许更快、更简洁的代码。
参见
- PEP 525 --异步生成器
由Yury Selivanov编写和实施的PEP。
PEP 530:异步理解¶
PEP 530 添加对使用的支持 async for
在列表、集合、dict理解和生成器表达式中:
result = [i async for i in aiter() if i % 2]
此外, await
各种理解都支持表达式::
result = [await fun() for fun in funcs if await condition()]
参见
- PEP 530 --异步理解
由Yury Selivanov编写和实施的PEP。
PEP 487:类创建的简单定制¶
现在可以自定义子类创建而不使用元类。新的 __init_subclass__
每当创建新的子类时,将在基类上调用ClassMethod::
class PluginBase:
subclasses = []
def __init_subclass__(cls, **kwargs):
super().__init_subclass__(**kwargs)
cls.subclasses.append(cls)
class Plugin1(PluginBase):
pass
class Plugin2(PluginBase):
pass
为了允许零参数 super()
调用以正确工作 __init_subclass__()
实现,自定义元类必须确保 __classcell__
命名空间条目传播到 type.__new__
(如中所述 创建类对象 )
PEP 487:描述符协议增强¶
PEP 487 扩展描述符协议以包括新的可选 __set_name__()
方法。每当定义了一个新的类时,将对定义中包含的所有描述符调用新方法,为它们提供对正在定义的类的引用以及类命名空间中为描述符指定的名称。换句话说,描述符的实例现在可以知道所有者类中描述符的属性名:
class IntField:
def __get__(self, instance, owner):
return instance.__dict__[self.name]
def __set__(self, instance, value):
if not isinstance(value, int):
raise ValueError(f'expecting integer in {self.name}')
instance.__dict__[self.name] = value
# this is the new initializer:
def __set_name__(self, owner, name):
self.name = name
class Model:
int_field = IntField()
PEP 519:添加文件系统路径协议¶
文件系统路径历史上表示为 str
或 bytes
物体。这导致了编写在文件系统路径上操作的代码的人认为这些对象只是这两种类型中的一种(即 int
表示文件描述符并不算作文件路径)。不幸的是,该假设阻止了文件系统路径的替代对象表示,例如 pathlib
从使用预先存在的代码开始,包括Python的标准库。
为了解决这个问题,一个新的接口由 os.PathLike
已定义。通过实施 __fspath__()
方法,对象表示它表示路径。然后,对象可以提供文件系统路径的低级表示,作为 str
或 bytes
对象。这意味着考虑对象 path-like 如果它实现 os.PathLike
或者是 str
或 bytes
表示文件系统路径的对象。代码可以使用 os.fspath()
, os.fsdecode()
或 os.fsencode()
明确地得到 str
和/或 bytes
类似路径的对象的表示。
内置的 open()
函数已更新为接受 os.PathLike
对象中的所有相关函数 os
和 os.path
模块,以及标准库中的大多数其他函数和类。这个 os.DirEntry
中的类和相关类 pathlib
也已更新以实施 os.PathLike
.
希望更新文件系统路径上操作的基本函数将导致第三方代码隐式支持所有 path-like objects 没有任何代码更改,或至少非常小的更改(例如,调用 os.fspath()
在对类似路径的对象进行操作之前的代码开头)。
下面是一些新接口如何允许 pathlib.Path
与预先存在的代码一起更容易、更透明地使用:
>>> import pathlib
>>> with open(pathlib.Path("README")) as f:
... contents = f.read()
...
>>> import os.path
>>> os.path.splitext(pathlib.Path("some_file.txt"))
('some_file', '.txt')
>>> os.path.join("/a/b", pathlib.Path("c"))
'/a/b/c'
>>> import os
>>> os.fspath(pathlib.Path("some_file.txt"))
'some_file.txt'
(由Brett Cannon、Ethan Furman、Dusty Phillips和Jelle Zijlstra实施。)
参见
- PEP 519 --添加文件系统路径协议
布雷特·坎农和库斯·泽文霍夫写的PEP。
PEP 495:当地时间消除歧义¶
在世界上大多数地方,本地时钟已经或将要被移回。在这些时间中,引入了本地时钟在同一天显示两次相同时间的间隔。在这些情况下,本地时钟上显示的信息(或存储在Python日期时间实例中)不足以标识特定的时间点。
PEP 495 添加新的 fold 属性到的实例 datetime.datetime
和 datetime.time
用于区分本地时间相同的两个时间点的类:
>>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)
>>> for i in range(4):
... u = u0 + i*HOUR
... t = u.astimezone(Eastern)
... print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
...
04:00:00 UTC = 00:00:00 EDT 0
05:00:00 UTC = 01:00:00 EDT 0
06:00:00 UTC = 01:00:00 EST 1
07:00:00 UTC = 02:00:00 EST 0
的值 fold
属性具有值 0
对于所有情况,除了那些在不明确的情况下代表时间的第二个(按时间顺序)时刻的情况。
参见
- PEP 495 --当地时间消除歧义
Pep由Alexander Belopolsky和Tim Peters编写,由Alexander Belopolsky实施。
PEP 529:将Windows文件系统编码更改为UTF-8¶
表示文件系统路径最好使用str(unicode)而不是字节。但是,在某些情况下,使用字节是充分和正确的。
在Python3.6之前,在Windows上使用字节路径可能会导致数据丢失。通过这种更改,现在Windows支持使用字节来表示路径,前提是这些字节是用返回的编码进行编码的。 sys.getfilesystemencoding()
,现在默认为 'utf-8'
.
不使用str表示路径的应用程序应使用 os.fsencode()
和 os.fsdecode()
以确保其字节正确编码。要恢复到以前的行为,请设置 PYTHONLEGACYWINDOWSFSENCODING
或调用 sys._enablelegacywindowsfsencoding()
.
见 PEP 529 有关可能需要的代码修改的更多信息和讨论。
PEP 528:将Windows控制台编码更改为UTF-8¶
Windows上的默认控制台现在将接受所有Unicode字符,并为python代码提供正确读取的str对象。 sys.stdin
, sys.stdout
和 sys.stderr
现在默认为UTF-8编码。
此更改仅适用于使用交互式控制台时,而不适用于重定向文件或管道时。要恢复到以前的行为以供交互式控制台使用,请设置 PYTHONLEGACYWINDOWSSTDIO
.
参见
- PEP 528 --将Windows控制台编码更改为UTF-8
PEP由Steve Dower编写并实施。
PEP 520:保留类属性定义顺序¶
类定义主体中的属性具有自然的顺序:名称在源中的显示顺序相同。这个顺序现在保存在新类的 __dict__
属性。
此外,有效默认类 执行 命名空间(从返回 type.__prepare__() )现在是一个保留插入顺序的映射。
参见
- PEP 520 --保留类属性定义顺序
Pep由Eric Snow编写并实施。
PEP 468:保留关键字参数顺序¶
**kwargs
在一个函数中,签名现在保证是一个保留插入顺序的映射。
参见
- PEP 468 --保留关键字参数顺序
Pep由Eric Snow编写并实施。
新的 dict 实施¶
这个 dict 类型现在使用基于 a proposal by Raymond Hettinger 那是 first implemented by PyPy . 新的内存使用 dict()
比python 3.5小20%到25%。
这个新实现的订单保留方面被认为是一个实现细节,不应该依赖(这在将来可能会改变,但在将语言规范更改为强制为所有当前和未来的pyth保留订单语义之前,希望在语言中使用这个新的dict实现几个版本。在实现上,这也有助于保持与旧版本的语言的向后兼容性,在这些版本中,随机迭代顺序仍然有效,例如python 3.5)。
(Inada Naoki在 bpo-27350 . 想法 originally suggested by Raymond Hettinger )
PEP 523:向CPython添加帧评估API¶
虽然python提供了广泛的支持来定制代码的执行方式,但有一个地方它没有这样做,那就是对框架对象的评估。如果您想用某种方法来拦截Python中的帧评估,那么在没有直接为定义的函数操作函数指针的情况下,就没有任何方法。
PEP 523 通过提供一个API来改变这一点,使框架评估在C级可插入。这将允许调试程序和JIT等工具在开始执行python代码之前拦截帧评估。这允许对python代码、跟踪帧评估等使用可选的评估实现。
此API不是受限C API的一部分,并标记为私有,以表示此API的使用将受到限制,并且仅适用于非常精选的低级用例。必要时,API的语义将随python的变化而变化。
参见
- PEP 523 --向cpython添加帧评估API
布雷特·坎农和迪诺·维埃兰写的PEP。
pythonmalloc环境变量¶
新的 PYTHONMALLOC
环境变量允许设置python内存分配器和安装调试挂钩。
现在可以在以发布模式编译的python上的python内存分配器上安装调试挂钩,使用 PYTHONMALLOC=debug
.调试挂钩的效果:
新分配的内存中充满了字节
0xCB
释放的内存中充满了字节
0xDB
检测是否违反了python内存分配器API。例如,
PyObject_Free()
在由分配的内存块上调用PyMem_Malloc()
.在缓冲区开始之前检测写入(缓冲区下溢)
在缓冲区结束后检测写入(缓冲区溢出)
检查一下 GIL 当分配器的函数
PYMEM_DOMAIN_OBJ
(EX:PyObject_Malloc()
)PYMEM_DOMAIN_MEM
(EX:PyMem_Malloc()
)调用域。
检查是否持有gil也是Python3.6的一个新特性。
见 PyMem_SetupDebugHooks()
用于调试python内存分配器挂钩的函数。
现在也可以强制使用 malloc()
所有python内存分配的C库的分配器 PYTHONMALLOC=malloc
. 当在以发布模式编译的Python上使用外部内存调试程序(如valgrind)时,这很有用。
出错时,python内存分配器上的调试挂钩现在使用 tracemalloc
模块以获取分配内存块的跟踪。
缓冲区溢出致命错误示例 python3.6 -X tracemalloc=5
(在记录道中存储5帧)::
Debug memory block at address p=0x7fbcd41666f8: API 'o'
4 bytes originally requested
The 7 pad bytes at p-7 are FORBIDDENBYTE, as expected.
The 8 pad bytes at tail=0x7fbcd41666fc are not all FORBIDDENBYTE (0xfb):
at tail+0: 0x02 *** OUCH
at tail+1: 0xfb
at tail+2: 0xfb
at tail+3: 0xfb
at tail+4: 0xfb
at tail+5: 0xfb
at tail+6: 0xfb
at tail+7: 0xfb
The block was made by call #1233329 to debug malloc/realloc.
Data at p: 1a 2b 30 00
Memory block allocated at (most recent call first):
File "test/test_bytes.py", line 323
File "unittest/case.py", line 600
File "unittest/case.py", line 648
File "unittest/suite.py", line 122
File "unittest/suite.py", line 84
Fatal Python error: bad trailing pad byte
Current thread 0x00007fbcdbd32700 (most recent call first):
File "test/test_bytes.py", line 323 in test_hex
File "unittest/case.py", line 600 in run
File "unittest/case.py", line 648 in __call__
File "unittest/suite.py", line 122 in run
File "unittest/suite.py", line 84 in __call__
File "unittest/suite.py", line 122 in run
File "unittest/suite.py", line 84 in __call__
...
DTrace和SystemTap探测支持¶
现在可以构建python了 --with-dtrace
它在解释器中为以下事件启用静态标记:
函数调用/返回
垃圾收集已开始/完成
执行的代码行。
这可用于在生产环境中检测正在运行的解释程序,而无需重新编译特定的调试版本或提供特定于应用程序的分析/调试代码。
更多细节 用DTrace和SystemTap检测CPython .
当前的实现是在Linux和MacOS上测试的。将来可能会添加其他标记。
(由Ukasz Langa在 bpo-21590 基于Jes_s Cea Avi_n、David Malcolm和Nikhil Benesch的补丁。)
其他语言更改¶
对核心python语言所做的一些较小的更改是:
A
global
或nonlocal
语句现在必须在同一作用域中首次使用受影响的名称之前以文本形式出现。以前这是一个SyntaxWarning
.现在可以设置 special method 到
None
以指示相应的操作不可用。例如,如果类集__iter__()
到None
,类不可重复。(由Andrew Barnert和Ivan Levkivskyi在 bpo-25958 )长序列的重复追溯线现在缩写为
"[Previous line repeated {{count}} more times]"
(见 追溯 例如)。(伊曼纽尔·巴里在 bpo-26823 )导入现在引发新的异常
ModuleNotFoundError
(子类)ImportError
)当它找不到模块时。当前检查importError(在try-except中)的代码仍然有效。(埃里克·斯诺在 bpo-15767 )依赖零参数的类方法
super()
在类创建过程中从元类方法调用时,现在可以正常工作。(马丁·泰希曼在 bpo-23722 )
新模块¶
秘密¶
新的主要目的 secrets
模块提供了一种可靠地生成密码强的伪随机值的明显方法,这些值适用于管理机密,如帐户身份验证、令牌和类似的内容。
警告
注意中的伪随机生成器 random
模块应该 NOT 用于安全目的。使用 secrets
在python 3.6+和 os.urandom()
在python 3.5及更早版本上。
参见
- PEP 506 --向标准库添加机密模块
PEP由Steven D'Aprano编写并实施。
改进的模块¶
数组¶
耗尽的迭代器 array.array
即使扩展了迭代数组,也将保持耗尽状态。这与其他可变序列的行为一致。
Serhiy Storchaka在 bpo-26492 .
AST¶
新的 ast.Constant
AST节点已添加。它可以被外部AST优化器用于持续折叠的目的。
维克多·斯廷纳在 bpo-26146 .
asyncio¶
从python 3.6开始 asyncio
模块不再是临时的,其API被认为是稳定的。
中的显著变化 asyncio
自python 3.5.0以来的模块(由于临时状态,所有模块都返回到3.5.x):
这个
get_event_loop()
函数已更改为从协程和回调调用时始终返回当前正在运行的循环。(由Yury Selivanov在 bpo-28613 )这个
ensure_future()
函数和所有使用它的函数,例如loop.run_until_complete()
,现在接受各种 awaitable objects . (由尤里·塞利万诺夫供稿)新的
run_coroutine_threadsafe()
函数将协程从其他线程提交到事件循环。(文森特·米歇尔供稿)新的
Transport.is_closing()
方法检查传输是关闭还是关闭。(由尤里·塞利万诺夫供稿)这个
loop.create_server()
方法现在可以接受主机列表。(Yann Sineau供稿)新的
loop.create_future()
创建未来对象的方法。这允许其他事件循环实现,例如 uvloop ,以提供更快的asyncio.Future
实施。(由Yury Selivanov在 bpo-27041 )新的
loop.get_exception_handler()
方法获取当前异常处理程序。(由Yury Selivanov在 bpo-27040 )新的
StreamReader.readuntil()
方法从流中读取数据,直到出现分隔符字节序列。(马克·科伦伯格贡献)的性能
StreamReader.readexactly()
已经改进了。(由Mark Korenberg于 bpo-28370 )这个
loop.getaddrinfo()
方法被优化以避免调用系统getaddrinfo
如果地址已解析,则函数。(A.Jesse Jiryu Davis撰稿)这个
loop.stop()
方法已更改为在当前迭代之后立即停止循环。由于上次迭代而计划的任何新回调都将被丢弃。(由Guido van Rossum在 bpo-25593 )Future.set_exception
现在将提高TypeError
当传递StopIteration
例外。(Chris Angelico在 bpo-26221 )新的
loop.connect_accepted_socket()
方法,供接受Asyncio之外的连接但使用Asyncio处理这些连接的服务器使用。(吉姆·富尔顿在 bpo-27392 )TCP_NODELAY
现在,默认情况下为所有TCP传输设置标志。(由Yury Selivanov在 bpo-27456 )新的
loop.shutdown_asyncgens()
在关闭循环之前正确关闭挂起的异步生成器。(由Yury Selivanov在 bpo-28003 )Future
和Task
类现在有了一个优化的C实现,使异步代码的速度提高了30%。(由Yury Selivanov和Inada Naoki在 bpo-26081 和 bpo-28544 )
binascii¶
这个 b2a_base64()
函数现在接受一个可选的 newline 关键字参数,用于控制换行符是否附加到返回值。(由Victor Stinner在 bpo-25357 )
cmath¶
新的 cmath.tau
( τ )已添加常量。(莉萨·罗奇在 bpo-12345 见 PEP 628 详情。
新常量: cmath.inf
和 cmath.nan
相配 math.inf
和 math.nan
,而且 cmath.infj
和 cmath.nanj
以匹配复杂repr使用的格式。(马克·狄金森在 bpo-23229 )
收藏¶
新的 Collection
已添加抽象基类以表示大小不可重的容器类。(Ivan Levkivskyi提供,Neil Girdhar在 bpo-27598 )
新的 Reversible
抽象基类表示还提供 __reversed__()
方法。(Ivan Levkivskyi在 bpo-25987 )
新的 AsyncGenerator
抽象基类表示异步生成器。(由Yury Selivanov在 bpo-28720 )
这个 namedtuple()
函数现在接受可选关键字参数 模块 ,当指定时,用于 __module__
返回的命名元组类的属性。(由Raymond Hettinger在 bpo-17941 )
这个 verbose 和 重命名 参数的理由 namedtuple()
现在只显示关键字。(由Raymond Hettinger在 bpo-25628 )
递归 collections.deque
现在可以酸洗实例。(Serhiy Storchaka在 bpo-26482 )
concurrent.futures¶
这个 ThreadPoolExecutor
类构造函数现在接受一个可选的 thread_name_prefix 参数,以便自定义由池创建的线程的名称。(格雷戈里·史密斯在 bpo-27664 )
contextlib¶
The contextlib.AbstractContextManager
class has been added to
provide an abstract base class for context managers. It provides a
sensible default implementation for __enter__() which returns
self
and leaves __exit__() an abstract method. A matching
class has been added to the typing
module as
typing.ContextManager
.
(Contributed by Brett Cannon in bpo-25609.)
日期时间¶
这个 datetime
和 time
类有新的 fold
属性,用于在必要时消除本地时间的歧义。中的许多功能 datetime
已更新以支持本地时间消除歧义。参见 Local Time Disambiguation 有关详细信息,请参阅。(亚历山大·伯罗波尔斯基于年 bpo-24773 )
这个 datetime.strftime()
和 date.strftime()
方法现在支持ISO 8601日期指令 %G
, %u
和 %V
. (阿什利·安德森在 bpo-12006 )
这个 datetime.isoformat()
函数现在接受一个可选的 TimeSime 参数,指定要包含的时间值的其他组件的数量。(由亚历山德罗·库奇和亚历山大·伯罗波尔斯基于 bpo-19475 )
这个 datetime.combine()
现在接受一个可选的 茨芬格 参数。(亚历山大·伯罗波尔斯基于年 bpo-27661 )
十进制的¶
新的 Decimal.as_integer_ratio()
返回对的方法 (n, d)
表示给定的 Decimal
以分数、最低值和正分母表示的实例:
>>> Decimal('-3.14').as_integer_ratio()
(-157, 50)
(由Stefan Krah和Mark Dickinson在 bpo-25928 )
distutils¶
这个 default_format
属性已从中删除 distutils.command.sdist.sdist
以及 formats
属性默认为 ['gztar']
. 尽管没有预料到,任何依赖于 default_format
可能需要调整。参见 bpo-27819 了解更多详细信息。
电子邮件¶
新的电子邮件API,通过 policy 关键字到各个构造函数,不再是临时的。这个 email
文档已经重新组织和重写,以关注新的API,同时保留旧的API文档。(R.David Murray在 bpo-24277 )
这个 email.mime
现在所有的类都接受一个可选的 policy 关键字。(由Berker Peksag在 bpo-27331 )
这个 DecodedGenerator
现在支持 policy 关键字。
有一种新的 policy
属性, message_factory
它控制解析器创建新消息对象时默认使用的类。对于 email.policy.compat32
这是政策 Message
对于新政策来说 EmailMessage
. (R.David Murray在 bpo-20476 )
编码¶
在Windows上,添加了 'oem'
使用编码 CP_OEMCP
和 'ansi'
现有的别名 'mbcs'
编码,使用 CP_ACP
代码页。(史蒂夫·道尔在 bpo-27959 )
枚举¶
已将两个新的枚举基类添加到 enum
模块: Flag
和 IntFlags
. 两者都用于定义可以使用位运算符组合的常量。(伊桑·弗曼在 bpo-23591 )
许多标准库模块已更新为使用 IntFlags
为其常量初始化。
新的 enum.auto
值可用于自动为枚举成员分配值::
>>> from enum import Enum, auto
>>> class Color(Enum):
... red = auto()
... blue = auto()
... green = auto()
...
>>> list(Color)
[<Color.red: 1>, <Color.blue: 2>, <Color.green: 3>]
faulthandler¶
在Windows上 faulthandler
模块现在安装Windows异常处理程序:请参见 faulthandler.enable()
. (由Victor Stinner在 bpo-23848 )
文件输入¶
hook_encoded()
现在支持 errors 参数。(约瑟夫·哈克曼在 bpo-25788 )
hashlib¶
hashlib
支持OpenSSL 1.1.0。最低推荐版本为1.0.2。(由Christian Heimes在 bpo-26470 )
blake2散列函数已添加到模块中。 blake2b()
和 blake2s()
始终可用并支持Blake2的完整功能集。(由Christian Heimes在 bpo-26798 基于Dmitry Chestnykh和Samuel Neves的代码。文件由Dmitry Chestnykh编写。)
sha-3散列函数 sha3_224()
, sha3_256()
, sha3_384()
, sha3_512()
,并震动hash函数 shake_128()
和 shake_256()
加入。(由Christian Heimes在 bpo-16113 . 由Guido Bertoni、Joan Daemen、Micha_l Peeters、Gilles van Assche和Ronny van Keer编写的Keccak代码包。)
基于密码的密钥派生函数 scrypt()
现在可用于OpenSS1.1.0及更高版本。(由Christian Heimes在 bpo-27928 )
http.client¶
HTTPConnection.request()
和 endheaders()
现在两者都支持分块编码请求体。(德米安·布莱希特和罗尔夫·克莱尔在 bpo-12319 )
idlelib和idle¶
idlelib包正在进行现代化和重构,以使idle看起来和工作得更好,并使代码更易于理解、测试和改进。让空闲看起来更好的一部分,特别是在Linux和Mac上,是使用TTK小部件,主要是在对话框中。因此,IDLE不再使用TCL/TK 8.4运行。现在需要tcl/tk 8.5或8.6。我们建议运行其中一个的最新版本。
“现代化”包括重命名和合并idlelib模块。用部分大写名称重命名文件类似于将3.0中的tkinter和tkfont重命名为tkinter和tkinter.font。因此,在3.5中工作的idlelib文件的导入通常在3.6中不工作。至少需要对模块名进行更改(请参阅idlelib/readme.txt),有时甚至更多。(Al Swiegart和Terry Reedy在 bpo-24225 . 自那以后,大多数idlelib补丁已经并且将成为进程的一部分。)
在补偿中,最终的结果是,一些idlelib类将更容易使用,并有更好的API和docstring来解释它们。其他有用信息将添加到idlelib(如果可用)。
3.3.2新
自动完成的多个修复程序。(由路易路在 bpo-15786 )
3.3.3新
模块浏览器(在文件菜单上,以前称为类浏览器),现在除了顶级函数和类之外,还显示嵌套函数和类。(由Guilherme Polo、Cheryl Sabella和Terry Jan Reedy在 bpo-1612262 )
以前作为扩展实现的空闲特性已经作为普通特性重新实现。它们的设置已从扩展选项卡移到其他对话框选项卡。(由Charles Wohlganger和Terry Jan Reedy在 bpo-27099 )
设置对话框(选项、配置空闲)已部分重写,以改善外观和功能。(Cheryl Sabella和Terry Jan Reedy在多个问题上作了贡献。)
3.3.4新版本:
字体示例现在包括非拉丁字符的选择,这样用户可以更好地看到选择特定字体的效果。(由Terry Jan Reedy在 bpo-13802 .)可以编辑样本以包含其他字符。(Serhiy Storchaka在 bpo-31860 )
3.3.6:
编辑代码上下文选项已修订。框显示所有上下文行,最多可显示最大行。单击上下文行会将编辑器跳到该行。自定义主题的上下文颜色将添加到“设置”对话框的“突出显示”选项卡中。(由Cheryl Sabella和Terry Jan Reedy在 bpo-33642 , bpo-33768 和 bpo-33679 )
在Windows上,一个新的API调用告诉Windows tk为dpi缩放。在Windows8.1+或10上,python二进制文件的dpi兼容性属性保持不变,并且监视器分辨率大于96dpi,这将使文本和行更清晰。否则应该没有效果。(由Terry Jan Reedy在 bpo-33656 )
3.3.7:
N行上的输出(默认为50)被压缩为一个按钮。n可以在设置对话框的常规页面的pyshell部分更改。用鼠标右键单击输出可以压缩的行更少,但也可能更长。通过双击按钮或右键单击按钮进入剪贴板或单独的窗口,可以就地扩展压缩输出。(由Tal Einat在 bpo-1529353 )
importlib¶
导入现在引发新的异常 ModuleNotFoundError
(子类) ImportError
)当它找不到模块时。当前检查的代码 ImportError
(试用版除外)仍然有效。(埃里克·斯诺在 bpo-15767 )
importlib.util.LazyLoader
现在调用 create_module()
在打封加载器上,移除 importlib.machinery.BuiltinImporter
和 importlib.machinery.ExtensionFileLoader
无法与一起使用 importlib.util.LazyLoader
.
importlib.util.cache_from_source()
, importlib.util.source_from_cache()
和 importlib.util.spec_from_file_location()
现在接受 path-like object .
检查¶
这个 inspect.signature()
函数现在报告隐式 .0
编译器为理解和生成器表达式作用域生成的参数,就好像它们是只调用位置参数一样 implicit0
. (由Jelle Zijlstra在 bpo-19611 )
在从python 2.7和旧版本升级时减少代码流失 inspect.getargspec()
API,先前记录的 inspect.getfullargspec()
已被撤消。虽然此函数对于单个/源代码的python 2/3代码基很方便,但是 inspect.signature()
接口仍然是新代码的推荐方法。(由Nick Coghlan在 bpo-27172 )
json¶
json.load()
和 json.loads()
现在支持二进制输入。编码的JSON应该使用utf-8、utf-16或utf-32表示。(Serhiy Storchaka在 bpo-17909 )
登录¶
新的 WatchedFileHandler.reopenIfNeeded()
已添加方法以添加检查是否需要重新打开日志文件的功能。(由Marian Horban在 bpo-24884 )
数学¶
Tau(Tau) τ )常量已添加到 math
和 cmath
模块。(莉萨·罗奇在 bpo-12345 见 PEP 628 详情。
多重处理¶
Proxy Objects 返回的 multiprocessing.Manager()
现在可以嵌套。(由David Potts在 bpo-6766 )
操作系统¶
参见 PEP 519 有关如何 os
和 os.path
模块现在支持 path-like objects .
scandir()
现在支持 bytes
Windows上的路径。
一个新的 close()
方法允许显式关闭 scandir()
迭代器。这个 scandir()
迭代器现在支持 context manager 协议。如果A scandir()
迭代器既没有耗尽也没有显式关闭 ResourceWarning
将在其析构函数中发出。(Serhiy Storchaka在 bpo-25994 )
在Linux上, os.urandom()
现在阻塞,直到系统urandom熵池初始化以提高安全性。见 PEP 524 理由是。
Linux getrandom()
系统调用(获取随机字节)现在作为新的 os.getrandom()
功能。(由Victor Stinner提供,属于 PEP 524 )
pathlib¶
pathlib
现在支持 path-like objects .(布雷特·坎农在 bpo-27186 )
参见 PEP 519 有关详细信息。
pdb¶
这个 Pdb
类构造函数有一个新的可选 读写器 控制是否 .pdbrc
应该读取文件。
pickle¶
需要的对象 __new__
现在可以使用pickle使用关键字参数调用 pickle protocols 早于协议版本4。协议版本4已经支持这种情况。(Serhiy Storchaka在 bpo-24164 )
pickletools¶
pickletools.dis()
现在输出 MEMOIZE
操作码。(Serhiy Storchaka在 bpo-25382 )
pydoc¶
这个 pydoc
模块已经学会尊重 MANPAGER
环境变量。(由Matthias Klose在 bpo-8637 )
help()
和 pydoc
现在可以按定义的顺序而不是按字母顺序列出命名的元组字段。(由Raymond Hettinger在 bpo-24879 )
随机的¶
新的 choices()
函数返回具有可选权重的给定总体中指定大小的元素的列表。(由Raymond Hettinger在 bpo-18844 )
重新¶
在正则表达式中添加了对修饰符跨度的支持。实例: '(?i:p)ython'
比赛 'python'
和 'Python'
,但不是 'PYTHON'
; '(?i)g(?-i:v)r'
比赛 'GvR'
和 'gvr'
,但不是 'GVR'
. (Serhiy Storchaka在 bpo-433028 )
匹配对象组可以通过 __getitem__
,相当于 group()
. 所以 mo['name']
现在等于 mo.group('name')
. (埃里克·史密斯在 bpo-24454 )
Match
对象现在支持 index-like objects
作为组索引。(由杰伦·德迈尔和张翔于 bpo-27177 )
readline¶
补充 set_auto_history()
启用或禁用自动向历史记录列表添加输入。(由Tyler Crompton在 bpo-26870 )
RLeNever¶
除非前缀以下划线开头,否则现在将省略私有和特殊属性名。在一些完成的关键字后添加空格或冒号。(Serhiy Storchaka在 bpo-25011 和 bpo-25209 )
施莱克斯¶
这个 shlex
有很多 improved shell compatibility 通过新的 punctuation_chars 控制哪些字符被视为标点符号的参数。(由Vinay Sajip在 bpo-1521950 )
网站¶
指定要添加到的路径时 sys.path
在一个 .pth 文件,现在可以在目录顶部指定文件路径(例如zip文件)。(由Wolfgang Langner在 bpo-26587 )
sqlite3¶
sqlite3.Cursor.lastrowid
现在支持 REPLACE
语句。(亚历克斯·洛德索森在 bpo-16864 )
Socket¶
这个 ioctl()
函数现在支持 SIO_LOOPBACK_FAST_PATH
控制代码。(丹尼尔·斯托克斯在 bpo-26536 )
这个 getsockopt()
常量 SO_DOMAIN
, SO_PROTOCOL
, SO_PEERSEC
和 SO_PASSSEC
现在支持。(由Christian Heimes在 bpo-26907 )
这个 setsockopt()
现在支持 setsockopt(level, optname, None, optlen: int)
形式。(由Christian Heimes在 bpo-27744 )
套接字模块现在支持地址系列 AF_ALG
与Linux内核加密API接口。 ALG_*
, SOL_ALG
和 sendmsg_afalg()
加入。(由Christian Heimes在 bpo-27744 在维克多·斯廷纳的支持下。)
新的Linux常量 TCP_USER_TIMEOUT
和 TCP_CONGESTION
加入。(由奥马尔·桑多瓦尔撰稿,发行号:26273)。
socketserver¶
基于的服务器 socketserver
模块,包括 http.server
, xmlrpc.server
和 wsgiref.simple_server
,现在支持 context manager 协议。(由Aviv Palivoda在 bpo-26404 )
这个 wfile
属性 StreamRequestHandler
类现在实现 io.BufferedIOBase
可写接口。尤其是调用 write()
现在保证全部发送数据。(马丁·潘特在 bpo-26721 )
ssl¶
ssl
支持OpenSSL 1.1.0。最低推荐版本为1.0.2。(由Christian Heimes在 bpo-26470 )
已从默认密码套件中删除3DES,并添加了chacha20 poly1305密码套件。(由Christian Heimes在 bpo-27850 和 bpo-27766 )
SSLContext
有更好的选项和密码的默认配置。(由Christian Heimes在 bpo-28043 )
可以使用新的 SSLSession
类。TLS会话恢复可以加速初始握手,减少延迟并提高性能(由Christian Heimes在 bpo-19500 根据Alex Warhawk的草稿。)
新的 get_ciphers()
方法可用于按密码优先级顺序获取已启用密码的列表。
所有常量和标志都已转换为 IntEnum
和 IntFlags
. (由Christian Heimes在 bpo-28025 )
服务器和客户端特定的TLS协议 SSLContext
加入。(由Christian Heimes在 bpo-28085 )
统计学¶
一个新的 harmonic_mean()
已添加函数。(由Steven D'Aprano在 bpo-27181 )
结构¶
struct
现在通过 'e'
格式说明符。(由Eli Stevens、Mark Dickinson在 bpo-11734 )
子过程¶
subprocess.Popen
析构函数现在发出 ResourceWarning
如果子进程仍在运行,则发出警告。使用上下文管理器协议 (with proc: ...
)或者直接调用 wait()
方法读取子进程的退出状态。(由Victor Stinner在 bpo-26741 )
这个 subprocess.Popen
构造函数和所有传递参数给它的函数现在接受 encoding 和 errors 参数。指定其中一个将启用 stdin, stdout 和 stderr 溪流。(史蒂夫·道尔在 bpo-6135 )
sys¶
新的 getfilesystemencodeerrors()
函数返回用于在Unicode文件名和字节文件名之间转换的错误模式的名称。(史蒂夫·道尔在 bpo-27781 )
在Windows上 getwindowsversion()
功能现在包括 platform_version 包含当前操作系统的准确主版本、次版本和内部版本号的字段,而不是为进程模拟的版本(由Steve Dower在 bpo-27932 )
远程网络接口¶
时间¶
这个 struct_time
属性 tm_gmtoff
和 tm_zone
现在可在所有平台上使用。
timeit¶
新的 Timer.autorange()
已将便利方法添加到调用中 Timer.timeit()
重复,使总运行时间大于或等于200毫秒。(由Steven D'Aprano在 bpo-6422 )
timeit
现在,当最佳和最差时间之间存在实质性(4倍)差异时发出警告。(Serhiy Storchaka在 bpo-23552 )
tkinter¶
添加方法 trace_add()
, trace_remove()
和 trace_info()
在 tkinter.Variable
类。它们取代了旧方法 trace_variable()
, trace()
, trace_vdelete()
和 trace_vinfo()
它使用过时的tcl命令,在未来的tcl版本中可能不起作用。(Serhiy Storchaka在 bpo-22115 )
追溯¶
回溯模块和解释器的内置异常显示现在都缩写了回溯中重复行的长序列,如下例所示:
>>> def f(): f()
...
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
[Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded
(伊曼纽尔·巴里在 bpo-26823 )
tracemalloc¶
这个 tracemalloc
模块现在支持在多个不同的地址空间中跟踪内存分配。
新的 DomainFilter
已按地址空间(域)将筛选器类添加到筛选器块跟踪中。
(由Victor Stinner在 bpo-26588 )
打字¶
自从 typing
模块是 provisional ,python 3.6中引入的所有更改也都已返回到python 3.5.x。
这个 typing
模块对泛型类型别名的支持有了很大的改进。例如 Dict[str, Tuple[S, T]]
现在是有效的类型批注。(由Guido van Rossum在 Github #195 )
这个 typing.ContextManager
已添加类以表示 contextlib.AbstractContextManager
.(布雷特·坎农在 bpo-25609 )
这个 typing.Collection
已添加类以表示 collections.abc.Collection
. (Ivan Levkivskyi在 bpo-27598 )
这个 typing.ClassVar
类型构造已添加到标记类变量。如中所述 PEP 526 ,用classvar封装的变量注释表示给定属性将用作类变量,不应在该类的实例上设置。(Ivan Levkivskyi在 Github #280 )
一个新的 TYPE_CHECKING
假设为常数 True
通过静态类型检查程序,但是 False
在运行时。(由Guido van Rossum在 Github #230 )
一个新的 NewType()
已添加helper函数以创建注释的轻量级不同类型:
from typing import NewType
UserId = NewType('UserId', int)
some_id = UserId(524313)
静态类型检查器会将新类型视为原始类型的子类。(Ivan Levkivskyi在 Github #189 )
unicodedata¶
这个 unicodedata
模块现在使用来自 Unicode 9.0.0 . (本杰明·彼得森供稿)
unittest.mock¶
这个 Mock
类有以下改进:
两种新方法,
Mock.assert_called()
和Mock.assert_called_once()
检查是否调用了模拟对象。(Amit Saha在 bpo-26323 )这个
Mock.reset_mock()
方法现在有两个可选的仅关键字参数: return_value 和 side_effect . (由Kushal Das在 bpo-21271 )
urllib.request¶
如果一个HTTP请求有一个文件或ITerable主体(字节对象除外),但没有 Content-Length
头,而不是抛出错误, AbstractHTTPHandler
现在返回使用分块传输编码。(德米安·布莱希特和罗尔夫·克莱尔在 bpo-12319 )
urllib.robotparser¶
RobotFileParser
现在支持 Crawl-delay
和 Request-rate
扩展。(由Nikolay Bogoychev在 bpo-16099 )
venv¶
venv
接受新参数 --prompt
. 此参数为虚拟环境提供了一个可选的前缀。(由_Ukasz Balcerzak提出,由St_phane Wirtel于年移植至3.6) bpo-22829 )
警告¶
新选项 source 参数已添加到 warnings.warn_explicit()
功能:发出 ResourceWarning
. 一 source 属性也已添加到 warnings.WarningMessage
(由Victor Stinner在 bpo-26568 和 bpo-26567 )
当A ResourceWarning
警告被记录, tracemalloc
模块现在用于尝试检索已销毁对象分配到的回溯。
脚本示例 example.py
::
import warnings
def func():
return open(__file__)
f = func()
f = None
命令的输出 python3.6 -Wd -X tracemalloc=5 example.py
::
example.py:7: ResourceWarning: unclosed file <_io.TextIOWrapper name='example.py' mode='r' encoding='UTF-8'>
f = None
Object allocated at (most recent call first):
File "example.py", lineno 4
return open(__file__)
File "example.py", lineno 6
f = func()
“对象分配位置”回溯是新的,仅当 tracemalloc
正在跟踪python内存分配,如果 warnings
模块已导入。
温雷格¶
winsound¶
允许将关键字参数传递给 Beep
, MessageBeep
和 PlaySound
(bpo-27982 )
xmlrpc.client¶
这个 xmlrpc.client
模块现在支持将ApacheXML-RPC实现用于数字和 None
. (Serhiy Storchaka在 bpo-26885 )
压缩文件¶
一个新的 ZipInfo.from_file()
类方法允许 ZipInfo
文件系统文件中的实例。一个新的 ZipInfo.is_dir()
方法可用于检查 ZipInfo
实例表示一个目录。(托马斯·克鲁弗在 bpo-26039 )
这个 ZipFile.open()
方法现在可以用于将数据写入zip文件,也可以用于提取数据。(托马斯·克鲁弗在 bpo-26039 )
zlib¶
这个 compress()
和 decompress()
函数现在接受关键字参数。(由Aviv Palivoda在 bpo-26243 和张翔在一起 bpo-16764 分别)。
优化¶
python解释器现在使用16位的字代码而不是字节码,这使得许多操作码优化成为可能。(由提出异议的Serhiy Storchaka和Victor Stinner在 bpo-26647 和 bpo-28050 )
这个
asyncio.Future
类现在有一个优化的C实现。(由Yury Selivanov和Inada Naoki在 bpo-26081 )这个
asyncio.Task
类现在有一个优化的C实现。(由Yury Selivanov在 bpo-28544 )在
typing
模块(如通用类型的缓存)可实现高达30倍的性能改进和减少内存占用。对于错误处理程序来说,ASCII解码器的速度现在高达60倍。
surrogateescape
,ignore
和replace
(由Victor Stinner在 bpo-24870 )对于错误处理程序来说,ASCII和Latin1编码器的速度现在高达3倍。
surrogateescape
(由Victor Stinner在 bpo-25227 )对于错误处理程序来说,UTF-8编码器现在的速度是75倍。
ignore
,replace
,surrogateescape
,surrogatepass
(由Victor Stinner在 bpo-25267 )对于错误处理程序来说,UTF-8解码器现在的速度是15倍
ignore
,replace
和surrogateescape
(由Victor Stinner在 bpo-25301 )bytes % args
现在快了2倍。(由Victor Stinner在 bpo-25349 )bytearray % args
现在快了2.5到5倍。(由Victor Stinner在 bpo-25399 )优化
bytes.fromhex()
和bytearray.fromhex()
:现在速度在2到3.5倍之间。(由Victor Stinner在 bpo-25401 )优化
bytes.replace(b'', b'.')
和bytearray.replace(b'', b'.')
:快80%。(乔希·斯奈德在 bpo-26574 )的分配器函数
PyMem_Malloc()
域 (PYMEM_DOMAIN_MEM
)现在使用 pymalloc memory allocator 而不是malloc()
C库的功能。pymalloc分配器针对小于或等于512字节、寿命短的对象进行了优化,并使用malloc()
对于更大的内存块。(由Victor Stinner在 bpo-26249 )pickle.load()
和pickle.loads()
现在反序列化许多小对象(由Victor Stinner在 bpo-27056 )经过 keyword arguments 与传递相比,函数具有开销 positional arguments . 现在,在使用Argument Clinic实现的扩展函数中,这一开销显著减少。(Serhiy Storchaka在 bpo-27574 )
优化
glob()
和iglob()
中的函数glob
模块;它们现在大约快3-6倍。(Serhiy Storchaka在 bpo-25596 )优化的球化
pathlib
通过使用os.scandir()
,现在大约快了1.5-4倍。(Serhiy Storchaka在 bpo-26032 )xml.etree.ElementTree
解析、迭代和deepcopy性能显著提高。(Serhiy Storchaka在 bpo-25638 , bpo-25873 和 bpo-25869 )创造
fractions.Fraction
浮点和小数的实例现在快了2到3倍。(Serhiy Storchaka在 bpo-25971 )
构建和C API更改¶
Python现在需要在工具链中提供一些C99支持来构建。最值得注意的是,python现在使用标准的整数类型和宏来代替诸如
PY_LONG_LONG
. 有关详细信息,请参阅 PEP 7 和 bpo-17884 .通过将Android NDK和Android API级别设置为21(Android 5.0棒棒糖)或更高版本,交叉编译cpython成功运行。虽然android还不是一个受支持的平台,但python测试套件在android模拟器上运行,只有大约16次测试失败。查看Android元问题 bpo-26865 .
这个
--enable-optimizations
已添加配置标志。打开它将激活昂贵的优化,如pgo。(Intel的Alecsandru Patrascu在 bpo-26359 )这个 GIL 当分配器的函数
PYMEM_DOMAIN_OBJ
(EX:PyObject_Malloc()
)PYMEM_DOMAIN_MEM
(EX:PyMem_Malloc()
)调用域。新的
Py_FinalizeEx()
指示刷新缓冲数据是否失败的API。(马丁·潘特在 bpo-5319 )PyArg_ParseTupleAndKeywords()
现在支持 positional-only parameters .仅位置参数由空名称定义。(Serhiy Storchaka在 bpo-26282 )PyTraceback_Print
方法现在将长的重复行序列缩写为"[Previous line repeated {{count}} more times]"
. (伊曼纽尔·巴里在 bpo-26823 )新的
PyErr_SetImportErrorSubclass()
函数允许指定ImportError
提高。(埃里克·斯诺在 bpo-15767 )新的
PyErr_ResourceWarning()
函数可用于生成ResourceWarning
提供资源分配的来源。(由Victor Stinner在 bpo-26567 )新的
PyOS_FSPath()
函数返回 path-like object .(布雷特·坎农在 bpo-27186 )这个
PyUnicode_FSConverter()
和PyUnicode_FSDecoder()
功能现在接受 path-like objects .
其他改进¶
什么时候?
--version
(简称:-V
)提供两次,python printssys.version
有关详细信息。$ ./python -VV Python 3.6.0b4+ (3.6:223967b49e49+, Nov 21 2016, 20:55:04) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]
已弃用¶
新关键词¶
async
和 await
不建议用作变量、类、函数或模块名称。介绍通过 PEP 492 在python 3.5中,它们将成为python 3.7中合适的关键字。从python 3.6开始,使用 async
或 await
因为名称将生成 DeprecationWarning
.
已弃用的python行为¶
提高 StopIteration
生成器内部的异常现在将生成 DeprecationWarning
,并将触发 RuntimeError
在python 3.7中。参见 PEP 479:更改生成器内的停止迭代处理 有关详细信息。
这个 __aiter__()
方法现在应该直接返回异步迭代器,而不是像以前那样返回可等待的。做前者会触发 DeprecationWarning
. 向后兼容性将在python 3.7中删除。(由Yury Selivanov在 bpo-27243 )
不是有效转义序列的反斜杠字符对现在生成一个 DeprecationWarning
. 虽然这最终会成为 SyntaxError
,这将不适用于几个Python版本。(伊曼纽尔·巴里在 bpo-27364 )
执行相对导入时,返回 __name__
和 __path__
从调用模块 __spec__
或 __package__
现在未定义引发 ImportWarning
. (由Rose Ames在 bpo-25791 )
不推荐使用的python模块、函数和方法¶
异步聊天¶
异步内核¶
数据库管理¶
不像其他 dbm
实施, dbm.dumb
模块使用创建数据库 'rw'
模式,并允许修改用 'r'
模式。此行为现在已弃用,将在3.8中删除。(Serhiy Storchaka在 bpo-21708 )
distutils¶
无证件者 extra_path
参数 Distribution
构造函数现在被视为已弃用,如果设置,将引发警告。对这个参数的支持将在将来的Python版本中被删除。见 bpo-27919 有关详细信息。
grp¶
支持中的非整数参数 getgrgid()
已弃用。(Serhiy Storchaka在 bpo-26129 )
importlib¶
这个 importlib.machinery.SourceFileLoader.load_module()
和 importlib.machinery.SourcelessFileLoader.load_module()
方法现在已弃用。它们是 importlib.abc.Loader.load_module()
在里面 importlib
在以前的Python版本中,这一点没有被否决,取而代之的是 importlib.abc.Loader.exec_module()
.
这个 importlib.machinery.WindowsRegistryFinder
类现在已弃用。从3.6.0开始,它仍然添加到 sys.meta_path
默认情况下(在Windows上),但在将来的版本中可能会改变。
操作系统¶
无文件证明的将军支持 bytes-like objects 作为路径 os
功能, compile()
类似的函数现在被否决了。(Serhiy Storchaka在 bpo-25791 和 bpo-26754 )
重新¶
支持内联标志 (?letters)
在正则表达式的中间部分已被弃用,并将在将来的Python版本中删除。正则表达式开头的标志仍然是允许的。(Serhiy Storchaka在 bpo-22493 )
ssl¶
openssl 0.9.8、1.0.0和1.0.1已被弃用,不再受支持。在未来 ssl
模块至少需要openssl 1.0.2或1.1.0。
与SSL相关的参数,如 certfile
, keyfile
和 check_hostname
在里面 ftplib
, http.client
, imaplib
, poplib
和 smtplib
已弃用,赞成 context
. (由Christian Heimes在 bpo-28022 )
一些协议和函数 ssl
模块现在已弃用。某些功能在将来的OpenSSL版本中将不再可用。其他功能不推荐使用其他API。(由Christian Heimes在 bpo-28022 和 bpo-26470 )
tkinter¶
这个 tkinter.tix
模块现在已弃用。 tkinter
用户应该使用 tkinter.ttk
相反。
venv¶
这个 pyvenv
脚本已被弃用,取而代之的是 python3 -m venv
. 这可以防止混淆什么是python解释器 pyvenv
连接到,因此虚拟环境将使用什么样的python解释器。(布雷特·坎农在 bpo-25154 )
C API的函数和类型已弃用¶
未记录的函数 PyUnicode_AsEncodedObject()
, PyUnicode_AsDecodedObject()
, PyUnicode_AsEncodedUnicode()
和 PyUnicode_AsDecodedUnicode()
现已弃用。使用 generic codec based API 相反。
不推荐使用的生成选项¶
这个 --with-system-ffi
默认情况下,非MacOS UNIX平台上的配置标志现在处于打开状态。可通过使用禁用 --without-system-ffi
,但不推荐使用该标志,在Python3.7中不会接受该标志。MacOS不受这一变化的影响。请注意,许多OS发行商已经使用 --with-system-ffi
在构建其系统python时标记。
弃用¶
API和功能删除¶
未知的转义符包括
'\'
正则表达式中的ASCII字母现在将导致错误。在替换模板中re.sub()
它们仍然是允许的,但已弃用。这个re.LOCALE
标志现在只能用于二进制模式。inspect.getmoduleinfo()
已删除(自CPython 3.3以来已弃用)。inspect.getmodulename()
应用于获取给定路径的模块名。(由Yury Selivanov在 bpo-13248 )traceback.Ignore
类和traceback.usage
,traceback.modname
,traceback.fullmodname
,traceback.find_lines_from_code
,traceback.find_lines
,traceback.find_strings
,traceback.find_executable_lines
方法已从traceback
模块。由于python 3.2和私有方法中提供的等效功能,因此这些方法被弃用了。这个
tk_menuBar()
和tk_bindForTraversal()
中的虚拟方法tkinter
小部件类被删除(相应的tk命令自tk 4.0以来已过时)。这个
open()
方法zipfile.ZipFile
类不再支持'U'
模式(自python 3.4以来已弃用)。使用io.TextIOWrapper
用于读取压缩文本文件 universal newlines 模式。无证件者
IN
,CDROM
,DLFCN
,TYPES
,CDIO
和STROPTS
模块已被移除。它们在特定平台中可用Lib/plat-*/
目录,但长期过时,跨平台不一致可用,未维护。创建这些模块的脚本在源分发中仍然可用,位于 Tools/scripts/h2py.py .被蔑视的
asynchat.fifo
类已被删除。
移植到python 3.6¶
本节列出了前面描述的更改和可能需要更改代码的其他错误修复。
“python”命令行为的更改¶
使用定义的
COUNT_ALLOCS
,SHOW_ALLOC_COUNT
或SHOW_TRACK_COUNT
默认情况下,宏现在处于关闭状态。可以使用-X showalloccount
选择权。它现在输出到stderr
而不是stdout
. (Serhiy Storchaka在 bpo-23034 )
python api中的更改¶
open()
将不再允许组合'U'
模式标志'+'
. (由Jeff Balogh和John O'Connor在 bpo-2091 )sqlite3
在DDL语句之前不再隐式提交打开的事务。在Linux上,
os.urandom()
现在阻塞,直到系统urandom熵池初始化以提高安全性。什么时候?
importlib.abc.Loader.exec_module()
定义,importlib.abc.Loader.create_module()
还必须定义。PyErr_SetImportError()
现在集TypeError
当其 msg 参数未设置。以前只NULL
回来了。的格式
co_lnotab
代码对象的属性已更改为支持负数的行号增量。默认情况下,python不会发出带有负数delta的字节码。使用函数frame.f_lineno
,PyFrame_GetLineNumber()
或PyCode_Addr2Line()
不受影响。函数直接解码co_lnotab
应该更新为对行号增量使用带符号的8位整数类型,但这只是支持使用负数行号增量的应用程序所必需的。见Objects/lnotab_notes.txt
对于co_lnotab
格式和如何解码,并查看 PEP 511 理由是。中的函数
compileall
模块现在返回布尔值而不是1
或0
分别代表成功或失败。由于booleans是整数的子类,因此只有在对1
或0
. 见 bpo-25768 .阅读
port
属性urllib.parse.urlsplit()
和urlparse()
结果现在提高了ValueError
对于超出范围的值,而不是返回None
. 见 bpo-20059 .这个
imp
模块现在引发DeprecationWarning
而不是PendingDeprecationWarning
.以下模块缺少添加到其
__all__
与文档化API匹配的属性:calendar
,cgi
,csv
,ElementTree
,enum
,fileinput
,ftplib
,logging
,mailbox
,mimetypes
,optparse
,plistlib
,smtpd
,subprocess
,tarfile
,threading
和wave
. 这意味着当import *
使用。(由Joel Taddei和Jacek Ko_Odziej在 bpo-23883 )执行相对导入时,如果
__package__
不比较等于__spec__.parent
然后ImportWarning
提高了。(布雷特·坎农在 bpo-25791 )当执行相对导入且不知道父包时,则
ImportError
将被引发。以前,SystemError
可以被引发。(布雷特·坎农在 bpo-18018 )基于的服务器
socketserver
模块,包括http.server
,xmlrpc.server
和wsgiref.simple_server
,现在只捕获派生自Exception
. 因此,如果请求处理程序引发异常SystemExit
或KeyboardInterrupt
,handle_error()
不再调用,异常将停止单线程服务器。(马丁·潘特在 bpo-23430 )spwd.getspnam()
现在提出一个PermissionError
而不是KeyError
如果用户没有权限。这个
socket.socket.close()
如果出现错误(例如EBADF
)由基础系统调用报告。(马丁·潘特在 bpo-26685 )这个 decode_data 的参数
smtpd.SMTPChannel
和smtpd.SMTPServer
构造函数现在是False
默认情况下。这意味着这个参数传递给process_message()
现在默认为bytes对象,并且process_message()
将传递关键字参数。已根据3.5生成的DeprecationWarning更新的代码将不受影响。的所有可选参数
dump()
,dumps()
,load()
和loads()
功能和JSONEncoder
和JSONDecoder
中的类构造函数json
模块现在 keyword-only . (Serhiy Storchaka在 bpo-18726 )亚类
type
这不会覆盖type.__new__
不能再使用一个参数窗体获取对象的类型。作为一部分 PEP 487 ,传递给的关键字参数的处理
type
(元类提示除外,metaclass
)现在一直授权给object.__init_subclass__()
. 这意味着type.__new__()
和type.__init__()
现在两者都接受任意关键字参数,但是object.__init_subclass__()
(从type.__new__()
)默认情况下将拒绝它们。接受其他关键字参数的自定义元类需要将其调用调整为type.__new__()
(无论是直接还是通过super
)因此。在
distutils.command.sdist.sdist
, thedefault_format
属性已被删除,不再使用。相反,gzipped tarfile格式是所有平台上的默认格式,不进行特定于平台的选择。在需要在Windows和Zip分发版上构建分发版的环境中,使用setup.cfg
包含以下内容的文件:[sdist] formats=zip
此行为也已由SETUPTOOLS 26.0.0返回到早期的Python版本。
在
urllib.request
模块与http.client.HTTPConnection.request()
方法,如果未指定Content-Length头字段,并且请求主体是文件对象,则现在使用HTTP 1.1分块编码发送。如果必须将文件对象发送到HTTP 1.0服务器,则内容长度值现在必须由调用方指定。(由德米安·布莱希特和罗尔夫·克莱尔贡献,马丁·潘特在 bpo-12319 )这个
DictReader
现在返回类型为的行OrderedDict
. (由Steve Holden在 bpo-27842 )这个
crypt.METHOD_CRYPT
将不再添加到crypt.methods
如果平台不支持。(由Victor Stinner在 bpo-25287 )这个 verbose 和 重命名 参数的理由
namedtuple()
现在只显示关键字。(由Raymond Hettinger在 bpo-25628 )在Linux上,
ctypes.util.find_library()
现在看着LD_LIBRARY_PATH
对于共享库。(由Vinay Sajip在 bpo-9998 )这个
imaplib.IMAP4
类现在处理包含']'
从服务器发送的消息中的字符,以提高实际的兼容性。(利塔·乔在 bpo-21815 )这个
mmap.write()
函数现在返回像其他写入方法一样写入的字节数。(Jakub Stasiak在 bpo-26335 )这个
pkgutil.iter_modules()
和pkgutil.walk_packages()
函数现在返回ModuleInfo
命名元组。(由Ramchandra Apte在 bpo-17211 )re.sub()
现在,即使在字符串中找不到模式,替换模板中的无效数字组引用也会引发错误。无效组引用的错误消息现在包括组索引和引用的位置。(由Silentghost,Serhiy Storchaka在 bpo-25953 )zipfile.ZipFile
现在将提高NotImplementedError
对于无法识别的压缩值。以前是平原RuntimeError
被引发了。另外,拨打ZipFile
方法,或调用write()
使用模式创建的ZipFile上的方法'r'
将提高ValueError
. 以前,ARuntimeError
在这些情况下被提出。当自定义元类与零参数组合时
super()
或者直接引用方法到隐式__class__
闭包变量,隐式__classcell__
命名空间项现在必须传递到type.__new__
用于初始化。不这样做将导致DeprecationWarning
在python 3.6和a中RuntimeError
在Python 3.8中。随着
ModuleNotFoundError
,导入系统使用者可能开始期望导入系统替换在适当时引发更具体的异常,而不是更不具体的异常。ImportError
. 为了与这些消费者提供未来的兼容性,替代输入系统的实施者将完全取代__import__()
当一个模块根本找不到时,需要更新它们的实现来引发新的子类。默认导入系统的兼容插件的实现者不需要做任何更改,因为默认导入系统将在适当的时候引发新的子类。
C API中的更改¶
这个
PyMem_Malloc()
分配器系列现在使用 pymalloc allocator 而不是系统malloc()
. 应用程序调用PyMem_Malloc()
如果不握着金边,现在可以崩溃了。设置PYTHONMALLOC
环境变量到debug
验证应用程序中内存分配器的使用情况。见 bpo-26249 .
cpython字节码更改¶
对 bytecode 在Python 3.6中。
Python解释器现在使用16位的字代码而不是字节码。(由提出异议的Serhiy Storchaka和Victor Stinner在 bpo-26647 和 bpo-28050 )
新的
FORMAT_VALUE
和BUILD_STRING
作为 formatted string literal 实施。(埃里克·史密斯在 bpo-25483 和Serhiy Storchaka在 bpo-27078 )新的
BUILD_CONST_KEY_MAP
用于优化使用常量键创建字典的操作码。(Serhiy Storchaka在 bpo-27140 )为获得更好的性能和更简单的实现,对函数调用操作码进行了大量修改。这个
MAKE_FUNCTION
,CALL_FUNCTION
,CALL_FUNCTION_KW
和BUILD_MAP_UNPACK_WITH_CALL
操作码已被修改,新的CALL_FUNCTION_EX
和BUILD_TUPLE_UNPACK_WITH_CALL
已添加,并且CALL_FUNCTION_VAR
,CALL_FUNCTION_VAR_KW
和MAKE_CLOSURE
操作码已被删除。(提出异议) bpo-27095 和Serhiy Storchaka在 bpo-27213 , bpo-28257 )新的
SETUP_ANNOTATIONS
和STORE_ANNOTATION
已添加操作码以支持新的 variable annotation 语法。(Ivan Levkivskyi在 bpo-27985 )
python 3.6.2的显著变化¶
新的 make regen-all
建立目标¶
为了简化交叉编译,并确保在不需要现有的python版本可用的情况下可靠地编译cpython,基于autotools的构建系统不再尝试根据文件修改时间隐式地重新编译生成的文件。
相反,一个新的 make regen-all
已添加命令以在需要时强制重新生成这些文件(例如,在基于预生成版本构建了Python的初始版本之后)。
还定义了更多选择性再生目标-参见 Makefile.pre.in 有关详细信息。
(由Victor Stinner在 bpo-23404 )
3.6.2 新版功能.
移除 make touch
建立目标¶
这个 make touch
以前用于通过更新所生成文件的修改时间请求隐式重新生成的生成目标已被删除。
它已被新的 make regen-all
目标。
(由Victor Stinner在 bpo-23404 )
在 3.6.2 版更改.
python 3.6.4的显著变化¶
这个 PyExc_RecursionErrorInst
作为公共API的一部分的singleton已被删除,因为其成员从未被清除可能会在解释器完成时导致segfault。(Xavier de Gaye在 bpo-22898 和 bpo-30697 )
python 3.6.5的显著变化¶
这个 locale.localeconv()
函数现在临时设置 LC_CTYPE
本地化到 LC_NUMERIC
某些情况下的区域设置。(由Victor Stinner在 bpo-31900 )
python 3.6.7的显著变化¶
在3.6 tokenize
模块现在隐式地发出 NEWLINE
当输入没有尾随新行时提供标记。这种行为现在与C记号赋予器在内部所做的相匹配。(安马尔·阿斯卡尔在 bpo-33899 )
Python 3.6.10中的显著变化¶
由于重大安全问题 reuse_address 参数 asyncio.loop.create_datagram_endpoint()
不再支持。这是因为socket选项的行为 SO_REUSEADDR
在UDP中。有关详细信息,请参阅 loop.create_datagram_endpoint()
. (作者:凯尔·斯坦利、安托万·皮特罗和尤里·塞利万诺夫 bpo-37228 )