Skip to main content

Python 3.6中的新功能

Release:

3.6.0

Date:

十月 10, 2017

Editors:

Elvis Pranskevichus <elvis@magic.io>,Yury Selivanov <yury@magic.io>

本文解释了Python 3.6中的新功能,与3.5相比。 Python 3.6于2016年12月23日发布。有关更改的完整列表,请参阅 changelog

参见

PEP 494 - Python 3.6发布计划

摘要 - 发布亮点

新的语法特性:

新库模块:

CPython实现改进:

标准库中的重大改进:

  • asyncio 模块已经收到了新功能,显着的可用性和性能改进,以及大量的错误修复。从Python 3.6开始,asyncio 模块不再是临时的,它的API被认为是稳定的。

  • 一个新的 文件系统路径协议 已经实现支持 路径样对象。在路径上操作的所有标准库函数已更新,以使用新协议。

  • datetime 模块已获得对 本地时间消歧 的支持。

  • typing 模块收到了一些 改进,不再是临时的。

  • tracemalloc 模块已经过重大改进,现在用于为 ResourceWarning 提供更好的输出,以及为内存分配错误提供更好的诊断。有关详细信息,请参阅 PYTHONMALLOC部分

安全改进:

  • 添加了新的 secrets 模块以简化适合于管理诸如帐户认证,令牌等的秘密的密码强的伪随机数的生成。

  • 在Linux上,os.urandom() 现在阻塞,直到系统urandom熵池被初始化以增加安全性。参见 PEP 524 的理由。

  • hashlibssl 模块现在支持OpenSSL 1.1.0。

  • ssl 模块的默认设置和功能集已改进。

  • hashlib 模块接收对BLAKE2,SHA-3和SHAKE哈希算法和 scrypt() 密钥导出函数的支持。

Windows改进:

  • PEP 528PEP 529,Windows文件系统和控制台编码更改为UTF-8。

  • 当用户交互地使用 py.exe 启动器时,当用户没有指定版本(通过命令行参数或配置文件)时,不再喜欢Python 2超过Python 3。处理shebang行保持不变 - “python”指的是Python 2。

  • python.exepythonw.exe 已标记为长路径感知,这意味着260字符路径限制可能不再适用。详情请参阅 删除MAX_PATH限制

  • 可以添加 ._pth 文件以强制隔离模式,并完全指定所有搜索路径,以避免注册表和环境查找。有关详细信息,请参阅 文档

  • python36.zip 文件现在作为地标推断 PYTHONHOME。有关详细信息,请参阅 文档

新功能

PEP 498:格式化的字符串文字

PEP 498 引入了一种新的字符串文本:f-strings格式化的字符串文字

格式化的字符串文字以 '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'

参见

PEP 498 - Literal String Interpolation。

PEP由Eric V. Smith编写和实施。

功能文档

PEP 526:变量注释的语法

PEP 484 引入了函数参数类型注释的标准,即a.k.a. type hints。此PEP向Python添加了用于注释变量类型的语法,包括类变量和实例变量:

primes: List[int] = []

captain: str  # Note: no initial value!

class Starship:
    stats: Dict[str, int] = {}

与函数注释一样,Python解释器不会对变量注释附加任何特定含义,只将它们存储在类或模块的 __annotations__ 属性中。

与静态类型语言中的变量声明相反,注释语法的目标是通过抽象语法树和 __annotations__ 属性为第三方工具和库指定结构化类型元数据的简单方法。

参见

PEP 526 - 变量注释的语法。

PEP由Ryan Gonzalez,Philip House,Ivan Levkivskyi,Lisa Roach和Guido van Rossum撰写。由Ivan Levkivskyi实施。

使用或将使用新语法的工具:mypypytype,PyCharm等。

PEP 515:数字文字中的下划线

PEP 515 增加了在数字文字中使用下划线以提高可读性的能力。例如:

>>> 1_000_000_000_000_000
1000000000000000
>>> 0x_FF_FF_FF_FF
4294967295

在数字之间和任何基址说明符之后允许单个下划线。不允许连续的前导,尾随或多个下划线。

字符串格式化 语言现在还支持 '_' 选项来用信号通知用于浮点表示类型的千位分隔符的下划线和整数呈现类型 'd' 的使用。对于整数呈现类型 'b''o''x''X',将以每4个数字插入下划线:

>>> '{:_}'.format(1000000)
'1_000_000'
>>> '{:_x}'.format(0xFFFFFFFF)
'ffff_ffff'

参见

PEP 515 - 数字文字中的下划线

PEP由Georg Brandl和Serhiy Storchaka编写。

PEP 525:异步发电机

PEP 492 引入了对本地协同程序的支持,async / await 语法对Python 3.5的支持。 Python 3.5实现的一个显着的局限性是,不可能在同一个函数体中使用 awaityield。在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 - 异步发电机

PEP由Yury Selivanov编写和实施。

PEP 530:异步理解

PEP 530 添加了对list,set,dict comprehension和generator表达式中使用 async for 的支持:

result = [i async for i in aiter() if i % 2]

此外,在所有种类的理解中支持 await 表达式:

result = [await fun() for fun in funcs if await condition()]

参见

PEP 530 - 异步求解

PEP由Yury Selivanov编写和实施。

PEP 487:简化类创建的自定义

现在可以在不使用元类的情况下自定义子类。每当创建一个新的子类时,将在基类上调用新的 __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__ (如 创建类对象 中所述)。

参见

PEP 487 - 更简单的类创建的自定义

PEP由Martin Teichmann编写和实施。

功能文档

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 487 - 更简单的类创建的自定义

PEP由Martin Teichmann编写和实施。

功能文档

PEP 519:添加文件系统路径协议

文件系统路径历史上被表示为 strbytes 对象。这导致人们编写代码,这些代码在文件系统路径上操作,假定这些对象只是这两种类型之一(代表文件描述符的 int 不会被视为不是文件路径)。不幸的是,该假设阻止了像 pathlib 这样的文件系统路径的替代对象表示使用预先存在的代码,包括Python的标准库。

