On this page
Python 3.6 新增Function
Editors
- Elvis Pranskevichus < elvis@magic.io >,Yury Selivanov < yury@magic.io >
本文介绍了 Python 3.6 与 3.5 相比的新Function。 Python 3.6 于 2016 年 12 月 23 日发布。有关更改的完整列表,请参见changelog。
See also
PEP 494-Python 3.6 发布时间表
摘要-发布要点
新语法Function:
PEP 498,格式化的字符串 Literals。
PEP 515,在数字 Literals 下划线。
PEP 526,变量 Comments 的语法。
PEP 525,异步生成器。
PEP 530:异步理解。
新的库模块:
CPython 实现的改进:
dict类型已重新实现为使用基于Raymond Hettinger 的建议且类似于PyPy dict 的实现的更紧凑的表示。与 Python 3.5 相比,字典使用的内存减少了 20%到 25%。
使用new protocol简化了类创建的自定义。
类属性定义 Sequences 为now preserved。
**kwargs
现在对应订单中元素的 Sequences,其中关键字参数已传递给该函数。DTrace 和 SystemTap probing support已添加。
现在,可以使用新的PYTHONMALLOC环境变量来调试解释器的内存分配和访问错误。
标准库中的重大改进:
asyncio模块已获得了新Function,在可用性和性能方面都有显着改进,并且修复了许多错误。从 Python 3.6 开始,
asyncio
模块不再是临时的,其 API 被认为是稳定的。已实现新的文件系统路径协议以支持path-like objects。所有在路径上运行的标准库函数均已更新,可以与新协议一起使用。
typing模块收到了improvements的数量。
tracemalloc模块已经过大量改进,现在可用于为ResourceWarning提供更好的输出,并为内存分配错误提供更好的诊断。有关更多信息,请参见PYTHONMALLOC section。
Security improvements:
添加了新的secrets模块,以简化适用于 Management 机密(例如帐户身份验证,令牌等)的强密码伪随机数的生成。
在 Linux 上,os.urandom()现在会阻塞,直到初始化系统 urandom 熵池以提高安全性为止。原理请参见 PEP 524。
ssl模块的默认设置和Function集已得到改进。
hashlib模块获得了对 BLAKE2,SHA-3 和 SHAKE 哈希算法以及scrypt()密钥派生Function的支持。
Windows improvements:
当用户未指定版本(pass命令行参数或配置文件)时,
py.exe
启动器在交互使用时不再喜欢 Python 2,而不是 Python 3. shebang 行的处理保持不变-在这种情况下,“ python”是指 Python 2.python.exe
和pythonw.exe
已被标记为可识别长路径,这意味着 260 个字符的路径限制可能不再适用。有关详情,请参见取消 MAX_PATH 限制。可以添加
._pth
文件以强制隔离模式,并完全指定所有搜索路径,以避免注册表和环境查找。有关更多信息,请参见the documentation。python36.zip
文件现在用作推断 PYTHONHOME的界标。有关更多信息,请参见the documentation。
New Features
PEP 498:格式化的字符串 Literals
PEP 498引入了一种新的字符串 Literals:* f-strings *或格式化的字符串 Literals。
格式化的字符串 Literals 以'f'
作为前缀,类似于str.format()接受的格式字符串。它们包含用花括号括起来的替换字段。替换字段是表达式,它们在运行时进行评估,然后使用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'
See also
PEP 498 –Literals 字符串插值。
PEP 由 Eric V. Smith 编写和实施。
PEP 526:变量 Comments 的语法
PEP 484引入了Function参数的类型 Comments(也称为类型提示)的标准。该 PEP 向 Python 添加了语法,用于 Comments 变量的类型,包括类变量和实例变量:
primes: List[int] = []
captain: str # Note: no initial value!
class Starship:
stats: Dict[str, int] = {}
就像函数 Comments 一样,Python 解释器不会将任何特殊含义附加到变量 Comments,而仅将它们存储在类或模块的__annotations__
属性中。
与静态类型语言中的变量语句相反,Comments 语法的目的是提供一种pass抽象语法树和__annotations__
属性为第三方工具和库指定结构化类型元数据的简便方法。
See also
PEP 515:数字 Literals 中的下划线
PEP 515添加了在数字 Literals 中使用下划线的Function,以提高可读性。例如:
>>> 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'
See also
PEP 515 –数字 Literals 中的下划线
由 Georg Brandl 和 Serhiy Storchaka 编写的 PEP。
PEP 525:异步 Generator
PEP 492为 Python 3.5 引入了对本机协程和async
/await
语法的支持。 Python 3.5 实现的一个显着限制是,不可能在同一函数体中使用await
和yield
。在 Python 3.6 中,此限制已解除,可以定义* asynchronous generators *:
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)
新语法允许更快更简洁的代码。
See also
PEP 525 –异步 Generator
PEP 由 Yury Selivanov 编写和实施。
PEP 530:异步理解
PEP 530添加了对在列表,集合,字典理解和生成器表达式中使用async for
的支持:
result = [i async for i in aiter() if i % 2]
此外,各种理解都支持await
表达式:
result = [await fun() for fun in funcs if await condition()]
See also
PEP 530 –异步理解
PEP 由 Yury Selivanov 编写和实施。
PEP 487:更轻松地自定义类创建
现在可以在不使用元类的情况下自定义子类的创建。每当创建新的子类时,都会在 Base Class 上调用新的__init_subclass__
类方法:
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__
(如创建类对象中所述)。
See also
PEP 487 –简化类创建的自定义
PEP 由 Martin Teichmann 编写和实施。
PEP 487:Descriptors 协议增强Function
PEP 487扩展了 Descriptors 协议,以包括新的可选set_name()方法。每当定义新类时,都将在定义中包括的所有 Descriptors 上调用新方法,为它们提供对所定义类的引用以及在类名称空间中给该 Descriptors 的名称。换句话说,Descriptors 实例现在可以知道所有者类中 Descriptors 的属性名称:
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()
See also
PEP 487 –简化类创建的自定义
PEP 由 Martin Teichmann 编写和实施。
PEP 519:添加文件系统路径协议
文件系统路径历来被表示为str或bytes对象。这就导致人们编写在文件系统路径上操作的代码,以为此类对象只是这两种类型之一(代表文件 Descriptors 的int并不算作不是文件路径)。不幸的是,这种假设阻止了文件系统路径(如pathlib)的替代对象表示形式与包括 Python 标准库在内的现有代码一起使用。
为了解决这种情况,已定义了一个由os.PathLike表示的新接口。pass实现fspath()方法,对象发出 signal 表示它代表路径。然后,对象可以将文件系统路径的低级表示形式表示为str或bytes对象。这意味着,如果对象实现os.PathLike或是表示文件系统路径的str或bytes对象,则该对象被视为path-like。代码可以使用os.fspath(),os.fsdecode()或os.fsencode()来显式获取路径类对象的str和/或bytes表示形式。
内置的open()函数已更新为可以接受os.PathLike对象,os和os.path模块中的所有相关函数以及标准库中的大多数其他函数和类也已接受。 os.DirEntry类和pathlib中的相关类也已更新,以实现os.PathLike。
希望是,更新用于在文件系统路径上操作的基本Function将导致第三方代码隐式支持所有path-like objects而无需任何代码更改,或者至少是非常小的更改(例如,在代码开头调用os.fspath(),然后再对 a 进行操作)Classpath 对象)。
下面是一些示例,说明新界面如何允许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 实施.)
See also
PEP 519 –添加文件系统路径协议
由 Brett Cannon 和 Koos Zevenhoven 撰写的 PEP。
PEP 495:本地时间消歧
在世界上大多数地方,过去有并且有时会有本地时钟被移回的。在那些时间中,引入了间隔,其中本地时钟在同一天两次显示同一时间。在这些情况下,显示在本地时钟上(或存储在 Python datetime 实例中)的信息不足以标识特定的时间点。
PEP 495将新的* fold *属性添加到datetime.datetime和datetime.time类的实例,以区分本地时间相同的两个 Moment:
>>> 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
,但在模糊情况下表示时间的第二个(按时间 Sequences)的实例除外。
See also
PEP 495 –本地时间消歧
PEP 由 Alexander Belopolsky 和 Tim Peters 编写,由 Alexander Belopolsky 实施。
PEP 529:将 Windows 文件系统编码更改为 UTF-8
表示文件系统路径最好使用 str(Unicode)而不是字节。但是,在某些情况下,使用字节已足够且正确。
在 Python 3.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。
See also
PEP 528 –将 Windows 控制台编码更改为 UTF-8
PEP 由 Steve Dower 编写和实施。
PEP 520:保留类属性定义 Sequences
类定义主体中的属性具有自然的 Sequences:名称在源中的显示 Sequences 相同。现在,此 Sequences 保留在新类的dict属性中。
而且,有效的默认类* execution *命名空间(从type.prepare()返回)现在是保留插入 Sequences 的 Map。
See also
PEP 520 –保留类属性定义 Sequences
PEP 由 Eric Snow 编写和实施。
PEP 468:保留关键字参数 Sequences
现在保证函数签名中的**kwargs
是保留插入 Sequences 的 Map。
See also
PEP 468 –保留关键字参数 Sequences
PEP 由 Eric Snow 编写和实施。
新的 dict 实施
dict类型现在使用基于首先由 PyPy 实现的Raymond Hettinger 的建议的“紧凑”表示形式。与 Python 3.5 相比,新dict()的内存使用量少 20%到 25%。
此新实现的 Sequences 保留方面被认为是实现细节,因此不应依赖(将来可能会更改,但是希望在更改语言规范之前,先在几个发行版中使用该新 dict 实现该语言,为所有当前和将来的 Python 实现强制要求保留 Sequences 的语义;这还有助于保留与仍旧有效的随机迭代 Sequences 的旧版本语言(例如 Python 3.5)的向后兼容性。
(由 INADA Naoki 在bpo-27350。想法最初由 Raymond Hettinger 建议中贡献。)
PEP 523:向 CPython 添加框架评估 API
尽管 Python 提供了广泛的支持以自定义代码的执行方式,但在框架对象的评估中却没有做到这一点。如果您想要某种方法来截取 Python 中的框架求值,那么,如果不直接操作已定义函数的函数指针,实际上是没有任何办法的。
PEP 523pass提供 API 以使帧评估可插入 C 级别来对此进行更改。这将允许诸如调试器和 JIT 之类的工具在开始执行 Python 代码之前拦截帧评估。这使得可以将替代评估实现用于 Python 代码,跟踪框架评估等。
该 API 并非受限 C API 的一部分,并且被标记为私有,以表明该 API 的使用受到限制,并且仅适用于精选的低级用例。 API 的语义将根据需要随 Python 更改。
See also
PEP 523 –向 CPython 添加框架评估 API
由 Brett Cannon 和 Dino Viehland 撰写的 PEP。
PYTHONMALLOC 环境变量
新的 PYTHONMALLOC环境变量允许设置 Python 内存分配器和安装调试钩子。
现在可以使用PYTHONMALLOC=debug
在调试模式下的 Python 上的 Python 内存分配器上安装调试钩子。调试钩子的影响:
新分配的内存中填充了字节
0xCB
释放的内存充满字节
0xDB
检测是否违反了 Python 内存分配器 API。例如,PyObject_Free()调用了PyMem_Malloc()分配的存储块。
在缓冲区开始之前检测写操作(缓冲区下溢)
在缓冲区结束后检测写操作(缓冲区溢出)
调用PYMEM_DOMAIN_OBJ(例如PyObject_Malloc())和PYMEM_DOMAIN_MEM(例如PyMem_Malloc())域的分配器Function时,请检查GIL是否保持。
检查是否保留了 GIL 也是 Python 3.6 的新Function。
有关 Python 内存分配器上的调试钩子,请参见PyMem_SetupDebugHooks()函数。
现在还可以使用PYTHONMALLOC=malloc
强制对所有 Python 内存分配使用 C 库的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__
...
(由 Victor Stinner 在bpo-26516和bpo-26564中贡献。)
DTrace 和 SystemTap 探测支持
现在可以构建 Python --with-dtrace
,从而为解释器中的以下事件启用静态标记:
function call/return
垃圾收集开始/结束
执行的代码行。
这可用于在 Producing 检测正在运行的解释器,而无需重新编译特定的调试版本或提供特定于应用程序的性能分析/调试代码。
使用 DTrace 和 SystemTap 检测 CPython中有更多详细信息。
当前的实现已在 Linux 和 macOS 上进行了测试。将来可能会添加其他标记。
(由ŁukaszLanga 在bpo-21590中贡献,基于 JesúsCeaAvión,David Malcolm 和 Nikhil Benesch 的补丁。)
其他语言更改
对核心 Python 语言进行的一些较小更改是:
现在,必须在同一范围内首次使用受影响的名称之前,以文本形式出现
global
或nonlocal
语句。以前这是SyntaxWarning。现在可以将special method设置为
None
以指示相应的操作不可用。例如,如果一个类将iter()设置为None
,则该类不可迭代。 (由bpo-25958由 Andrew Barnert 和 Ivan Levkivskyi 贡献。)现在,重复的 traceback 行的长序列缩写为
"[Previous line repeated {count} more times]"
(例如,请参见traceback)。 (由 Emanuel Barry 在bpo-26823中贡献。)导入现在在找不到模块时引发新的异常ModuleNotFoundError(子类ImportError)。当前检查 ImportError 的代码(在 try-except 中)仍然有效。 (由bpo-15767中的 Eric Snow 提供。)
现在,在类创建期间从元类方法调用时,依赖零参数
super()
的类方法将正常工作。 (由 Martin Teichmann 在bpo-23722中贡献。)
New Modules
secrets
新的secrets模块的主要目的是提供一种明显的方法,以可靠地生成适用于 Management 机密(例如帐户身份验证,令牌等)的加密强度高的伪随机值。
Warning
请注意,出于安全目的,不应将random模块中的伪随机数生成器使用。在 Python 3.6 上使用secrets,在 Python 3.5 和更早版本上使用os.urandom()。
See also
PEP 506 –将 Secret 模块添加到标准库
PEP 由 Steven D'Aprano 编写和实施。
Improved Modules
array
现在,即使扩展了迭代数组,array.array的耗尽迭代器也将保持耗尽状态。这与其他可变序列的行为一致。
由 Serhiy Storchaka 在bpo-26492中贡献。
ast
已添加新的ast.Constant
AST 节点。外部 AST 优化器可以将其用于不断折叠的目的。
由 Victor Stinner 在bpo-26146中贡献。
asyncio
从 Python 3.6 开始,asyncio
模块不再是临时的,其 API 被认为是稳定的。
自 Python 3.5.0 起,asyncio模块中的显着更改(由于临时状态,所有更改都移植回了 3.5.x):
get_event_loop()函数已更改为从协程和回调调用时始终返回当前正在运行的循环。 (由 Yury Selivanov 在bpo-28613中贡献。)
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 提供.)
用于创建 Future 对象的新的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中贡献。)
现在,传递StopIteration异常的实例时
Future.set_exception
将引发TypeError。 (由 Chris Angelico 在bpo-26221中贡献。)新的loop.connect_accepted_socket()方法将由接受 asyncio 外部但使用 asyncio 进行处理的连接的服务器使用。 (由 Jim Fulton 在bpo-27392中贡献。)
现在默认情况下为所有 TCP 传输设置了
TCP_NODELAY
标志。 (由 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(τ)常量已添加。 (由 Lisa Roach 在bpo-12345中贡献,有关详细信息,请参见 PEP 628。)
新常数:cmath.inf和cmath.nan匹配math.inf和math.nan,以及cmath.infj和cmath.nanj匹配复杂 repr 使用的格式。 (由 Mark Dickinson 在bpo-23229中贡献。)
collections
已添加新的Collection抽象 Base Class,以表示大小可迭代的容器类。 (由 Ivan Levkivskyi 提供,Neil Girdhar 在bpo-27598中提供。)
新的Reversible抽象 Base Class 表示可迭代的类,它们也提供reversed()方法。 (由 Ivan Levkivskyi 在bpo-25987中贡献。)
新的AsyncGenerator抽象 Base Class 表示异步生成器。 (由 Yury Selivanov 在bpo-28720中贡献。)
namedtuple()函数现在接受一个可选的关键字参数* module *,当指定该参数时,该参数将用于返回的命名 Tuples 类的__module__
属性。 (由 Raymond Hettinger 在bpo-17941中贡献。)
namedtuple()的* verbose 和 rename *参数现在仅用作关键字。 (由 Raymond Hettinger 在bpo-25628中贡献。)
现在可以腌制递归的collections.deque实例。 (由 Serhiy Storchaka 在bpo-26482中贡献。)
concurrent.futures
ThreadPoolExecutor类的构造函数现在接受一个可选的* thread_name_prefix *参数,以便可以自定义池创建的线程的名称。 (由 Gregory P. Smith 在bpo-27664中贡献。)
contextlib
添加了contextlib.AbstractContextManager类,以为上下文 Management 器提供抽象 Base Class。它为__enter __()提供了一个明智的默认实现,该实现返回self
并为__exit __()提供了抽象方法。匹配类已作为typing.ContextManager添加到typing模块。 (由布雷特·坎农在bpo-25609中贡献。)
datetime
datetime和time类具有新的fold
属性,用于在必要时消除本地时间的歧义。 datetime中的许多Function已更新,以支持本地时间消歧。有关更多信息,请参见当地时间消歧部分。 (由 Alexander Belopolsky 在bpo-24773中贡献。)
datetime.strftime()和date.strftime()方法现在支持 ISO 8601 日期指令%G
,%u
和%V
。 (由 Ashley Anderson 在bpo-12006中贡献。)
datetime.isoformat()函数现在接受一个可选的* timespec *参数,该参数指定要包括的时间值的其他组成部分的数量。 (由 Alessandro Cucci 和 Alexander Belopolsky 在bpo-19475中贡献。)
datetime.combine()现在接受可选的* tzinfo *参数。 (由 Alexander Belopolsky 在bpo-27661中贡献。)
decimal
新的Decimal.as_integer_ratio()方法以最低的分数和正数返回以整数形式表示给定Decimal实例的Pair(n, d)
对:
>>> 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。
pass* policy *关键字向各种构造函数启用的新电子邮件 API 不再是临时的。 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中贡献。)
encodings
在 Windows 上,添加'oem'
编码以使用CP_OEMCP
,并为现有'mbcs'
编码添加'ansi'
别名,该别名使用CP_ACP
代码页。 (由 Steve Dower 在bpo-27959中贡献。)
enum
enum模块中添加了两个新的枚举 Base Class:Flag和IntFlags
。两者都用于定义可以使用按位运算符组合的常数。 (由 Ethan Furman 在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中贡献。)
fileinput
hook_encoded()现在支持* errors *参数。 (由约瑟夫·哈克曼在bpo-25788中贡献。)
hashlib
hashlib支持 OpenSSL 1.1.0. 最低推荐版本为 1.0.2. (由 Christian Heimes 在bpo-26470中贡献。)
BLAKE2 哈希函数已添加到模块中。 blake2b()和blake2s()始终可用,并支持 BLAKE2 的全部Function集。 (由 Christian Heimes 在bpo-26798中根据 Dmitry Chestnykh 和 Samuel Neves 的代码提供。DmitryChestnykh 编写的文档。)
添加了 SHA-3 哈希函数sha3_224()
,sha3_256()
,sha3_384()
,sha3_512()
和 SHAKE 哈希函数shake_128()
和shake_256()
。 (由 Christian Heimes 在bpo-16113。Keccak 代码包中由 Guido Bertoni,Joan Daemen,MichaëlPeeters,Gilles Van Assche 和 Ronny Van Keer 贡献。)
基于密码的密钥派生Functionscrypt()现在可用于 OpenSSL 1.1.0 及更高版本。 (由 Christian Heimes 在bpo-27928中贡献。)
http.client
HTTPConnection.request()和endheaders()现在都支持分块编码请求主体。 (由bpo-12319中的 Demian Brecht 和 Rolf Krahl 贡献。)
idlelib 和 IDLE
idlelib 程序包正在进行现代化和重构,以使 IDLE 外观和工作更好,并使代码更易于理解,测试和改进。使 IDLE 看起来更好的部分原因(尤其是在 Linux 和 Mac 上)是在大多数对话框中使用 ttk 小部件。结果,IDLE 不再与 tcl/tk 8.4 一起运行。现在需要 tcl/tk 8.5 或 8.6. 我们建议运行两个版本的最新版本。
“现代化”包括重命名和合并闲置库模块。重命名具有部分大写名称的文件的过程类似于将 Tkinter 和 TkFont 重命名为 3.0 中的 tkinter 和 tkinter.font 的过程。因此,导入在 3.5 版中可用的 idlelib 文件通常在 3.6 版中不起作用。至少需要更改模块名称(请参见 idlelib/README.txt),有时甚至需要更多。 (名称更改由 Al Swiegart 和 Terry Reedy 在bpo-24225中贡献。此后的大多数 idlelib 补丁已经并将成为该过程的一部分。)
作为补偿,finally结果是一些 idlelib 类将更易于使用,并用更好的 API 和文档字符串对其进行解释。其他有用的信息将在可用时添加到 idlelib 中。
3.6.2 中的新Function:
自动完成的多种修复。 (由 Luie Lu 在bpo-15786中贡献。)
3.6.3 的新Function:
模块浏览器(在“文件”菜单上,以前称为“类浏览器”),除顶级Function和类外,现在还显示嵌套的Function和类。 (由 Guilherme Polo,Cheryl Sabella 和 Terry Jan Reedy 在bpo-1612262中贡献。)
以前作为扩展实现的 IDLE Function已作为常规Function重新实现。它们的设置已从“扩展”选项卡移至其他对话框选项卡。 (由 Charles Wohlganger 和 Terry Jan Reedy 在bpo-27099中贡献。)
设置对话框(选项,配置 IDLE)已部分重写,以改善外观和Function。 (由 Cheryl Sabella 和 Terry Jan Reedy 在多个问题中提供.)
3.6.4 中的新Function:
字体示例现在包括非拉丁字符的选择,以便用户可以更好地看到选择特定字体的效果。 (由 Terry Jan Reedy 在bpo-13802中贡献。)可以编辑该示例以包含其他字符。 (由 Serhiy Storchaka 在bpo-31860中贡献。)
3.6.6 中的新Function:
编辑器代码上下文选项已修改。框显示所有上下文行,直到最大行。单击上下文行将编辑器跳转到该行。自定义主题的上下文颜色将添加到“设置”对话框的“突出显示”选项卡中。 (由 Cheryl Sabella 和 Terry Jan Reedy 在bpo-33642,bpo-33768和bpo-33679中贡献。)
在 Windows 上,一个新的 API 调用告诉 Windows tk 可扩展为 DPI。在 Windows 8.1 或 10 上,Python 二进制文件的 DPI 兼容性属性未更改,并且监视器分辨率大于 96 DPI,这将使文本和线条更清晰。否则,它将无效。 (由 Terry Jan Reedy 在bpo-33656中贡献。)
3.6.7 中的新Function:
N 行(默认为 50 行)上的输出被压缩为一个按钮。可以在“设置”对话框的“常规”页面的“ PyShell”部分中更改 N。右键单击输出可以减少行,但可能会更长。可以pass双击按钮将压缩的输出扩展到适当位置,或者pass右键单击按钮将其扩展到剪贴板或单独的窗口中。 (由 Tal Einat 在bpo-1529353中贡献。)
importlib
导入现在在找不到模块时引发新的异常ModuleNotFoundError(子类ImportError)。当前检查ImportError
的代码(在 try-except 中)仍然有效。 (由bpo-15767中的 Eric Snow 提供。)
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
inspect.signature()函数现在报告编译器为理解和生成器表达式范围生成的隐式.0
参数,就好像它们是称为implicit0
的仅位置参数一样。 (由 Jelle Zijlstra 在bpo-19611中贡献。)
为了减少从 Python 2.7 和旧版inspect.getargspec() API 升级时的代码混乱,已对以前记录的inspect.getfullargspec()弃用进行了反向。尽管此Function对于单个/源 Python 2/3 代码库很方便,但更丰富的inspect.signature()接口仍然是推荐用于新代码的方法。 (由 Nick Coghlan 在bpo-27172中贡献)
json
json.load()和json.loads()现在支持二进制 Importing。编码的 JSON 应该使用 UTF-8,UTF-16 或 UTF-32 表示。 (由 Serhiy Storchaka 在bpo-17909中贡献。)
logging
添加了新的WatchedFileHandler.reopenIfNeeded()方法,以添加检查日志文件是否需要重新打开的Function。 (由 Marian Horban 在bpo-24884中贡献。)
math
tau(τ)常量已添加到math和cmath模块。 (由 Lisa Roach 在bpo-12345中贡献,有关详细信息,请参见 PEP 628。)
multiprocessing
multiprocessing.Manager()
返回的Proxy Objects现在可以嵌套。 (由bpo-6766中的 Davin Potts 贡献。)
os
有关os和os.path模块现在如何支持path-like objects的详细信息,请参见PEP 519的摘要。
scandir()现在在 Windows 上支持bytes路径。
新的close()方法允许显式关闭scandir()迭代器。 scandir()迭代器现在支持context manager协议。如果scandir()
迭代器没有耗尽也没有明确关闭,则ResourceWarning将在其析构函数中发出。 (由 Serhiy Storchaka 在bpo-25994中贡献。)
在 Linux 上,os.urandom()现在会阻塞,直到初始化系统 urandom 熵池以提高安全性为止。原理请参见 PEP 524。
Linux getrandom()
syscall(获取随机字节)现在作为新的os.getrandom()函数公开。 (由 PEP 524的一部分 Victor Stinner 提供)
pathlib
pathlib现在支持path-like objects。 (由 Brett Cannon 在bpo-27186中贡献。)
有关详细信息,请参见PEP 519的摘要。
pdb
Pdb类的构造函数有一个新的可选* readrc *参数,用于控制是否应读取.pdbrc
文件。
pickle
现在,可以使用比协议版本 4 更早的pickle protocols来腌制需要使用关键字参数调用__new__
的对象。协议版本 4 已经支持这种情况。 (由 Serhiy Storchaka 在bpo-24164中贡献。)
pickletools
pickletools.dis()现在输出MEMOIZE
操作码的隐式备忘录索引。 (由 Serhiy Storchaka 在bpo-25382中贡献。)
pydoc
pydoc模块已学会遵守MANPAGER
环境变量。 (由 Matthias Klose 在bpo-8637中贡献。)
help()和pydoc现在可以按定义的 Sequences 列出命名的 Tuples 字段,而不是按字母 Sequences 列出。 (由 Raymond Hettinger 在bpo-24879中贡献。)
random
新的choices()函数从给定总体中返回具有可选权重的指定大小的元素列表。 (由 Raymond Hettinger 在bpo-18844中贡献。)
re
在正则表达式中增加了对修饰符 Span 的支持。示例:'(?i:p)ython'
匹配'python'
和'Python'
,但不匹配'PYTHON'
; '(?i)g(?-i:v)r'
匹配'GvR'
和'gvr'
,但不匹配'GVR'
。 (由 Serhiy Storchaka 在bpo-433028中贡献。)
匹配对象组可以pass__getitem__
来访问,这等效于group()
。所以mo['name']
现在等于mo.group('name')
。 (由 Eric Smith 在bpo-24454中贡献。)
Match
个对象现在支持index-like objects作为组索引。 (由bpo-27177中的 Jeroen Demeyer 和 Zhang Xiang 贡献。)
readline
添加了set_auto_history()以启用或禁用将 Importing 自动添加到历史记录列表。 (由 Tyler Crompton 在bpo-26870中贡献。)
rlcompleter
除非前缀以下划线开头,否则现在将Ellipsis私有和特殊属性名称。在某些已完成的关键字之后添加空格或冒号。 (由 Serhiy Storchaka 在bpo-25011和bpo-25209中贡献。)
shlex
shlexpass新的* punctuation_chars *参数具有很多改进的 Shell 兼容性,以控制将哪些字符视为标点符号。 (由 Vinay Sajip 在bpo-1521950中贡献。)
site
现在,当指定要添加到.pth 文件中的sys.path的路径时,您现在可以在目录顶部指定文件路径(例如 zip 文件)。 (由 Wolfgang Langner 在bpo-26587中贡献)。
sqlite3
sqlite3.Cursor.lastrowid现在支持REPLACE
语句。 (由 Alex LordThorsen 在bpo-16864中贡献。)
socket
ioctl()函数现在支持SIO_LOOPBACK_FAST_PATH控制代码。 (由bpo-26536中的 Daniel Stokes 贡献。)
现在支持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()。 (由 Chris Heimes 在bpo-27744中贡献,并得到了 Victor Stinner 的支持。)
添加了新的 Linux 常量TCP_USER_TIMEOUT
和TCP_CONGESTION
。 (由 Omar Sandoval 提供,版本:26273)。
socketserver
现在,基于socketserver模块的服务器(包括在http.server,xmlrpc.server和wsgiref.simple_server中定义的服务器)支持context manager协议。 (由bpo-26404中的 Aviv Palivoda 提供。)
StreamRequestHandler类的wfile
属性现在实现io.BufferedIOBase可写接口。特别是,现在保证调用write()可以完整发送数据。 (由bpo-26721中的 Martin Panter 提供。)
ssl
ssl支持 OpenSSL 1.1.0. 最低推荐版本为 1.0.2. (由 Christian Heimes 在bpo-26470中贡献。)
3 DES 已从默认密码套件中删除,并添加了 ChaCha20 Poly1305 密码套件。 (由 Christian Heimes 在bpo-27850和bpo-27766中贡献。)
SSLContext为选项和密码提供了更好的默认配置。 (由 Christian Heimes 在bpo-28043中贡献。)
可以使用新的SSLSession类将 SSL 会话从一个 Client 端连接复制到另一个 Client 端连接。 TLS 会话恢复可以加快初始握手,减少延迟并提高性能(由 Chris_Heimes 在bpo-19500中根据 Alex Warhawk 的草稿提供。)
可以使用新的get_ciphers()方法按密码优先级的 Sequences 获取已启用密码的列表。
所有常量和标志都已转换为IntEnum和IntFlags
。 (由 Christian Heimes 在bpo-28025中贡献。)
添加了针对SSLContext的服务器和 Client 端特定的 TLS 协议。 (由 Christian Heimes 在bpo-28085中贡献。)
statistics
添加了新的harmonic_mean()Function。 (由 Steven_Dprap 在bpo-27181中贡献。)
struct
struct现在pass'e'
格式说明符支持 IEEE 754 半精度浮点数。 (由 Eli Stevens 和 Mark Dickinson 在bpo-11734中贡献。)
subprocess
现在,如果子进程仍在运行,则subprocess.Popen析构函数会发出ResourceWarning警告。使用上下文 Management 器协议(with proc: ...
)或显式调用wait()方法以读取子进程的退出状态。 (由 Victor Stinner 在bpo-26741中贡献。)
subprocess.Popen构造函数和所有传递参数的函数现在都接受* encoding 和 errors 参数。指定这些选项之一将为 stdin , stdout 和 stderr *流启用文本模式。 (由 Steve Dower 在bpo-6135中贡献。)
sys
新的getfilesystemencodeerrors()函数返回用于在 Unicode 文件名和字节文件名之间转换的错误模式的名称。 (由 Steve Dower 在bpo-27781中贡献。)
在 Windows 上,getwindowsversion()函数的返回值现在包含* platform_version *字段,该字段包含当前 os 的准确主版本,次版本和内部版本号,而不是正在为该进程仿真的版本(由 Steve Dower 提供)在bpo-27932中。)
telnetlib
Telnet现在是上下文 Management 器(由 StéphaneWirtel 在bpo-25485中贡献)。
time
struct_time属性tm_gmtoff
和tm_zone
现在在所有平台上都可用。
timeit
已添加新的Timer.autorange()便捷方法来重复调用Timer.timeit(),以便总运行时间大于或等于 200 毫秒。 (由 Steven D'Aprano 在bpo-6422中贡献。)
timeit现在会在最佳和最差时间之间存在较大(4 倍)差异时发出警告。 (由 Serhiy Storchaka 在bpo-23552中贡献。)
tkinter
在tkinter.Variable
类中添加了方法trace_add()
,trace_remove()
和trace_info()
。它们替换了使用过时的 Tcl 命令的旧方法trace_variable()
,trace()
,trace_vdelete()
和trace_vinfo()
,并且在以后的 Tcl 版本中可能不起作用。 (由 Serhiy Storchaka 在bpo-22115中贡献)。
traceback
现在,回溯模块和解释器的内置异常显示都简化了回溯中重复行的长序列,如以下示例所示:
>>> 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
(由 Emanuel Barry 在bpo-26823中贡献。)
tracemalloc
tracemalloc模块现在支持在多个不同的地址空间中跟踪内存分配。
新的DomainFilter过滤器类已按其地址空间(域)添加到过滤器块跟踪中。
(由 Victor Stinner 在bpo-26588中贡献。)
typing
由于typing模块是provisional,因此 Python 3.6 中引入的所有更改也已反向移植到 Python3.5.x。
typing模块对通用类型别名的支持大大提高。例如,Dict[str, Tuple[S, T]]
现在是有效的类型 Comments。 (由 Guido van Rossum 在Github #195中贡献。)
添加了typing.ContextManager类以表示contextlib.AbstractContextManager。 (由 Brett Cannon 在bpo-25609中贡献。)
添加了typing.Collection类以表示collections.abc.Collection。 (由 Ivan Levkivskyi 在bpo-27598中贡献。)
typing.ClassVar类型构造已添加为标记类变量。如在 PEP 526中介绍的那样,包装在 ClassVar 中的变量 Comments 指示打算将给定属性用作类变量,并且不应在该类的实例上设置该属性。 (由 Ivan Levkivskyi 在Github #280中贡献。)
一个新的TYPE_CHECKING常量,静态类型检查器假定为True
,但在运行时为False
。 (由 Guido van Rossum 在Github #230中贡献。)
添加了新的NewType() helper 函数,以为 Comments 创建轻量不同的类型:
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()来检查是否调用了模拟对象。 (由bpo-26323中的 Amit Saha 提供。)
Mock.reset_mock()方法现在只有两个可选的关键字参数:* return_value 和 side_effect *。 (由 Kushal Das 在bpo-21271中贡献。)
urllib.request
如果 HTTP 请求具有文件或可迭代主体(不是字节对象),但没有Content-Length
Headers,而不是抛出错误,则AbstractHTTPHandler
现在回退以使用分块传输编码。 (由 Demian Brecht 和 Rolf Krahl 在bpo-12319中贡献。)
urllib.robotparser
RobotFileParser现在支持Crawl-delay
和Request-rate
extensions。 (由 Nikolay Bogoychev 在bpo-16099中贡献。)
venv
venv接受新参数--prompt
。此参数为虚拟环境提供备用前缀。 (由ŁukaszBalcerzak 提出,并由bpo-22829中的 StéphaneWirtel 移植到 3.6. )
warnings
新的可选的* source *参数已添加到warnings.warn_explicit()函数:发出ResourceWarning的被破坏对象。 * source *属性也已添加到warnings.WarningMessage
(由 Victor Stinner 在bpo-26568和bpo-26567中贡献)。
记录ResourceWarning警告后,现在使用tracemalloc模块来try检索分配了销毁对象的回溯。
脚本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模块时才显示。
winreg
添加了 64 位整数类型REG_QWORD。 (由 Clement Rouault 在bpo-23026中贡献。)
winsound
允许将关键字参数传递给Beep,MessageBeep和PlaySound(bpo-27982)。
xmlrpc.client
xmlrpc.client模块现在支持解组 Apache XML-RPC 实现使用的用于数字和None
的其他数据类型。 (由 Serhiy Storchaka 在bpo-26885中贡献。)
zipfile
一种新的ZipInfo.from_file()类方法允许从文件系统文件中创建ZipInfo实例。可以使用新的ZipInfo.is_dir()方法检查ZipInfo实例是否表示目录。 (由 Thomas Kluyver 在bpo-26039中贡献。)
现在,可以使用ZipFile.open()方法将数据写入 ZIP 文件以及提取数据。 (由 Thomas Kluyver 在bpo-26039中贡献。)
zlib
compress()和decompress()函数现在接受关键字参数。 (分别由bpo-26243的 Aviv Palivoda 和bpo-16764的 Zhang Xiang 贡献。)
Optimizations
Python 解释器现在使用 16 位字代码而不是字节码,这使得许多操作码优化成为可能。 (由 Demur Rumed 贡献,来自 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 倍,并减少了内存占用。
现在,对于错误处理程序
surrogateescape
,ignore
和replace
,ASCII 解码器的速度高达 60 倍(由 Victor Stinner 在bpo-24870中贡献)。现在,错误处理程序
surrogateescape
的 ASCII 和 Latin1 编码器的速度高达 3 倍(由 Victor_ Stinner 在bpo-25227中贡献)。现在,错误处理程序
ignore
,replace
,surrogateescape
,surrogatepass
的 UTF-8 编码器的速度高达 75 倍(由 Victor Stinner 在bpo-25267中贡献)。对于错误处理程序
ignore
,replace
和surrogateescape
,UTF-8 解码器的速度现在提高了 15 倍(由 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的 Josh Snider 贡献)。PyMem_Malloc()域(PYMEM_DOMAIN_MEM)的分配器函数现在使用pymalloc 内存分配器而不是 C 库的
malloc()
函数。 pymalloc 分配器针对具有较短生存期的小于或等于 512 字节的对象进行了优化,对于较大的内存块使用malloc()
。 (由 Victor Stinner 在bpo-26249中贡献)。现在,反序列化许多小对象时pickle.load()和pickle.loads()的速度提高了 10%(由 Victor Stinner 在bpo-27056中贡献)。
与passpositional arguments相比,向函数传递keyword arguments具有开销。现在,在使用 Argument Clinic 实现的扩展Function中,此开销已大大减少。 (由 Serhiy Storchaka 在bpo-27574中贡献)。
glob模块中优化的glob()和iglob()Function;现在它们的速度提高了 3 到 6 倍。 (由 Serhiy Storchaka 在bpo-25596中贡献)。
pass使用os.scandir()优化pathlib中的 glob;现在快了 1.5 到 4 倍。 (由 Serhiy Storchaka 在bpo-26032中贡献)。
xml.etree.ElementTree的解析,迭代和深度复制性能已得到显着提高。 (由 Serhiy Storchaka 在bpo-25638,bpo-25873和bpo-25869中贡献。)
现在,使用浮点数和小数创建fractions.Fraction个实例的速度提高了 2 到 3 倍。 (由 Serhiy Storchaka 在bpo-25971中贡献。)
Build 和 C API 的更改
Python 现在需要在工具链中提供一些 C99 支持。最值得注意的是,Python 现在使用标准整数类型和宏代替
PY_LONG_LONG
等自定义宏。有关更多信息,请参见 PEP 7和bpo-17884。将 Android NDK 和 Android API 级别设置为 21(Android 5.0 Lollipop)或更高版本的 CPython 交叉编译成功运行。尽管 Android 尚不支持该平台,但 Python 测试套件可在 Android 模拟器上运行,只有大约 16 个测试失败。请参阅 Android 元问题bpo-26865。
--enable-optimizations
configure 标志已添加。启用它会激活昂贵的优化,如 PGO。 (bpo-26359中 Intel 的 Alecsandru Patrascu 的原始补丁。)现在,在调用PYMEM_DOMAIN_OBJ(例如PyObject_Malloc())和PYMEM_DOMAIN_MEM(例如PyMem_Malloc())域的分配器函数时,必须保留GIL。
新的Py_FinalizeEx() API,指示刷新缓冲的数据是否失败。 (由 Martin Panter 在bpo-5319中贡献。)
PyArg_ParseTupleAndKeywords()现在支持positional-only parameters。仅位置参数由空名称定义。 (由 Serhiy Storchaka 在bpo-26282中贡献)。
PyTraceback_Print
方法现在将重复行的长序列缩写为"[Previous line repeated {count} more times]"
。 (由 Emanuel Barry 在bpo-26823中贡献。)新的PyErr_SetImportErrorSubclass()函数允许指定要引发的ImportError的子类。 (由bpo-15767中的 Eric Snow 提供。)
新的PyErr_ResourceWarning()函数可用于生成ResourceWarning,以提供资源分配的来源。 (由 Victor Stinner 在bpo-26567中贡献。)
新的PyOS_FSPath()函数返回path-like object的文件系统表示形式。 (由 Brett Cannon 在bpo-27186中贡献。)
PyUnicode_FSConverter()和PyUnicode_FSDecoder()函数现在将接受path-like objects。
Other Improvements
- 当两次提供--version(缩写为-V)时,Python 将打印sys.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)]
Deprecated
New Keywords
不建议将async
和await
用作变量,类,函数或模块的名称。在 python 3.5 中由 PEP 492引入,它们将在 python 3.7 中成为适当的关键字。从 Python 3.6 开始,使用async
或await
作为名称将生成DeprecationWarning。
不推荐使用的 Python 行为
在生成器内部引发StopIteration异常现在将生成DeprecationWarning,并在 Python 3.7 中触发RuntimeError。有关详细信息,请参见PEP 479:更改生成器内部的 StopIteration 处理。
现在期望aiter()方法直接返回异步迭代器,而不是像以前那样返回 awaitable。前者将触发DeprecationWarning。向后兼容性将在 Python 3.7 中删除。 (由 Yury Selivanov 在bpo-27243中贡献。)
现在,不是有效转义序列的反斜杠字符对将生成DeprecationWarning。尽管这finally将成为SyntaxError,但不适用于多个 Python 版本。 (由 Emanuel Barry 在bpo-27364中贡献。)
执行相对导入时,如果未定义__spec__
或__package__
,则从调用模块返回__name__
和__path__
现在会引发ImportWarning。 (由 Rose_Ames 在bpo-25791中贡献。)
不推荐使用的 Python 模块,函数和方法
asynchat
反对使用asynchat,而赞成asyncio。 (由 Mariatta 在bpo-25002中贡献。)
asyncore
反对使用asyncore,而赞成asyncio。 (由 Mariatta 在bpo-25002中贡献。)
dbm
与其他dbm实现不同,dbm.dumb模块以'rw'
模式创建数据库,并允许修改以'r'
模式打开的数据库。现在已弃用此行为,并将在 3.8 中删除。 (由 Serhiy Storchaka 在bpo-21708中贡献。)
distutils
Distribution
构造函数的未记录的extra_path
参数现在被认为已弃用,如果设置,将发出警告。在以后的 Python 版本中将删除对此参数的支持。有关详情,请参见bpo-27919。
grp
getgrgid()中对非整数参数的支持已被弃用。 (由 Serhiy Storchaka 在bpo-26129中贡献。)
importlib
现在不推荐使用importlib.machinery.SourceFileLoader.load_module()和importlib.machinery.SourcelessFileLoader.load_module()方法。它们是importlib中剩下的importlib.abc.Loader.load_module()的唯一实现,在 python 的早期版本中不推荐使用importlib.abc.Loader.exec_module()。
importlib.machinery.WindowsRegistryFinder类现已弃用。从 3.6.0 版开始,默认情况下(在 Windows 上)仍将其添加到sys.meta_path,但是在将来的版本中可能会更改。
os
现在不推荐使用未公开支持的通用bytes-like objects作为os函数,compile()和类似函数中的路径。 (由 Serhiy Storchaka 在bpo-25791和bpo-26754中贡献。)
re
正则表达式中间对内联标志(?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 相关的参数(例如ftplib,http.client,imaplib,poplib和smtplib中的certfile
,keyfile
和check_hostname
)已被弃用,而推荐使用context
。 (由 Chris Heimes 在bpo-28022中贡献。)
现在已弃用ssl模块的几个协议和Function。在将来的 OpenSSL 版本中将不再提供某些Function。不推荐使用其他Function,而推荐使用其他 API。 (由 Chris Heimes 在bpo-28022和bpo-26470中贡献。)
tkinter
tkinter.tix模块现已弃用。 tkinter用户应改用tkinter.ttk。
venv
反对使用pyvenv
脚本,而推荐使用python3 -m venv
。这避免了关于 Python 解释器pyvenv
连接到哪个的困惑,从而避免了虚拟环境将使用哪个 Python 解释器。 (由 Brett Cannon 在bpo-25154中贡献。)
C API 弃用的Function和类型
现在不推荐使用未记录的FunctionPyUnicode_AsEncodedObject()
,PyUnicode_AsDecodedObject()
,PyUnicode_AsEncodedUnicode()
和PyUnicode_AsDecodedUnicode()
。请改用基于通用编解码器的 API。
不建议使用的构建选项
在非 macOS UNIX 平台上,默认情况下--with-system-ffi
configure 标志现在处于打开状态。可以使用--without-system-ffi
将其禁用,但是不建议使用该标志,Python 3.7 不接受该标志。 macOS 不受此更改的影响。请注意,许多 os 发行商在构建系统 Python 时已使用--with-system-ffi
标志。
Removed
API 和Function删除
现在,由正则表达式中由
'\'
和 ASCII 字母组成的未知转义将导致错误。在re.sub()的替换模板中,仍然允许但不推荐使用它们。 re.LOCALE标志现在只能与二进制模式一起使用。inspect.getmoduleinfo()
已删除(自 CPython 3.3 起不推荐使用)。 inspect.getmodulename()应该用于获取给定路径的模块名称。 (由 Yury Selivanov 在bpo-13248中贡献。)从traceback模块中删除了
traceback.Ignore
类和traceback.usage
,traceback.modname
,traceback.fullmodname
,traceback.find_lines_from_code
,traceback.find_lines
,traceback.find_strings
,traceback.find_executable_lines
方法。自 Python 3.2 以来,它们是未记录的方法,私有方法提供了等效Function。删除了tkinter小部件类中的
tk_menuBar()
和tk_bindForTraversal()
虚拟方法(自 Tk 4.0 起相应的 Tk 命令已过时)。zipfile.ZipFile类的open()方法不再支持
'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
宏的特殊 Python 构建的输出现已关闭。可以使用-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()现在在未设置其 msg 参数的情况下设置TypeError。以前只返回
NULL
。代码对象的
co_lnotab
属性的格式已更改为支持负行号增量。默认情况下,Python 不会发出带有负行号 delta 的字节码。使用frame.f_lineno
,PyFrame_GetLineNumber()
或PyCode_Addr2Line()
的Function不受影响。应该将直接解码co_lnotab
的函数更新为对行号 delta 使用带符号的 8 位整数类型,但这仅对于支持使用负行号 delta 的应用程序才需要。有关co_lnotab
格式及其解码方法,请参见Objects/lnotab_notes.txt
;有关基本原理,请参见 PEP 511。compileall模块中的函数现在分别返回布尔值而不是
1
或0
来表示成功或失败。由于布尔值是整数的子类,因此只有在对1
或0
进行身份检查时,这才是问题。参见bpo-25768。现在,读取urllib.parse.urlsplit()和urlparse()结果的
port
属性会为超出范围的值引发ValueError,而不是返回None。参见bpo-20059。以下模块已将缺失的 API 添加到其
__all__
属性中以与已记录的 API 相匹配:calendar,cgi,csv,ElementTree,enum,fileinput,ftplib,logging,mailbox,mimetypes,optparse,plistlib,smtpd,subprocess,tarfile wave。这意味着当使用import *
时,它们将导出新符号。 (由bpo-23883中的 Joel Taddei 和 JacekKołodziej 提供。)执行相对导入时,如果
__package__
不等于__spec__.parent
,则引发ImportWarning。 (由 Brett Cannon 在bpo-25791中贡献。)当执行相对导入并且不知道任何父包时,将引发ImportError。以前,可以提出SystemError。 (由 Brett Cannon 在bpo-18018中贡献。)
基于socketserver模块的服务器(包括在http.server,xmlrpc.server和wsgiref.simple_server中定义的服务器)现在仅捕获从Exception派生的异常。因此,如果请求处理程序引发SystemExit或KeyboardInterrupt之类的异常,则不再调用handle_error(),该异常将停止单线程服务器。 (由 Martin Panter 在bpo-23430中贡献。)
如果用户没有权限,spwd.getspnam()现在会引发PermissionError而不是KeyError。
如果基础系统调用报告了错误(例如
EBADF
),则socket.socket.close()方法现在引发异常。 (由 Martin Panter 在bpo-26685中贡献。)smtpd.SMTPChannel和smtpd.SMTPServer构造函数的* decode_data *参数现在默认为
False
。这意味着传递给process_message()的参数默认情况下现在是一个字节对象,并且process_message()
将传递给关键字参数。已经根据 3.5 生成的弃用警告进行了更新的代码不会受到影响。dump(),dumps(),load()和loads()函数以及json模块中JSONEncoder和JSONDecoder类构造函数的所有可选参数现在都是keyword-only。 (由 Serhiy Storchaka 在bpo-18726中贡献。)
不会覆盖
type.__new__
的type的子类可能不再使用单参数形式来获取对象的类型。作为 PEP 487的一部分,传递给type(而不是元类提示
metaclass
)的关键字参数的处理现在被一致地委派给object.init_subclass()。这意味着type.__new__()
和type.__init__()
现在都接受任意关键字参数,但是object.init_subclass()(从type.__new__()
调用)默认情况下将拒绝它们。接受其他关键字参数的自定义元类将需要相应地调整对type.__new__()
的调用(无论是直接调用还是passsuper调用)。在
distutils.command.sdist.sdist
中,default_format
属性已删除,不再使用。相反,在所有平台上默认使用 gzip 压缩的 tarfile 格式,并且不进行特定于平台的选择。在基于 Windows 构建发行版且需要 zip 发行版的环境中,请使用包含以下内容的setup.cfg
文件配置项目:
[sdist]
formats=zip
Setuptools 26.0.0 还将此行为反向移植到了早期的 Python 版本。
在urllib.request模块和http.client.HTTPConnection.request()方法中,如果未指定 Content-LengthHeaders 字段,并且请求正文是文件对象,则现在使用 HTTP 1.1 分块编码发送该请求。如果必须将文件对象发送到 HTTP 1.0 服务器,则现在必须由调用方指定 Content-Length 值。 (由 Demian Brecht 和 Rolf Krahl 在bpo-12319中由 Martin Panter 进行的调整贡献。)
DictReader现在返回类型OrderedDict的行。 (由 Steve Holden 在bpo-27842中贡献。)
如果平台不支持,则crypt.METHOD_CRYPT将不再添加到
crypt.methods
中。 (由 Victor Stinner 在bpo-25287中贡献。)namedtuple()的* verbose 和 rename *参数现在仅用作关键字。 (由 Raymond Hettinger 在bpo-25628中贡献。)
在 Linux 上,ctypes.util.find_library()现在在
LD_LIBRARY_PATH
中查找共享库。 (由 Vinay Sajip 在bpo-9998中贡献。)imaplib.IMAP4类现在处理从服务器发送的消息中包含
']'
字符的标志,以提高实际兼容性。 (由 Lita Cho 在bpo-21815中贡献。)现在,
mmap.write()
函数可以像其他写入方法一样返回写入的字节数。 (由 Jakub Stasiak 在bpo-26335中贡献。)pkgutil.iter_modules()和pkgutil.walk_packages()函数现在返回名为 Tuples 的ModuleInfo。 (由 Ramchandra Apte 在bpo-17211中贡献。)
re.sub()现在会为替换模板中的无效数字组引用引发错误,即使在字符串中未找到模式也是如此。现在,无效组引用的错误消息包括组索引和引用位置。 (由 SilentGhost 和 Serhiy Storchaka 在bpo-25953中贡献。)
zipfile.ZipFile现在会针对无法识别的压缩值提高NotImplementedError。以前提出了一个普通的RuntimeError。此外,在关闭的 ZipFile 上调用ZipFile方法或在以
'r'
模式创建的 ZipFile 上调用write()方法将引发ValueError。以前,在这些情况下提出了RuntimeError。当自定义元类与零参数super()组合或从方法直接引用到隐式
__class__
闭包变量时,隐式__classcell__
命名空间条目现在必须向上传递到type.__new__
进行初始化。否则,在 Python 3.6 中将导致DeprecationWarning,在 Python 3.8 中将导致RuntimeError。随着ModuleNotFoundError的引入,导入系统使用者可能会开始期望导入系统的替换会在适当时引发更具体的异常,而不是不太具体的ImportError。为了提供与此类使用者的将来兼容性,当根本找不到模块时,完全替代import()的替代导入系统的实现者将需要更新其实现,以引发新的子类。默认导入系统的兼容插件的实现者无需进行任何更改,因为默认导入系统将在适当时引发新的子类。
C API 的更改
PyMem_Malloc()分配器家族现在使用pymalloc allocator而不是系统
malloc()
。现在,未持有 GIL 的情况下调用PyMem_Malloc()的应用程序可能会崩溃。将 PYTHONMALLOC环境变量设置为debug
以验证应用程序中内存分配器的使用。参见bpo-26249。
CPython 字节码更改
Python 3.6 对bytecode进行了几项重大更改。
Python 解释器现在使用 16 位字代码而不是字节码。 (由 Demur Rumed 贡献,来自 Serhiy Storchaka 和 Victor Stinner 在bpo-26647和bpo-28050中提供了意见和建议。)
新的FORMAT_VALUE和BUILD_STRING操作码是格式化的字符串 Literals实现的一部分。 (由bpo-25483中的 Eric Smith 和bpo-27078中的 Serhiy Storchaka 贡献。)
新的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中的 Demur Rumed 和bpo-27213和bpo-28257中的 Serhiy Storchaka 贡献。)已添加新的SETUP_ANNOTATIONS和
STORE_ANNOTATION
操作码以支持新的variable annotation语法。 (由 Ivan Levkivskyi 在bpo-27985中贡献。)
Python 3.6.2 中的重大更改
新的 make regen-all 构建目标
为了简化交叉编译,并确保可以可靠地编译 CPython,而无需使用现有的 Python 版本,基于自动工具的构建系统不再try根据文件修改时间隐式重新编译生成的文件。
而是添加了一个新的make regen-all
命令,以在需要时强制重新生成这些文件(例如,在已经基于预生成的版本构建 Python 的初始版本之后)。
还定义了更多选择性的再生目标-有关详细信息,请参见Makefile.pre.in。
(由 Victor Stinner 在bpo-23404中贡献。)
版本 3.6.2 中的新Function。
删除 make touch 构建目标
先前用于pass更新文件的修改时间来请求隐式重新生成生成文件的make touch
构建目标已删除。
它已被新的make regen-all
目标替换。
(由 Victor Stinner 在bpo-23404中贡献。)
在版本 3.6.2 中更改。
Python 3.6.4 中的重大更改
属于公共 API 的PyExc_RecursionErrorInst
单例已被删除,因为从未清除其成员可能会在解释器完成期间导致段错误。 (由 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.7 中,当tokenize模块提供了没有尾随新行的 Importing 时,它隐式发出NEWLINE
令牌。现在,此行为与 C 标记程序内部执行的操作匹配。 (由 Ammar Askar 在bpo-33899中贡献。)
Python 3.6.10 中的重大更改
由于重大安全问题,不再支持asyncio.loop.create_datagram_endpoint()的* reuse_address *参数。这是因为 UDP 中套接字选项SO_REUSEADDR
的行为。有关更多详细信息,请参见loop.create_datagram_endpoint()
的文档。 (由bpo-37228中的 Kyle Stanley,Antoine Pitrou 和 Yury Selivanov 贡献。)