Python 3.6 新增Function

本文介绍了 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 实现的改进:

标准库中的重大改进:

Security improvements:

  • 添加了新的secrets模块,以简化适用于 Management 机密(例如帐户身份验证,令牌等)的强密码伪随机数的生成。

  • 在 Linux 上,os.urandom()现在会阻塞,直到初始化系统 urandom 熵池以提高安全性为止。原理请参见 PEP 524

  • hashlibssl模块现在支持 OpenSSL 1.1.0.

  • ssl模块的默认设置和Function集已得到改进。

  • hashlib模块获得了对 BLAKE2,SHA-3 和 SHAKE 哈希算法以及scrypt()密钥派生Function的支持。

Windows improvements:

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

  • 当用户未指定版本(pass命令行参数或配置文件)时,py.exe启动器在交互使用时不再喜欢 Python 2,而不是 Python 3. shebang 行的处理保持不变-在这种情况下,“ python”是指 Python 2.

  • python.exepythonw.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 编写和实施。

Feature documentation.

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 526 –变量 Comments 的语法。

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

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

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 实现的一个显着限制是,不可能在同一函数体中使用awaityield。在 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 编写和实施。

Feature documentation

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 编写和实施。

Feature documentation

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

文件系统路径历来被表示为strbytes对象。这就导致人们编写在文件系统路径上操作的代码,以为此类对象只是这两种类型之一(代表文件 Descriptors 的int并不算作不是文件路径)。不幸的是,这种假设阻止了文件系统路径(如pathlib)的替代对象表示形式与包括 Python 标准库在内的现有代码一起使用。

为了解决这种情况,已定义了一个由os.PathLike表示的新接口。pass实现fspath()方法,对象发出 signal 表示它代表路径。然后,对象可以将文件系统路径的低级表示形式表示为strbytes对象。这意味着,如果对象实现os.PathLike或是表示文件系统路径的strbytes对象,则该对象被视为path-like。代码可以使用os.fspath()os.fsdecode()os.fsencode()来显式获取路径类对象的str和/或bytes表示形式。

内置的open()函数已更新为可以接受os.PathLike对象,osos.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.datetimedatetime.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.stdinsys.stdoutsys.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 内存分配器上安装调试钩子。调试钩子的影响:

检查是否保留了 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-26516bpo-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 语言进行的一些较小更改是:

  • 现在,必须在同一范围内首次使用受影响的名称之前,以文本形式出现globalnonlocal语句。以前这是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):

binascii

b2a_base64()函数现在接受一个可选的* newline *关键字参数,以控制是否将换行符附加到返回值上。 (由 Victor Stinner 在bpo-25357中贡献。)

cmath

新的cmath.tau(τ)常量已添加。 (由 Lisa Roach 在bpo-12345中贡献,有关详细信息,请参见 PEP 628。)

新常数:cmath.infcmath.nan匹配math.infmath.nan,以及cmath.infjcmath.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

datetimetime类具有新的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