要解决这种情况下,由 os.PathLike 为代表的新的接口已被定义。通过实现 __fspath__() 方法,对象表示它表示路径。然后,对象可以将文件系统路径的低级表示提供为 strbytes 对象。这意味着如果对象实现 os.PathLike 或者是表示文件系统路径的 strbytes 对象,则该对象被认为是 路径样。代码可以使用 os.fspath()os.fsdecode()os.fsencode() 来显式获取路径对象的 str 和/或 bytes 表示。

内置的 open() 功能已经更新为接受 os.PathLike 对象,osos.path 模块中的所有相关功能以及标准库中的大多数其他功能和类。 pathlib 中的 os.DirEntry 类和相关类也已更新以实现 os.PathLike

希望更新用于操作文件系统路径的基本函数将导致第三方代码隐含地支持所有 路径样对象,而不需要任何代码更改,或至少非常小的代码(例如,在操作之前在代码开头调用 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由Brett Cannon和Koos Zevenhoven编写。

PEP 495:本地时间消歧

在大多数世界位置,已经和将来的时间,本地时钟回迁。在那些时间,引入间隔,其中本地时钟在同一天显示相同的时间两次。在这些情况下,显示在本地时钟(或存储在Python datetime实例中)的信息不足以识别时间上的特定时刻。

PEP 495 将新的 fold 属性添加到 datetime.datetimedatetime.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)而不是字节来执行。但是,在某些情况下,使用字节是足够和正确的。

在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字符,并将正确读取的str对象提供给Python代码。 sys.stdinsys.stdoutsys.stderr 现在默认为utf-8编码。

此更改仅适用于使用交互式控制台时,而不适用于重定向文件或管道时。要恢复到交互式控制台使用的先前行为,请设置 PYTHONLEGACYWINDOWSIOENCODING

参见

PEP 528 - 将Windows控制台编码更改为UTF-8

PEP由Steve Dower编写和实施。

PEP 520:保留类属性定义顺序

类定义体中的属性具有自然排序:名称在源中出现的顺序相同。此顺序现在保留在新类的 __dict__ 属性中。

此外,有效的默认类 execution 命名空间(从 type.__prepare__() 返回)现在是插入顺序保留映射。

参见

PEP 520 - 保留类属性定义顺序

PEP由Eric Snow编写和实施。

PEP 468:保留关键字参数顺序

函数签名中的 **kwargs 现在保证是保持插入顺序的映射。

参见

PEP 468 - 保留关键字参数顺序

PEP由Eric Snow编写和实施。

命令 实施

命令 类型现在使用“紧凑”表示 由PyPy开拓。新的 dict() 的内存使用率比Python 3.5小20%到25%。

这个新实现的顺序保留方面被认为是实现细节,并且不应依赖(这可能在未来改变,但是希望在改变语言规范之前在用于少数版本的语言中具有这种新的dict实现为所有当前和未来的Python实现指定保持顺序的语义;这也有助于保持与旧版本的语言的向后兼容性,其中随机迭代顺序仍然有效,例如Python 3.5)。

(供稿:INADA Naoki在 issue 27350。Idea 最初由Raymond Hettinger建议。)

PEP 523:向CPython添加框架求值API

虽然Python提供了广泛的支持来自定义代码的执行方式,但是还没有在框架对象的评估中这样做。如果你想要一些方法来拦截Python中的框架评估,没有任何方式没有直接操作函数指针的定义函数。

PEP 523 通过提供一个API使框架评估在C级别可插拔来改变这一点。这将允许诸如调试器和JIT之类的工具在Python代码开始执行之前拦截帧评估。这使得可以使用Python代码的替代评估实现,跟踪框架评估等。

此API不是受限C API的一部分,并且标记为专用,以表示预期此API的使用将受到限制,并且仅适用于非常精选的低级用例。 API的语义将根据需要随Python改变。

参见

PEP 523 - 将帧评估API添加到CPython

PEP由Brett Cannon和Dino Viehland编写。

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())域的分配器函数时,检查 GIL 是否保持。

检查GIL是否持有也是Python 3.6的一个新功能。

请参阅Python内存分配器上的调试挂钩的 PyMem_SetupDebugHooks() 函数。

现在也可以强制使用C库的 malloc() 分配器来使用 PYTHONMALLOC=malloc 进行所有Python内存分配。这在使用外部内存调试器(如Valgrind)在编译为释放模式的Python时很有用。

出错时,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在 issue 26516issue 26564。)

DTrace和SystemTap探测支持

Python现在可以构建 --with-dtrace,它为解释器中的以下事件启用静态标记:

  • 函数调用/返回

  • 垃圾收集开始/完成

  • 代码行执行。

这可用于在生产环境中运行解释器,而无需重新编译特定的调试版本或提供特定于应用程序的性能调试/调试代码。

更多细节在 使用DTrace和SystemTap测试CPython

当前的实现在Linux和macOS上测试。可以在将来添加额外的标记。

(由ŁukaszLanga在 issue 21590 中提供,基于JesúsCeaAvión,David Malcolm和Nikhil Benesch的补丁。)

其他语言变化

对核心Python语言所做的一些较小的更改是:

  • globalnonlocal 语句现在必须在首次使用受影响的名称之前在同一范围内文本显示。以前这是一个 SyntaxWarning

  • 现在可以将 特殊方法 设置为 None 以指示相应的操作不可用。例如,如果一个类将 __iter__() 设置为 None,则该类不是可迭代的。 (供稿人:Andrew Barnert和Ivan Levkivskyi,issue 25958。)

  • 长重复回溯线序列现在缩写为 "[Previous line repeated {count} more times]" (例如参见 追溯)。 (由 issue 26823 的Emanuel Barry提供)

  • 导入现在在无法找到模块时引发新的异常 ModuleNotFoundErrorImportError 的子类)。当前检查ImportError的代码(在try-except中)仍然可以工作。 (由Eric Snow提供,在 issue 15767。)

  • 依赖于零参数 super() 的类方法现在将在类创建期间从元类方法调用时正确工作。 (供稿人:Martin Teichmann在 issue 23722。)

新模块

秘密

新的 secrets 模块的主要目的是提供一种明显的方式来可靠地生成适于管理秘密的密码强的伪随机值,诸如帐户认证,令牌等。

警告

注意,random 模块中的伪随机生成器应该 NOT 用于安全目的。在Python 3.6+上使用 secrets,在Python 3.5和更早版本上使用 os.urandom()

参见

PEP 506 - 添加一个秘密模块到标准库

PEP由Steven D’Aprano编写和实施。

改进模块

数组

array.array 的穷尽迭代器现在将保持耗尽,即使迭代数组扩展。这与其他可变序列的行为一致。

供稿人:Serhiy Storchaka在 issue 26492

ast

添加了新的 ast.Constant AST节点。它可以被外部AST优化器用于恒定折叠的目的。

供稿人:Victor Stinner在 issue 26146

asyncio

从Python 3.6开始,asyncio 模块不再是临时的,它的API被认为是稳定的。

自从Python 3.5.0以来,asyncio 模块中的显着变化(由于临时状态,所有变化都反映到3.5.x):

  • get_event_loop() 函数已更改为始终返回当前从couroutines和回调调用时正在运行的循环。 (供稿人:Yury Selivanov,issue 28613。)

  • ensure_future() 功能和使用它的所有功能,例如 loop.run_until_complete(),现在接受各种 等待对象。 (供稿:Yury Selivanov。)

  • 新的 run_coroutine_threadsafe() 函数向其他线程的事件循环提交协同程序。 (由Vincent Michel提供)

  • 新的 Transport.is_closing() 方法来检查运输是关闭还是关闭。 (供稿:Yury Selivanov。)

  • loop.create_server() 方法现在可以接受主机列表。 (供稿人:Yann Sionneau。)

  • 新的 loop.create_future() 方法来创建Future对象。这允许可选的事件循环实现(例如 uvloop)提供更快的 asyncio.Future 实现。 (供稿人:Yury Selivanov,issue 27041。)

  • 新的 loop.get_exception_handler() 方法来获取当前的异常处理程序。 (供稿人:Yury Selivanov,issue 27040。)

  • 新的 StreamReader.readuntil() 方法从流中读取数据,直到出现分隔符字节序列。 (供稿:Mark Korenberg。)

  • StreamReader.readexactly() 的性能得到了提高。 (供稿人:Mark Korenberg,issue 28370。)

  • loop.getaddrinfo() 方法被优化以避免在地址已经解决的情况下调用系统 getaddrinfo 功能。 (由A. Jesse Jiryu Davis提供)

  • loop.stop() 方法已更改为在当前迭代后立即停止循环。作为最后一次迭代的结果而调度的任何新回调将被丢弃。 (供稿人:Guido van Rossum,issue 25593。)

  • Future.set_exception 将在传递 StopIteration 异常的实例时引发 TypeError。 (由 issue 26221 的Chris Angelico提供)

  • 新的 loop.connect_accepted_socket() 方法由服务器使用,接受asyncio之外的连接,但使用asyncio来处理它们。 (供稿人:Jim Fulton,issue 27392。)

  • 默认情况下,所有TCP传输都设置了 TCP_NODELAY 标志。 (供稿人:Yury Selivanov在 issue 27456。)

  • 新的 loop.shutdown_asyncgens() 在关闭循环之前正确关闭挂起的异步发生器。 (供稿人:Yury Selivanov,issue 28003。)

  • FutureTask 类现在有一个优化的C实现,使异步代码高达30%的速度更快。 (供稿:Yury Selivanov和INADA Naoki在 issue 26081issue 28544。)

binascii

b2a_base64() 函数现在接受可选的 newline 关键字参数,以控制是否将换行符附加到返回值。 (由Victor Stinner在 issue 25357 提供。)

cmath

添加了新的 cmath.tau (τ)常数。 (供稿人:Lisa Roach,issue 12345,详情请参阅 PEP 628。)

新常数:cmath.infcmath.nan 匹配 math.infmath.nan,以及 cmath.infjcmath.nanj 匹配复杂repr使用的格式。 (供稿人:Mark Dickinson,issue 23229。)

集合

添加了新的 Collection 抽象基类来表示大小可迭代的容器类。 (供稿人:Ivan Levkivskyi,由 issue 27598 的Neil Girdhar编写)

新的 Reversible 抽象基类代表也提供 __reversed__() 方法的可迭代类。 (供稿人:Ivan Levkivskyi,issue 25987。)

新的 AsyncGenerator 抽象基类表示异步生成器。 (供稿人:Yury Selivanov,issue 28720。)

namedtuple() 函数现在接受可选的关键字参数 module,当指定时,该参数用于返回的名为tuple类的 __module__ 属性。 (供稿人:Raymond Hettinger,issue 17941。)

namedtuple()verboserename 参数现在是仅限关键字。 (供稿人:Raymond Hettinger,issue 25628。)

递归 collections.deque 实例现在可以进行酸洗。 (供稿人:Serhiy Storchaka,issue 26482。)

concurrent.futures

ThreadPoolExecutor 类构造函数现在接受可选的 thread_name_prefix 参数,以便可以自定义池创建的线程的名称。 (由Gregory P. Smith提供,issue 27664。)

contextlib

contextlib.AbstractContextManager 类已添加为上下文管理器提供一个抽象基类。它为 __enter__() 提供了一个明智的默认实现,它返回 self 并留下 __exit__() 一个抽象方法。一个匹配类已经作为 typing.ContextManager 添加到 typing 模块中。 (供稿人:Brett Cannon,issue 25609。)

约会时间

datetimetime 类具有新的 fold 属性,用于在必要时消除本地时间的歧义。 datetime 中的许多功能已经更新,以支持本地时间消歧。有关详细信息,请参阅 本地时间消歧 部分。 (由Alexander Belopolsky提供,issue 24773。)

datetime.strftime()date.strftime() 方法现在支持ISO 8601日期指令 %G%u%V。 (供稿人:Ashley Anderson,issue 12006。)

datetime.isoformat() 函数现在接受可选的 timespec 参数,该参数指定要包括的时间值的附加组件的数量。 (供稿人:Alessandro Cucci和Alexander Belopolsky,issue 19475。)

datetime.combine() 现在接受可选的 tzinfo 参数。 (由Alexander Belopolsky提供,在 issue 27661。)

十进制

新的 Decimal.as_integer_ratio() 方法返回一对 (n, d) 的整数,它们代表给定的 Decimal 实例作为一个分数,最低的和正分母:

>>> Decimal('-3.14').as_integer_ratio()
(-157, 50)