email

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:FlagIntFlags。两者都用于定义可以使用按位运算符组合的常数。 (由 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-33642bpo-33768bpo-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.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

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(τ)常量已添加到mathcmath模块。 (由 Lisa Roach 在bpo-12345中贡献,有关详细信息,请参见 PEP 628。)

multiprocessing

multiprocessing.Manager()返回的Proxy Objects现在可以嵌套。 (由bpo-6766中的 Davin Potts 贡献。)

os

有关osos.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-25011bpo-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_DOMAINSO_PROTOCOLSO_PEERSECSO_PASSSEC。 (由 Christian Heimes 在bpo-26907中贡献。)

setsockopt()现在支持setsockopt(level, optname, None, optlen: int)表单。 (由 Christian Heimes 在bpo-27744中贡献。)

套接字模块现在支持地址系列AF_ALG以便与 Linux 内核加密 API 进行接口。添加了ALG_*SOL_ALGsendmsg_afalg()。 (由 Chris Heimes 在bpo-27744中贡献,并得到了 Victor Stinner 的支持。)

添加了新的 Linux 常量TCP_USER_TIMEOUTTCP_CONGESTION。 (由 Omar Sandoval 提供,版本:26273)。

socketserver

现在,基于socketserver模块的服务器(包括在http.serverxmlrpc.serverwsgiref.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-27850bpo-27766中贡献。)

SSLContext为选项和密码提供了更好的默认配置。 (由 Christian Heimes 在bpo-28043中贡献。)

可以使用新的SSLSession类将 SSL 会话从一个 Client 端连接复制到另一个 Client 端连接。 TLS 会话恢复可以加快初始握手,减少延迟并提高性能(由 Chris_Heimes 在bpo-19500中根据 Alex Warhawk 的草稿提供。)

可以使用新的get_ciphers()方法按密码优先级的 Sequences 获取已启用密码的列表。

所有常量和标志都已转换为IntEnumIntFlags。 (由 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_gmtofftm_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类具有以下改进:

urllib.request

如果 HTTP 请求具有文件或可迭代主体(不是字节对象),但没有Content-LengthHeaders,而不是抛出错误,则AbstractHTTPHandler现在回退以使用分块传输编码。 (由 Demian Brecht 和 Rolf Krahl 在bpo-12319中贡献。)

urllib.robotparser

RobotFileParser现在支持Crawl-delayRequest-rateextensions。 (由 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-26568bpo-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

允许将关键字参数传递给BeepMessageBeepPlaySound(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-26647bpo-28050中提供了意见和建议。)

  • 现在,asyncio.Future类具有优化的 C 实现。 (由 Yury Selivanov 和 INADA Naoki 在bpo-26081中贡献。)

  • 现在,asyncio.Task类具有优化的 C 实现。 (由 Yury Selivanov 在bpo-28544中贡献。)

  • typing模块中的各种实现改进(例如,通用类型的缓存)可将性能提高多达 30 倍,并减少了内存占用。

  • 现在,对于错误处理程序surrogateescapeignorereplace,ASCII 解码器的速度高达 60 倍(由 Victor Stinner 在bpo-24870中贡献)。

  • 现在,错误处理程序surrogateescape的 ASCII 和 Latin1 编码器的速度高达 3 倍(由 Victor_ Stinner 在bpo-25227中贡献)。

  • 现在,错误处理程序ignorereplacesurrogateescapesurrogatepass的 UTF-8 编码器的速度高达 75 倍(由 Victor Stinner 在bpo-25267中贡献)。

  • 对于错误处理程序ignorereplacesurrogateescape,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-25638bpo-25873bpo-25869中贡献。)

  • 现在,使用浮点数和小数创建fractions.Fraction个实例的速度提高了 2 到 3 倍。 (由 Serhiy Storchaka 在bpo-25971中贡献。)

Build 和 C API 的更改

Other Improvements

$ ./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

不建议将asyncawait用作变量,类,函数或模块的名称。在 python 3.5 中由 PEP 492引入,它们将在 python 3.7 中成为适当的关键字。从 Python 3.6 开始,使用asyncawait作为名称将生成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-25791bpo-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 相关的参数(例如ftplibhttp.clientimaplibpoplibsmtplib中的certfilekeyfilecheck_hostname)已被弃用,而推荐使用context。 (由 Chris Heimes 在bpo-28022中贡献。)

现在已弃用ssl模块的几个协议和Function。在将来的 OpenSSL 版本中将不再提供某些Function。不推荐使用其他Function,而推荐使用其他 API。 (由 Chris Heimes 在bpo-28022bpo-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.usagetraceback.modnametraceback.fullmodnametraceback.find_lines_from_codetraceback.find_linestraceback.find_stringstraceback.find_executable_lines方法。自 Python 3.2 以来,它们是未记录的方法,私有方法提供了等效Function。

  • 删除了tkinter小部件类中的tk_menuBar()tk_bindForTraversal()虚拟方法(自 Tk 4.0 起相应的 Tk 命令已过时)。

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

  • 未记录的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 在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_linenoPyFrame_GetLineNumber()PyCode_Addr2Line()的Function不受影响。应该将直接解码co_lnotab的函数更新为对行号 delta 使用带符号的 8 位整数类型,但这仅对于支持使用负行号 delta 的应用程序才需要。有关co_lnotab格式及其解码方法,请参见Objects/lnotab_notes.txt;有关基本原理,请参见 PEP 511

  • compileall模块中的函数现在分别返回布尔值而不是10来表示成功或失败。由于布尔值是整数的子类,因此只有在对10进行身份检查时,这才是问题。参见bpo-25768

  • 现在,读取urllib.parse.urlsplit()urlparse()结果的port属性会为超出范围的值引发ValueError,而不是返回None。参见bpo-20059

  • 现在,imp模块引发DeprecationWarning而不是PendingDeprecationWarning

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

  • 执行相对导入时,如果__package__不等于__spec__.parent,则引发ImportWarning。 (由 Brett Cannon 在bpo-25791中贡献。)

  • 当执行相对导入并且不知道任何父包时,将引发ImportError。以前,可以提出SystemError。 (由 Brett Cannon 在bpo-18018中贡献。)

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

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

  • 如果基础系统调用报告了错误(例如EBADF),则socket.socket.close()方法现在引发异常。 (由 Martin Panter 在bpo-26685中贡献。)

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

  • dump()dumps()load()loads()函数以及json模块中JSONEncoderJSONDecoder类构造函数的所有可选参数现在都是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 的更改

CPython 字节码更改

Python 3.6 对bytecode进行了几项重大更改。

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-22898bpo-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 贡献。)