(供稿人:Stefan Krah和Mark Dickinson在 issue 25928

distutils

default_format 属性已从 distutils.command.sdist.sdist 中删除,formats 属性默认为 ['gztar']。虽然没有预料到,但是可能需要修改依赖于 default_format 的存在的任何代码。有关详细信息,请参阅 issue 27819

电子邮件

通过 policy 关键字为各种构造函数启用的新电子邮件API不再是临时的。 email 文档已重新组织和重写,专注于新API,同时保留旧版API的旧文档。 (由R.David Murray提供,issue 24277。)

email.mime 类现在都接受可选的 policy 关键字。 (由Berker Peksag提供,issue 27331。)

DecodedGenerator 现在支持 policy 关键字。

有一个新的 policy 属性 message_factory,当解析器创建新的消息对象时,它控制默认使用哪个类。对于 email.policy.compat32 策略,这是 Message,对于新策略,它是 EmailMessage。 (由R. David Murray提供,issue 20476。)

编码

在Windows上,添加了使用 CP_OEMCP'oem' 编码,以及使用 CP_ACP 代码页的现有 'mbcs' 编码的 'ansi' 别名。 (由Steve Dower在 issue 27959 提供。)

枚举

enum 模块中添加了两个新的枚举基类:FlagIntFlags。两者都用于定义可以使用按位运算符组合的常量。 (由Ethan Furman撰写,issue 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在 issue 23848 提供。)

fileinput

hook_encoded() 现在支持 errors 参数。 (供稿人:Joseph Hackman在 issue 25788。)

hashlib

hashlib 支持OpenSSL 1.1.0。最低推荐版本为1.0.2。 (由Christian Heimes提供,issue 26470。)

BLAKE2散列函数添加到模块中。 blake2b()blake2s() 始终可用,并支持BLAKE2的完整功能集。 (由Christian Heimes在 issue 26798 中提供,基于Dmitry Chestnykh和Samuel Neves的代码。由Dmitry Chestnykh编写的文档。

添加了SHA-3散列函数 sha3_224()sha3_256()sha3_384()sha3_512() 和SHAKE散列函数 shake_128()shake_256()。 (由Christian Heimes提供,issue 16113。Keccak代码包由Guido Bertoni,Joan Daemen,MichaëlPeeters,Gilles Van Assche和Ronny Van Keer提供)

基于密码的密钥导出函数 scrypt() 现在可用于OpenSSL 1.1.0及更高版本。 (由Christian Heimes提供,issue 27928。)

http.client

HTTPConnection.request()endheaders() 现在都支持分块编码请求主体。 (供稿人:Demian Brecht和Rolf Krahl在 issue 12319。)

idlelib和IDLE

idlelib包正在进行现代化和重构,使IDLE看起来更好,工作更好,使代码更容易理解,测试和改进。使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在 issue 24225 中提供的名称更改。大多数idlelib修补程序已经并将成为过程的一部分。)

在补偿中,最终的结果是一些idlelib类将更容易使用,更好的API和docstrings解释它们。其他有用的信息将被添加到idlelib(如果可用)。

importlib

导入现在在无法找到模块时引发新的异常 ModuleNotFoundErrorImportError 的子类)。当前检查 ImportError 的代码(在try-except中)仍然可以工作。 (由Eric Snow提供,issue 15767。)

importlib.util.LazyLoader 现在在包装的加载器上调用 create_module(),消除了 importlib.machinery.BuiltinImporterimportlib.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,issue 19611。)

为了减少从Python 2.7和旧版 inspect.getargspec() API升级时的代码流失,以前记录的对 inspect.getfullargspec() 的弃用被逆转了。虽然此功能对单/源Python 2/3代码库很方便,但是更加丰富的 inspect.signature() 接口仍然是新代码的推荐方法。 (供稿人:Nick Coghlan,issue 27172

json

json.load()json.loads() 现在支持二进制输入。编码JSON应使用UTF-8,UTF-16或UTF-32表示。 (供稿人:Serhiy Storchaka,issue 17909。)

日志

添加了新的 WatchedFileHandler.reopenIfNeeded() 方法以添加检查日志文件是否需要重新打开的功能。 (供稿人:Marian Horban,issue 24884。)

数学

tau(τ)常数已添加到 mathcmath 模块中。 (供稿:issue 12345 的Lisa Roach,详见 PEP 628。)

多处理

multiprocessing.Manager() 返回的 代理对象 现在可以嵌套。 (供稿人:Davin Potts,issue 6766。)

os

有关 osos.path 模块现在如何支持 路径样对象 的详细信息,请参阅 PEP 519 的摘要。

scandir() 现在支持Windows上的 bytes 路径。

一个新的 close() 方法允许显式关闭一个 scandir() 迭代器。 scandir() 迭代器现在支持 context manager 协议。如果一个 scandir() 迭代器既没有耗尽也没有被明确关闭,ResourceWarning 将在其析构函数中被释放。 (供稿人:Serhiy Storchaka,issue 25994。)

在Linux上,os.urandom() 现在阻塞,直到系统urandom熵池被初始化以增加安全性。参见 PEP 524 的理由。

Linux getrandom() 系统调用(获取随机字节)现在显示为新的 os.getrandom() 函数。 (由Victor Stinner撰稿,PEP 524 的一部分)

pathlib

pathlib 现在支持 路径样对象。 (由Brett Cannon在 issue 27186 提供。)

有关详细信息,请参阅 PEP 519 的摘要。

pdb

Pdb 类构造函数具有新的可选 readrc 参数,以控制是否应读取 .pdbrc 文件。

泡菜

需要使用关键字参数调用的 __new__ 的对象现在可以使用比协议版本4更早的 pickle协议 进行选择。协议版本4已经支持这种情况。 (由Serhiy Storchaka提供,issue 24164。)

pickletools

pickletools.dis() 现在输出 MEMOIZE 操作码的隐式备忘录索引。 (供稿人:Serhiy Storchaka,issue 25382。)

pydoc

pydoc 模块已经学会尊重 MANPAGER 环境变量。 (由 issue 8637 的Matthias Klose提供)

help()pydoc 现在可以按照定义的顺序列出命名的元组字段,而不是按字母顺序排列。 (由 issue 24879 的Raymond Hettinger提供)

随机

新的 choices() 函数返回具有可选权重的给定总体的指定大小的元素的列表。 (供稿人:Raymond Hettinger,issue 18844。)

回覆

在正则表达式中添加了修饰符跨度的支持。示例:'(?i:p)ython' 匹配 'python''Python',但不匹配 'PYTHON''(?i)g(?-i:v)r' 匹配 'GvR''gvr',但不匹配 'GVR'。 (供稿人:Serhiy Storchaka,issue 433028。)

匹配对象组可以由 __getitem__ 访问,__getitem__ 等效于 group()。所以 mo['name'] 现在相当于 mo.group('name')。 (由 issue 24454 的Eric Smith提供。)

Match 对象现在支持 index-like objects 作为组索引。 (由Jeroen Demeyer和Xiang Zhang在 issue 27177 提供。)

readline

添加了 set_auto_history() 以启用或禁用将输入自动添加到历史记录列表。 (供稿人:Tyler Crompton在 issue 26870。)

rlcompleter

现在省略私有和特殊属性名称,除非前缀以下划线开头。在一些完成的关键字后添加空格或冒号。 (供稿人:Serhiy Storchaka,issue 25011issue 25209。)

shlex

shlex 有许多 改善壳兼容性 通过新的 punctuation_chars 参数来控制哪些字符被当作标点符号。 (供稿人:Vinay Sajip,issue 1521950。)

现场

当在 .pth 文件中指定要添加到 sys.path 的路径时,您现在可以在目录(例如zip文件)上指定文件路径。 (由Wolfgang Langner在 issue 26587 提供)。

sqlite3

sqlite3.Cursor.lastrowid 现在支持 REPLACE 语句。 (供稿人:Alex LordThorsen在 issue 16864。)

插座

ioctl() 功能现在支持 SIO_LOOPBACK_FAST_PATH 控制代码。 (由Daniel Stokes提供,issue 26536。)

现在支持 getsockopt() 常数 SO_DOMAINSO_PROTOCOLSO_PEERSECSO_PASSSEC。 (由Christian Heimes提供,issue 26907。)

setsockopt() 现在支持 setsockopt(level, optname, None, optlen: int) 表单。 (由Christian Heimes提供,issue 27744。)

插座模块现在支持地址系列 AF_ALG 与Linux Kernel crypto API接口。 ALG_*SOL_ALGsendmsg_afalg()。 (由Christian Heimes在 issue 27744 提供,在Victor Stinner的支持下)

socketserver

基于 socketserver 模块的服务器,包括在 http.serverxmlrpc.serverwsgiref.simple_server 中定义的服务器,现在支持 context manager 协议。 (由Aviv Palivoda提供,issue 26404。)

StreamRequestHandler 类的 wfile 属性现在实现了 io.BufferedIOBase 可写接口。特别地,调用 write() 现在保证完全发送数据。 (由 issue 26721 的Martin Panter提供。)

ssl

ssl 支持OpenSSL 1.1.0。最低推荐版本为1.0.2。 (由Christian Heimes提供,issue 26470。)

3DES已从默认密码套件中删除,并添加了ChaCha20 Poly1305密码套件。 (由Christian Heimes提供,issue 27850issue 27766。)

SSLContext 有更好的默认配置选项和密码。 (由Christian Heimes提供,issue 28043。)

SSL会话可以使用新的 SSLSession 类从一个客户端连接复制到另一个客户端连接。 TLS会话恢复可以加速初始握手,减少延迟并提高性能(由Christian Heimes在 issue 19500 中基于Alex Warhawk的草案提供。)

新的 get_ciphers() 方法可以用于按照加密优先级的顺序获得启用的密码的列表。

所有常量和标志已转换为 IntEnumIntFlags。 (由Christian Heimes提供,issue 28025。)

添加了 SSLContext 的服务器端和客户端特定的TLS协议。 (由Christian Heimes提供,issue 28085。)

统计

添加了新的 harmonic_mean() 功能。 (供稿人:Steven D’Aprano,issue 27181。)

结构

struct 现在通过 'e' 格式说明符支持IEEE 754半精度浮点。 (供稿人:Eli Stevens,Mark Dickinson在 issue 11734。)

子过程

如果子进程仍在运行,subprocess.Popen 析构函数现在会发出 ResourceWarning 警告。使用上下文管理器协议(with proc: ...)或显式调用 wait() 方法来读取子进程的退出状态。 (供稿人:Victor Stinner,issue 26741。)

subprocess.Popen 构造函数和所有传递参数的函数现在接受 encodingerrors 参数。指定其中任何一个将启用 stdinstdoutstderr 流的文本模式。 (供稿人:Steve Dower,issue 6135。)

sys

新的 getfilesystemencodeerrors() 函数返回用于在Unicode文件名和字节文件名之间转换的错误模式的名称。 (由Steve Dower撰写,issue 27781。)

在Windows上,getwindowsversion() 函数的返回值现在包括 platform_version 字段,其中包含当前操作系统的准确主版本,次版本和内部版本号,而不是为该进程仿真的版本(由 issue 27932 中的Steve Dower提供。)

telnetlib

Telnet 现在是一个上下文管理器(由 issue 25485 中的StéphaneWirtel贡献)。

时间

struct_time 属性 tm_gmtofftm_zone 现在可在所有平台上使用。

timeit

添加了新的 Timer.autorange() 方便方法以重复调用 Timer.timeit(),以便总运行时间大于或等于200毫秒。 (供稿人:issue 6422 的Steven D’Aprano。)

timeit 现在警告当最佳和最差时间之间存在大量(4x)方差时。 (由Serhiy Storchaka撰写,issue 23552。)

tkinter

tkinter.Variable 类中添加了 trace_add()trace_remove()trace_info() 方法。它们替换使用过时的Tcl命令的旧方法 trace_variable()trace()trace_vdelete()trace_vinfo(),并且可能不会在未来版本的Tcl中工作。 (由Serhiy Storchaka在 issue 22115 提供)。

追溯

traceback模块和解释器内置的异常显示现在缩写了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

(由 issue 26823 的Emanuel Barry提供)

tracemalloc

tracemalloc 模块现在支持在多个不同的地址空间中跟踪内存分配。

新的 DomainFilter 滤波器类已通过其地址空间(域)添加到过滤块轨迹。

(由Victor Stinner在 issue 26588 提供。)

打字

从Python 3.6开始,typing 模块不再是临时的,它的API被认为是稳定的。

由于 typing 模块在Python 3.5中是 临时,因此在Python 3.6中引入的所有更改也都被反向运行到Python 3.5.x.

typing 模块对通用类型别名有了大大改进的支持。例如,Dict[str, Tuple[S, T]] 现在是一个有效的类型注释。 (供稿人:Guido van Rossum,Github #195。)

已添加 typing.ContextManager 类以表示 contextlib.AbstractContextManager。 (由Brett Cannon在 issue 25609 提供。)

已添加 typing.Collection 类以表示 collections.abc.Collection。 (供稿人:Ivan Levkivskyi,issue 27598。)

已添加 typing.ClassVar 类型构造以标记类变量。如 PEP 526 中所介绍的,包装在ClassVar中的变量注释表示给定属性旨在用作类变量,并且不应在该类的实例上设置。 (供稿人:Ivan Levkivskyi,Github #280。)

一个新的 TYPE_CHECKING 常量,由静态类型检查器假定为 True,但在运行时是 False。 (供稿人:Guido van Rossum,Github #230。)

添加了一个新的 NewType() 助手函数,为注释创建轻量级的不同类型:

from typing import NewType

UserId = NewType('UserId', int)
some_id = UserId(524313)

静态类型检查器将把新类型视为原始类型的子类。 (供稿人:Ivan Levkivskyi,Github #189。)

unicodedata

unicodedata 模块现在使用来自 Unicode 9.0.0 的数据。 (由Benjamin Peterson提供)

unittest.mock

Mock 类有以下改进:

urllib.request

如果HTTP请求有一个文件或可迭代主体(除了字节对象),但没有 Content-Length 头,而不是抛出一个错误,AbstractHTTPHandler 现在回退使用分块传输编码。 (由Demian Brecht和Rolf Krahl在 issue 12319 中提供。)

urllib.robotparser

RobotFileParser 现在支持 Crawl-delayRequest-rate 扩展。 (供稿人:Nikolay Bogoychev,issue 16099。)

venv

venv 接受一个新的参数 --prompt。此参数提供虚拟环境的备用前缀。 (由ŁukaszBalcerzak提议,由 issue 22829 的StéphaneAirtel移植到3.6)

警告

一个新的可选 source 参数已添加到 warnings.warn_explicit() 函数中:已销毁的 ResourceWarning 对象。 source 属性也已添加到 warnings.WarningMessage 中(由Victor Stinner在 issue 26568issue 26567 中提供)。

当记录 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 模块已经导入时才会显示。

winreg

添加了64位整数类型 REG_QWORD。 (供稿人:Clement Rouault,issue 23026。)

winsound

允许的关键字参数传递到 BeepMessageBeepPlaySoundissue 27982)。

xmlrpc.client

xmlrpc.client 模块现在支持解压缩由Apache XML-RPC实现用于数字和 None 的附加数据类型。 (由Serhiy Storchaka提供,issue 26885。)

zip文件

新的 ZipInfo.from_file() 类方法允许从文件系统文件中创建 ZipInfo 实例。可以使用新的 ZipInfo.is_dir() 方法来检查 ZipInfo 实例是否表示目录。 (供稿人:issue 26039 的Thomas Kluyver。)

ZipFile.open() 方法现在可以用于将数据写入ZIP文件,以及用于提取数据。 (供稿人:Thomas Kluyver,issue 26039。)

zlib

compress()decompress() 函数现在接受关键字参数。 (分别由 issue 26243 的Aviv Palivoda和 issue 16764 的Xiang Zhang提供)

优化

  • Python解释器现在使用16位字节码而不是字节码,这使得许多操作码优化成为可能。 (由Demur Rumed提供,由Serhiy Storchaka和Victor Stinner在 issue 26647issue 28050 中提供的意见和评论。)

  • asyncio.Future 类现在具有优化的C实现。 (供稿:Yury Selivanov和INADA Naoki在 issue 26081。)

  • asyncio.Task 类现在具有优化的C实现。 (供稿人:Yury Selivanov,issue 28544。)

  • typing 模块中的各种实现改进(例如对通用类型的缓存)允许高达30倍的性能改进和减少的内存占用。

  • 对于错误处理程序 surrogateescapeignorereplace,ASCII解码器的速度提高了60倍(由Victor Stinner在 issue 24870 中提供)。

  • 对于错误处理程序 surrogateescape,ASCII和Latin1编码器的速度提高了3倍(由Victor Stinner在 issue 25227 提供)。

  • UTF-8编码器现在的错误处理器 ignorereplacesurrogateescapesurrogatepass 的速度提高了75倍(由Victor Stinner在 issue 25267 提供)。

  • 现在UTF-8解码器的错误处理程序 ignorereplacesurrogateescape 的速度提高了15倍(由Victor Stinner在 issue 25301 提供)。

  • bytes % args 现在的速度提高了2倍。 (由Victor Stinner在 issue 25349 提供)。

  • bytearray % args 现在是2.5和5倍之间。 (由Victor Stinner在 issue 25399 提供)。

  • 优化 bytes.fromhex()bytearray.fromhex():它们现在在2倍和3.5倍之间更快。 (由Victor Stinner在 issue 25401 提供)。

  • 优化 bytes.replace(b'', b'.')bytearray.replace(b'', b'.'):速度提高80%。 (由 issue 26574 的Josh Snider提供)。

  • PyMem_Malloc() 域(PYMEM_DOMAIN_MEM)的分配器功能现在使用 pymalloc内存分配器 而不是C库的 malloc() 功能。 pymalloc分配器针对小于或等于512字节的对象进行优化,使用寿命短,对于较大的内存块使用 malloc()。 (由Victor Stinner在 issue 26249 提供)。

  • 当反序列化很多小对象时,pickle.load()pickle.loads() 现在的速度提高了10%(由Victor Stinner在 issue 27056 提供)。

  • 关键字参数 传递给函数与传递 位置参数 相比具有开销。现在在使用Argument Clinic实现的扩展功能中,这种开销显着降低。 (由Serhiy Storchaka在 issue 27574 提供)。

  • glob 模块中优化的 glob()iglob() 功能;他们现在是大约3–6倍更快。 (供稿人:Serhiy Storchaka,issue 25596)。

  • 使用 os.scandir() 优化 pathlib 中的globbing;它现在是大约1.5–4倍快。 (由Serhiy Storchaka在 issue 26032 提供)。

  • xml.etree.ElementTree 解析,迭代和deepcopy性能得到显着提高。 (供稿人:Serhiy Storchaka,issue 25638issue 25873issue 25869。)

  • 从浮点和小数创建 fractions.Fraction 实例现在是2到3倍更快。 (供稿人:Serhiy Storchaka,issue 25971。)

构建和C API更改

其他改进

  • 当提供两次 --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)]
    

已弃用

新关键字

asyncawait 不推荐用作变量,类,函数或模块名称。由 PEP 492 在Python 3.5中引入,它们将成为Python 3.7中的正确关键字。从Python 3.6开始,使用 asyncawait 作为名称将生成 DeprecationWarning

已弃用的Python行为

在生成器中提高 StopIteration 异常现在将生成 DeprecationWarning,并将在Python 3.7中触发 RuntimeError。详情请参阅 PEP 479:更改发电机内的StopIteration处理

__aiter__() 方法现在期望直接返回异步迭代器,而不是像以前一样返回等待。做前者会触发 DeprecationWarning。向后兼容性将在Python 3.7中删除。 (供稿人:Yury Selivanov in issue 27243。)

不是有效转义序列的反斜杠字符对现在生成 DeprecationWarning。虽然这将最终成为一个 SyntaxError,这不会是几个Python版本。 (由 issue 27364 的Emanuel Barry提供)

当执行相对导入时,在未定义 __spec____package__ 时从调用模块回退 __name____path__ 现在提高 ImportWarning。 (由 issue 25791 的Rose Ames提供)

已弃用的Python模块,函数和方法

asynchat

asynchat 已被弃用,赞成 asyncio。 (由 issue 25002 的Mariatta提供)

asyncore

asyncore 已被弃用,赞成 asyncio。 (由 issue 25002 的Mariatta提供)

dbm

与其他 dbm 实现不同,dbm.dumb 模块使用 'rw' 模式创建数据库,并允许修改使用 'r' 模式打开的数据库。此行为现已弃用,将在3.8中移除。 (供稿人:Serhiy Storchaka,issue 21708。)

distutils

Distribution 构造函数的未记录的 extra_path 参数现在被视为已弃用,如果设置,将会引发警告。对此参数的支持将在未来的Python版本中删除。有关详细信息,请参阅 issue 27919

grp

getgrgid() 中非整数参数的支持已被弃用。 (供稿人:Serhiy Storchaka,issue 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开始,它仍然默认添加到 sys.meta_path (在Windows上),但在将来的版本中可能会更改。

os

os 功能,compile() 和类似功能中的通用 字节状对象 作为路径的未记录的支持现在已被废弃。 (供稿人:Serhiy Storchaka,issue 25791issue 26754。)

回覆

支持内联标记正则表达式中间的 (?letters) 已被弃用,并将在未来的Python版本中删除。仍然允许在正则表达式开头的标志。 (供稿人:Serhiy Storchaka,issue 22493。)

ssl

OpenSSL 0.9.8,1.0.0和1.0.1已弃用,不再受支持。将来,ssl 模块将至少需要OpenSSL 1.0.2或1.1.0。

与AAS相关的参数,如 certfilekeyfilecheck_hostnameftplibhttp.clientimaplibpoplibsmtplib 已被弃用有利于 context。 (供稿人:Christian Heimes,issue 28022。)

ssl 模块的几个协议和功能现已废弃。某些功能将不再在OpenSSL的未来版本中可用。其他功能已弃用,但赞成使用不同的API。 (供稿人:Christian Heimes,issue 28022issue 26470。)

tkinter

tkinter.tix 模块现已弃用。 tkinter 用户应该使用 tkinter.ttk

venv

pyvenv 脚本已被弃用,赞成 python3 -m venv。这可以防止混淆什么Python解释器 pyvenv 连接,因此什么Python解释器将被虚拟环境使用。 (由Brett Cannon撰写,issue 25154。)

不再支持的C API的函数和类型

未记录的函数 PyUnicode_AsEncodedObject()PyUnicode_AsDecodedObject()PyUnicode_AsEncodedUnicode()PyUnicode_AsDecodedUnicode() 现已废弃。使用 基于通用编解码器的API

已弃用的构建选项

默认情况下,在非macOS UNIX平台上,--with-system-ffi 配置标志已启用。它可以通过使用 --without-system-ffi 禁用,但使用标志已弃用,将不接受在Python 3.7。 macOS不受此更改的影响。请注意,许多操作系统分发商在构建系统Python时已经使用 --with-system-ffi 标志。

已移除

API和功能删除

  • 在正则表达式中由 '\' 和ASCII字母组成的未知转义现在将导致错误。在 re.sub() 的替换模板中,它们仍然允许,但已被弃用。 re.LOCALE 标志现在只能用于二进制模式。

  • inspect.getmoduleinfo() 被删除(自CPython 3.3以来已弃用)。 inspect.getmodulename() 应用于获取给定路径的模块名称。 (供稿人:Yury Selivanov在 issue 13248。)

  • traceback 模块中去除 traceback.Ignore 类和 traceback.usagetraceback.modnametraceback.fullmodnametraceback.find_lines_from_codetraceback.find_linestraceback.find_stringstraceback.find_executable_lines 方法。它们是未记录的方法,因为Python 3.2和相当的功能从私有方法可用。

  • 删除 tkinter 窗口小部件类中的 tk_menuBar()tk_bindForTraversal() 哑方法(相应的Tk命令自Tk 4.0以来已过时)。

  • zipfile.ZipFile 类的 open() 方法不再支持 'U' 模式(自Python 3.4以来已被弃用)。在 universal newlines 模式下使用 io.TextIOWrapper 读取压缩文本文件。

  • 已删除未记录的 INCDROMDLFCNTYPESCDIOSTROPTS 模块。他们已经在平台特定的 Lib/plat-*/ 目录中可用,但是长期过时,在平台上不一致可用,并且未维护。创建这些模块的脚本在 Tools/scripts/h2py.py 的源分发中仍然可用。

  • 已弃用的 asynchat.fifo 类已删除。

移植到Python 3.6

本节列出了之前描述的更改和其他可能需要更改代码的错误。

‘python’命令行为的更改

  • 缺省情况下,已定义 COUNT_ALLOCSSHOW_ALLOC_COUNTSHOW_TRACK_COUNT 宏的特殊Python构建的输出已关闭。它可以使用 -X showalloccount 选项重新启用。它现在输出到 stderr 而不是 stdout。 (供稿人:Serhiy Storchaka,issue 23034。)

Python API中的更改

  • open() 将不再允许将 'U' 模式标志与 '+' 组合。 (由 issue 2091 的Jeff Balogh和John O’Connor提供。)

  • 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_linenoPyFrame_GetLineNumber()PyCode_Addr2Line() 的功能不受影响。直接解码 co_lnotab 的函数应该更新为对行号增量使用带符号的8位整数类型,但这只需要支持使用负行号增量的应用程序。参见 Objects/lnotab_notes.txtco_lnotab 格式以及如何解码,并参见 PEP 511 的理由。

  • compileall 模块中的函数现在返回布尔而不是 10,以分别表示成功或失败。由于布尔值是整数的子类,如果你对 10 进行身份检查,这只应该是一个问题。见 issue 25768

  • 读取 urllib.parse.urlsplit()urlparse() 结果的 port 属性现在会提高超出范围值的 ValueError,而不是返回 None。见 issue 20059

  • imp 模块现在提高 DeprecationWarning 而不是 PendingDeprecationWarning

  • 以下模块已经缺失添加到其 __all__ 属性中的API以匹配记录的API:calendarcgicsvElementTreeenumfileinputftplibloggingmailboxmimetypesoptparseplistlibsmtpdsubprocesstarfilethreadingwave。这意味着当使用 import * 时,它们将导出新的符号。 (供稿人:Joel Taddei和JacekKołodziej,issue 23883。)

  • 当执行相对导入时,如果 __package__ 不比较等于 __spec__.parent,则引发 ImportWarning。 (由Brett Cannon撰写,issue 25791。)

  • 当执行相对导入并且没有父包已知时,则将引发 ImportError。以前,SystemError 可以提出。 (由Brett Cannon在 issue 18018 提供。)

  • 基于 socketserver 模块的服务器,包括在 http.serverxmlrpc.serverwsgiref.simple_server 中定义的服务器,现在只捕获从 Exception 派生的异常。因此,如果请求处理程序引发异常(如 SystemExitKeyboardInterrupt),则不再调用 handle_error(),并且异常将停止单线程服务器。 (由 issue 23430 的Martin Panter提供。)

  • 如果用户没有权限,spwd.getspnam() 现在引发 PermissionError 而不是 KeyError

  • 如果底层系统调用报告错误(例如 EBADF),socket.socket.close() 方法现在会引发异常。 (由 issue 26685 中的Martin Panter提供)

  • 默认情况下,smtpd.SMTPChannelsmtpd.SMTPServer 构造函数的 decode_data 参数现在是 False。这意味着传递给 process_message() 的参数默认是一个字节对象,process_message() 将传递关键字参数。已根据3.5生成的弃用警告更新的代码不会受到影响。

  • dump()dumps()load()loads() 函数的所有可选参数以及 json 模块中的 JSONEncoderJSONDecoder 类构造函数现在都是 仅限关键字。 (供稿人:Serhiy Storchaka,issue 18726。)

  • 不覆盖 type.__new__type 的子类可能不再使用单参数形式来获取对象的类型。

  • 作为 PEP 487 的一部分,传递给 type (除了元类hint,metaclass)的关键字参数的处理现在一直委托给 object.__init_subclass__()。这意味着 type.__new__()type.__init__() 现在都接受任意关键字参数,但 object.__init_subclass__() (从 type.__new__() 调用)将默认拒绝它们。接受其他关键字参数的自定义元类将需要相应地调整他们对 type.__new__() 的调用(无论是直接调用还是通过 super 调用)。

  • distutils.command.sdist.sdist 中,default_format 属性已删除,不再受到尊重。相反,gzip压缩格式是所有平台上的默认格式,不进行平台特定的选择。在分发版基于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服务器,则Content-Length值现在必须由调用者指定。 (由Demian Brecht和Rolf Krahl提供,来自 issue 12319 的Martin Panter的调整)

  • DictReader 现在返回类型为 OrderedDict 的行。 (由 issue 27842 的Steve Holden提供)

  • 如果平台不支持,crypt.METHOD_CRYPT 将不再添加到 crypt.methods。 (由Victor Stinner在 issue 25287 提供。)

  • namedtuple()verboserename 参数现在是仅限关键字。 (供稿人:Raymond Hettinger,issue 25628。)

  • 在Linux上,ctypes.util.find_library() 现在在 LD_LIBRARY_PATH 中查找共享库。 (由Vinay Sajip提供,issue 9998。)

  • imaplib.IMAP4 类现在处理从服务器发送的消息中包含 ']' 字符的标志,以提高实际兼容性。 (由 issue 21815 中的Lita Cho提供)

  • mmap.write() 函数现在返回像其他写入方法一样写入的字节数。 (由Jakub Stasiak提供,issue 26335。)

  • pkgutil.iter_modules()pkgutil.walk_packages() 函数现在返回 ModuleInfo 命名的元组。 (由 issue 17211。的Ramchandra Apte提供)

  • re.sub() 现在会在替换模板中引发无效数字组引用的错误,即使在字符串中找不到模式也是如此。无效组引用的错误消息现在包括组索引和引用的位置。 (由SilentGhost,Serhiy Storchaka在 issue 25953 中提供。)

  • zipfile.ZipFile 现在将为无法识别的压缩值提高 NotImplementedError。以前提出了一个简单的 RuntimeError。此外,在关闭的ZipFile上调用 ZipFile 方法或在使用模式 'r' 创建的ZipFile上调用 write() 方法将产生 ValueError。以前,在这些情景中提出了 RuntimeError

  • 当自定义元类与零参数 super() 或从方法到隐式 __class__ 关闭变量的直接引用组合时,隐式 __classcell__ 命名空间条目现在必须传递到 type.__new__ 以进行初始化。如果不这样做,将导致 DeprecationWarning 在3.6和 RuntimeWarning 在未来。

C API中的更改

CPython字节码更改

Python 3.6中的 bytecode 有了一些重大的变化。