Python 3.6 有什么新�化¶

编者:

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

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

��

PEP 494 - Python 3.6 �布计划

摘� -- �布�点¶

新的语法特性:

  • PEP 498, æ ¼å¼�化字符串字é�¢å€¼

  • PEP 515, æ•°å­—å­—é�¢å€¼ä¸­çš„下划线。

  • PEP 526 , å�˜é‡�标注语法。

  • PEP 525,异步生æˆ�器。

  • PEP 530: 异步推导å¼�。

新的库模�:

CPython 实现的改进:

标准库中的�大改进:

  • asyncio 模å�—获得了许多新特性,显著的å�¯ç”¨æ€§å’Œæ€§èƒ½æ��å�‡ï¼Œä»¥å�Šå¤§é‡�的问题修正。 从 Python 3.6 开始 asyncio 模å�—ä¸�å†�处于待定状æ€�,它已被视为稳定 API。

  • 实现了新的 文件系统路径å��è®® 以支æŒ� 路径类对象。 所有æ“�作路径的标准库函数已被更新为使用新的å��议。

  • datetime 模å�—已获得对 本地时间消歧义 的支æŒ�。

  • typing 模å�—获得了大é‡�çš„ 改进。

  • tracemalloc 模å�—已被大幅é‡�写,现在将被用于为 ResourceWarning æ��供更好的输出,并为内存分é…�错误æ��供更好的诊断。 请å�‚阅 PYTHONMALLOC 一节 æ�¥äº†è§£è¯¦æƒ…。

安全改进:

  • 添加了 secrets 模å�—以简化适用于密ç �管ç�†çš„高加密强度伪éš�机数的生æˆ�,例如账户验è¯�ã€�安全凭æ�®ç­‰åœºæ™¯ã€‚

  • 在 Linux 上,现在 os.urandom() 会阻塞直到系统的 urandom 熵池被åˆ�始化以æ��å�‡å®‰å…¨æ€§ã€‚ å…¶ç�†ç”±å�‚è§� PEP 524。

  • hashlib å’Œ ssl 模å�—现在支æŒ� OpenSSL 1.1.0。

  • ssl 模å�—的默认设置和特性集已得到改进。

  • hashlib 模å�—获得了对 BLAKE2, SHA-3 å’Œ SHAKE 哈希算法以å�Š scrypt() 密钥派生函数的支æŒ�。

Windows改进:

  • PEP 528 å’Œ PEP 529, å°†Windows文件系统和控制å�°çš„ç¼–ç �更改为UTF-8

  • 在交互å¼�地使用 py.exe å�¯åŠ¨å™¨æ—¶ï¼Œå½“ç”¨æˆ·æœªï¼ˆé€šè¿‡å‘½ä»¤è¡Œå�‚数或é…�置文件)指定版本时ä¸�å†�优先选择 Python 2 而是选择 Python 3。 对声明行的处ç�†åˆ™ä¿�æŒ�ä¸�å�˜ —— 在这ç§�情况下 "python" 还是指 Python 2。

  • python.exe å’Œ pythonw.exe 已被标记为支æŒ�长路径,这æ„�味ç�€ä¸�å†�有 260 个字符的路径长度é™�制。 详情å�‚è§� 移除 MAX_PATH é™�制。

  • å�¯ä»¥æ·»åŠ ä¸€ä¸ª ._pth 文件æ�¥å¼ºåˆ¶ä½¿ç”¨éš”离模å¼�和完整指定所有æ�œç´¢è·¯å¾„æ�¥é�¿å…�注册表和环境查找。 更多信æ�¯è¯·å�‚阅 相关文档。

  • 现在 python36.zip 文件å�¯ä»¥ä½œä¸ºæŽ¨æ–­ PYTHONHOME 的标记物。 请å�‚阅 相关文档 了解详情。

新的特性¶

PEP 498: 格�化字符串字�值¶

PEP 498 引入了一�新型的字符串字�值: f-字符串,或称 格�化字符串字�值。

格�化字符串字�值带有 '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 -- 字符串字�值�值。

PEP 由 Eric V. Smith 撰写并实现

特性文档。

PEP 526: ��标注的语法¶

PEP 484 引入了函数形�类型标注�类型�示的标准。 这个 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 实现。

使用或将�使用此新语法的工具有: mypy, pytype, 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 实现的一个明显�制是��能在�一函数体中�时使用 await 和 yield。 在 Python 3.6 中此�制已被解除,这样就就能够定义 异步生�器:

async def ticker(delay, to):
    """Yield numbers from 0 to *to* every *delay* seconds."""
    for i in range(to):
        yield i
        await asyncio.sleep(delay)

这个新语法�许更快速且更精简的代�。

��

PEP 525 -- 异步生�器

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()]

��

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

为了让�自 __init_subclass__() 实现的零�数 super() 调用能正确工作,自定义元类必须��新的 __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: 添加文件系统路径�议¶

文件系统路径历�被表示为 str 或 bytes 对象。 这使得编写对文件系统路径进行�作的代�的人会�定这�对象�能是这两�类型之一(�考虑表示文件�述符的 int 因为它�是文件路径)。 �幸的是,这��定阻止了� pathlib 这样的文件系统路径的替代对象表示形�与包括 Python 标准库在内的现有代���工作。

为了修正这�情况,一个由 os.PathLike 表示的新接�被定义出�。 通过实现 __fspath__() 方法,对象�以表明它代表一个路径。 这样一个对象就能以 str 或 bytes 对象的形��供文件系统路径的低层级表示。 这�味�如果一个对象实现了 os.PathLike 或者是表示文件系统路径的 str 或 bytes 对象它就会被当作是 路径型对象。 代��以使用 os.fspath()�os.fsdecode() 或 os.fsencode() �显�地获�一个路径型对象的 str 和/或 bytes 表示形�。

内置 open() 函数已被更新为接� os.PathLike 对象,就� os 和 os.path 模�中的所有相关函数和标准库中的大多数其他函数和类一样。 os.DirEntry 类和 pathlib 中的相关类也已被更新以实现 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 为 datetime.datetime 和 datetime.time 类的实例添加了新的 fold 属性以在本地时间相�的两个时间点之间进行区分:

>>> 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) 而�是 bytes。 �过,在�些情况下使用 bytes 就是足够而且正确的。

在 Python 3.6 之�,在 Windows 上使用 bytes 路径值�能会导致数�丢失。 有了这一更改,现在 Windows 上将支�使用 bytes �表示路径,��是这些 bytes 值是用 sys.getfilesystemencoding() 所返回的编�格��编�的,现在此编�格�默认为 'utf-8'。

�使用 str �表示路径的应用程�应当使用 os.fsencode() 和 os.fsdecode() �确� bytes 被正确地编�。 ���以�的行为,请设置 PYTHONLEGACYWINDOWSFSENCODING 或调用 sys._enablelegacywindowsfsencoding()。

有关详细信�和�能需�的代�修改的讨论,请�� PEP 529 。

PEP 528: 将 Windows 控制�编�格�更改为 UTF-8¶

现在,Windows 上的默认控制�将接�所有 Unicode 字符并为 Python 代��供正确读�的 str 对象。sys.stdin, sys.stdout 和 sys.stderr 现在默认使用 utf-8 编�格�。

此更改仅在使用交互�控制�时适用,而�适用于�定�文件或管�。 ���以�使用交互�控制�时的行为,请设置 PYTHONLEGACYWINDOWSSTDIO。

��

PEP 528 -- 将 Windows 控制�编�格�更改为 UTF-8

PEP 由 Steve Dower 撰写并实现。

PEP 520: �留类属性定义顺�¶

类定义体中的属性具有自然的排�:与�称在�代�中出现的顺�相�。 现在此排�会在新类的 __dict__ 属性中被�留。

并且,实际的默认类 execution 命�空间 (从 type.__prepare__() 返回) 现在将是一个�留�入顺�的映射对象。

��

PEP 520 -- �留类属性定义顺�

PEP 由 Eric Snow 撰写并实现

PEP 468: �留关键字�数顺�¶

函数签�中的 **kwargs 现在将��是一个�留�入顺�的映射对象。

��

PEP 468 -- �留关键字�数顺�

PEP 由 Eric Snow 撰写并实现

新的 dict 实现¶

dict 类型现在会使用一�基于 Raymond Hettinger 的�议 的“紧凑�表示形�,该表示形� 最�由 PyPy 实现。 新的The memory usage of the new dict() 的内存�用相比 Python 3.5 �少了 20% 到 25%。

这个新实现对原始顺�的�留被认为是一个实现细节而�应当被�赖(这在将��能会改�,但我们希望在改�语言规范以强制所有当�和将�的 Python 实现都使用�留顺�的语义之�先在几个�布版的语言内部使用这个新的 dict 实现;这也有助于让�在使用�机迭代顺�的旧版本语言例如 Python 3.5 ���下兼容性)。

(由 INADA Naoki 在 bpo-27350 中贡献。 该特性 最�由 Raymond Hettinger �议。)

PEP 523: � CPython 添加帧求值 API¶

虽然 Python 为自定义代�执行方��供了广泛的支�,但有一个地方它没有这样�,那就是帧对象的求值。 如果您想在 Python 中拦截帧的求值,那么确实没有除了直接�纵自定义函数的函数指针以外的任何办法。

PEP 523 通过�供使帧求值在 C 语言层级上��入的 API 从而改�了这一状况。 这将�许调试器和 JIT 等工具在 Python 代�开始执行之�拦截帧求值。 这样就能�许 Python 代�使用替代性求值实现,跟踪帧求值等�法。

这个 API 并�是�� C API 的组�部分,它被标记为�有以表明该 API 的使用�到�制并且�适用于�常少的�低层级的用例。 这个 API 的语义将根�需�� Python 的一起�生�化。

��

PEP 523 -- � CPython 添加帧求值 API

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 的新特性。

请�阅 PyMem_SetupDebugHooks() 函数�了解 Python 内存分�器上的调试钩�。

现在还�以使用 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 �构建以便为解释器中的下列事件�用��标记:

  • 函数调用/返回

  • 垃圾收集开始/完æˆ�

  • 执行的代ç �行。

这�被用�在生产环境中控制正在�行的解释器,而无需�新编译特定的 调试版本 或�供应用专属的性能分�/调试代�。

更多信�,请�� 使用 DTrace 和 SystemTap 检测CPython 。

当�的实现已在 Linux 和 macOS 上进行了测试。将��能会添加其他标记。

(由 �ukasz Langa 在 bpo-21590 中贡献,基于 Jesús Cea Avión, David Malcolm 和 Nikhil Benesch 的补�。)

其他语言特性修改¶

对Python 语言核心进行的�改动:

  • 现在 global 或 nonlocal 语å�¥å¿…须以文本形å¼�出现在å�Œä¸€ä½œç”¨åŸŸä¸­é¦–次使用å�—å½±å“�çš„å��称之å‰�。 在之å‰�版本中这å�ªæ˜¯ SyntaxWarning。

  • 现在å�¯ä»¥å°†æŸ�个 特殊方法 设为 None æ�¥è¡¨ç¤ºç›¸åº”æ“�作ä¸�å�¯ç”¨ã€‚ 举例æ�¥è¯´ï¼Œå¦‚æžœæŸ�个类将 __iter__() 设为 None,则该类就将ä¸�å�¯è¿­ä»£ã€‚ (由 Andrew Barnert å’Œ Ivan Levkivskyi 在 bpo-25958 中贡献。)

  • ç”±é‡�å¤�的回溯行组æˆ�的长åº�列现在将被简化为 "[Previous line repeated {count} more times]" (请å�‚阅 回溯 获å�–样例)。 (由 Emanuel Barry 在 bpo-26823 中贡献。)

  • 现在导入æ“�作在无法找到模å�—时将引å�‘新的异常 ModuleNotFoundError (ImportError çš„å­�ç±»)。 ç›®å‰� (在 try-except 中) 检测 ImportError 的代ç �ä»�将有效。 (由 Eric Snow 在 bpo-15767 中贡献。)

  • 现在ä¾�赖于零å�‚æ•°å½¢å¼� super() 的类方法在类创建期间从元类方法调用时将正确地生效。 (由 Martin Teichmann 在 bpo-23722 中贡献。)

新增模�¶

secrets¶

新的 secrets 模�的主�目的是�供一�直观的方����地生�适用于密�管�的高加密强度的伪�机值,如账户验��安全凭�等等。

警告

注� random 模�中的伪�机数�生器 �应 被用于安全目的。 请在 Python 3.6+ 上使用 secrets 而在 Python 3.5 �更早的版本上使用 os.urandom()。

��

PEP 506 -- Secrets模�被加入Python标准库

PEP 由 Steven D'Aprano 撰写并实现。

改进的模�¶

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(),现在将接å�—所有ç§�类的 å�¯ç­‰å¾…对象。 (由 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 在 bpo-27041 中贡献。)

  • 新增 loop.get_exception_handler() 方法用于获å�–当å‰�异常处ç�†å�¥æŸ„。 (由 Yury Selivanov 在 bpo-27040 中贡献。)

  • 新增 StreamReader.readuntil() 方法用于从æµ�读å�–æ•°æ�®ç›´åˆ°å‡ºçŽ°ä½œä¸ºåˆ†éš”ç¬¦çš„å­—èŠ‚åº�列。 (由 Mark Korenberg 贡献。)

  • StreamReader.readexactly() 的性能已获得æ��å�‡ã€‚ (由 Mark Korenberg 在 bpo-28370 中贡献。)

  • loop.getaddrinfo() 方法已获得优化已é�¿å…�当地å�€å·²è¢«è§£æž�时调用系统 getaddrinfo 函数。 (由 A. Jesse Jiryu Davis 贡献。)

  • loop.stop() 方法已被更改为在当å‰�迭代之å�Žç«‹å�³å�œæ­¢å¾ªçŽ¯ã€‚ 任何作为上次迭代的结果被加入计划任务的新回调都将被丢弃。 (由 Guido van Rossum 在 bpo-25593 中贡献。)

  • 现在 Future.set_exception 在传入一个 StopIteration 异常的实例时将引å�‘ TypeError。 (由 Chris Angelico 在 bpo-26221 中贡献。)

  • 新增 loop.connect_accepted_socket() 方法供接å�— asyncio 以外的连接,但使用 asyncio æ�¥å¤„ç�†å®ƒä»¬çš„æœ�务器使用。 (由 Jim Fulton 在 bpo-27392 中贡献。)

  • 现在 TCP_NODELAY 旗标将默认针对所有 TCP 传输进行设置。 (由 Yury Selivanov 在 bpo-27456 中贡献。)

  • 新增 loop.shutdown_asyncgens() 用æ�¥åœ¨ç»“æ�Ÿå¾ªçޝ之å‰�正确地关闭现有的异步生æˆ�器。 (由 Yury Selivanov 在 bpo-28003 中贡献。)

  • Future å’Œ Task 类现在已有ç»�优化过的 C 实现使得 asyncio 代ç �加速至多 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 用于匹�由 complex 的 repr 所使用的格�。 (由 Mark Dickinson 在 bpo-23229 中贡献。)

collections¶

添加了新的 Collection 抽象基类用于表示有具体大�的�迭代容器类。 (由 Ivan Levkivskyi 在 bpo-27598 中贡献并由 Neil Girdhar 撰写文档。)

添加了新的 Reversible 抽象基类用于表示�时�供 __reversed__() 方法的�迭代类。 (由 Ivan Levkivskyi 在 bpo-25987 中贡献。)

新增代表异步生�器的 AsyncGenerator 抽象基类。 (由 Yury Selivanov 在 bpo-28720 中贡献。)

namedtuple() 函数现在接��选的关键字�数 module,当指定该�数时,它将被用作所返回的具�元组类的 __module__ 属性。 (由 Raymond Hettinger 在 bpo-17941 中贡献。)

namedtuple() 的 verbose 和 rename �数现在是仅�关键字�数。 (由 Raymond Hettinger 在 bpo-25628 中贡献。)

递归的 collections.deque 实例现在�以被 pickle。 (由 Serhiy Storchaka 在 bpo-26482 中贡献。)

concurrent.futures¶

ThreadPoolExecutor 类构造器现在接��选的 thread_name_prefix �数以便能够自定义由线程池所创建的线程的�称。 (由 Gregory P. Smith 在 bpo-27664 中贡献。)

contextlib¶

增加了 contextlib.AbstractContextManager 类用��供上下文管�器的抽象基类。 它为 __enter__() �供了一个��的默认实现,该实现将返回 self 并将 __exit__() 设为抽象方法。 在 typing 中增加了对应的类 typing.ContextManager。 (由 Brett Cannon 在 bpo-25609 中贡献。)

datetime¶

datetime 和 time 类新增了 fold 属性用�在必�时消除本地时间的歧义。 在 datetime 中的许多函数已被更新为支�本地时间的消除歧义。 请�阅 本地时间消歧义 一节了解更多信�。 (由 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() 方法,它返回一对整数 (n, d) 将给定的 Decimal 实例表示为一个最简形�且分�为正值的分数:

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

(由 Stefan Krah 和 Mark Dickinson 在 bpo-25928 中贡献。)

distutils¶

distutils.command.sdist.sdist 的 default_format 属性已被移除且 formats 属性默认为 ['gztar']。 虽然�作�求,但任何�赖于 default_format 的存在的代�都�能需�修改。 请�阅 bpo-27819 了解更多细节。

email¶

通过多个构造器的 policy 关键字��用的新 email 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,以� 'ansi' 别�用于现有的 'mbcs' 编�格�,它使用 CP_ACP 代�页。 (由 Steve Dower 在 bpo-27959 中贡献。)

enum¶

在 enum 模�中新增了两个枚举基类: 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 �数。 (由 Joseph Hackman 在 bpo-25788 中贡献。)

hashlib¶

hashlib 已支� OpenSSL 1.1.0。 最低的建议版本为 1.0.2。 (由 Christian Heimes 在 bpo-26470 中贡献。)

本模�增加了 BLAKE2 哈希函数。 blake2b() 和 blake2s() 将始终�用并支� BLAKE2 的完整特性集。 (由 Christian Heimes 在 bpo-26798 中基于 Dmitry Chestnykh 和 Samuel Neves 的代�贡献。 文档由 Dmitry Chestnykh 撰写。)

增加了 SHA-3 哈希函数 sha3_224(), sha3_256(), sha3_384(), sha3_512(),以� SHAKE 哈希函数 shake_128() 和 shake_256()。 (由 Christian Heimes 在 bpo-16113 中贡献。 Keccak 代�包由 Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche 和 Ronny Van Keer 编写。)

基于密�的密钥推导函数 scrypt() 现�用于 OpenSSL 1.1.0 �更新版本。 (由 Christian Heimes 在 bpo-27928 中贡献。)

http.client¶

HTTPConnection.request() 和 endheaders() 现在都支�分�编�格�请求体。 (由 Demian Brecht 和 Rolf Krahl 在 bpo-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 在 bpo-24225 中贡献。 大多数 idlelib 补�都是已�是或�将纳入该处�过程。)

作为补�,最终的结果是一些 idlelib 类将更会易于使用,并有更好的 API 和文档字符串加以说明。 附加的有用信�准备好�将被添加到 idlelib 中。

在 3.6.2 中新增:

多个对自动补全的修正。 (由 Louie Lu 在 bpo-15786 中贡献。)

在 3.6.3 中新增:

Module Browser (在 File ��中,之�称为 Class Browser) 现在会在最高层级函数和类之外显示嵌套的函数和类。 (由 Guilherme Polo, Cheryl Sabella 和 Terry Jan Reedy 在 bpo-1612262 中贡献。)

之�以扩展形�实现的 IDLE 特性已作为正常特性�新实现。 它们的设置已从 Extensions 选项�移至其他对�框选项�。 (由 Charles Wohlganger 和 Terry Jan Reedy 在 bpo-27099 中实现。)

Settings 对�框 (Options 中的 Configure IDLE) 已�被部分�写以改进外观和功能。 (由 Cheryl Sabella 和 Terry Jan Reedy 在多个问题项中贡献。)

在 3.6.4 中新增:

字体样本现在包括一组�拉�字符以便用户能更好地查看所选特定字体的效果。 (由 Terry Jan Reedy 在 bpo-13802 中贡献。) 样本�以被修改以包括其他字符。 (由 Serhiy Storchaka 在 bpo-31860 中贡献。)

在 3.6.6 中新增:

编辑器代�上下文选项已�过修改。 Box 会显示所有上下文行直到最大行数。 点击一个上下文行会使编辑器跳转到该行。 自定义主题的上下文颜色已添加到 Settings 对�框的 Highlights 选项�。 (由 Cheryl Sabella 和 Terry Jan Reedy 在 bpo-33642, bpo-33768 和 bpo-33679 中贡献。)

在 Windows 上,会有新的 API 调用将 tk 对 DPI 的调整告知 Windows。 在 Windows 8.1+ 或 10 上,如果 Python 二进制�的 DPI 兼容属性未改�,并且监视器分辨率大于 96 DPI,这应该会令文本和线�更清晰。 �则的�它应该�造�影�。 (由 Terry Jan Reedy 在 bpo-33656 中贡献。)

在 3.6.7 中新增:

超过 N 行(默认值为 50)的输出将被折�为一个按钮。 N �以在 Settings 对�框的 General 页的 PyShell 部分中进行修改。 数�较少但是超长的行�以通过在输出上�击�折�。 被折�的输出�通过�击按钮�展开,或是通过�击按钮�放入剪贴�或是�独的窗�。 (由 Tal Einat 在 bpo-1529353 中贡献。)

importlib¶

现在导入�作在无法找到模�时将引�新的异常 ModuleNotFoundError (ImportError 的�类)。 目� (在 try-except 中) 检测 ImportError 的代��将有效。 (由 Eric Snow 在 bpo-15767 中贡献。)

importlib.util.LazyLoader 现在将调用被包装的加载器上的 create_module(),移除了 importlib.machinery.BuiltinImporter 和 importlib.machinery.ExtensionFileLoader �能用于 importlib.util.LazyLoader 的�制。

importlib.util.cache_from_source(), importlib.util.source_from_cache() 和 importlib.util.spec_from_file_location() 现在将接� path-like object。

inspect¶

inspect.signature() 函数现在会报告编译器为推导�和生�器表达�作用域生�的�� .0 形�,就�它们是调用``implicit0`` 时的仅��置形�一样。 (由 Jelle Zijlstra 在 bpo-19611 中贡献。)

为了�少从 Python 2.7 和旧� inspect.getargspec() API �级时的代�问题,先�被写入文档的对 inspect.getfullargspec() 的弃用已被撤销。 虽然这个函数对于�/� Python 2/3 代�库�说很方便,但对于新代��说功能更丰富的 inspect.signature() 接��然是推�的方�。 (由 Nick Coghlan 在 bpo-27172 中贡献。)

json¶

现在 json.load() 和 json.loads() �支�二进制输入。 已编�的 JSON 应当使用 UTF-8, UTF-16 或 UTF-32 �表示。 (由 Serhiy Storchaka 在 bpo-17909 中贡献。)

logging¶

新增 WatchedFileHandler.reopenIfNeeded() 方法以添加检测日志文件是�需�被�新打开的能力。 (由 Marian Horban 在 bpo-24884 中贡献。).)

math¶

为 math 和 cmath 模�增加了 tau (τ) 常�。 (由 Lisa Roach 在 bpo-12345 中贡献,详情� PEP 628。)

multiprocessing¶

由 multiprocessing.Manager() 返回的 代�对象 现在�以被嵌套。 (由 Davin Potts 在 bpo-6766 中贡献。)

os¶

请�阅 PEP 519 的概览了解现在 os 和 os.path 模�如何支� 路径型对象 的详情。

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

新增的 close() 方法�许显�地关闭 scandir() 迭代器。 scandir() 迭代器现在支� context manager �议。 如果一个 scandir() 迭代器既没有被耗尽也没有被显�地关闭则会在其�构器中�出 ResourceWarning。 (由 Serhiy Storchaka 在 bpo-25994 中贡献。)

在 Linux 上,现在 os.urandom() 会阻塞直到系统的 urandom 熵池被�始化以��安全性。 其�由�� PEP 524。

Linux getrandom() 系统调用(获��机字节数�)现在被暴露为新的 os.getrandom() 函数。 (由 Victor Stinner 贡献,为 PEP 524 的一部分)

pathlib¶

pathlib 现在支� 路径型对象。 (由 Brett Cannon 在 bpo-27186 中贡献。)

请�阅 PEP 519 的概览了解详情。

pdb¶

Pdb 类构造器新增�选的 readrc �数用�控制是�应当读� .pdbrc 文件。

pickle¶

需�附带关键字�数调用 __new__ 的对象现在�以使用早于�议版本 4 的 pickle �议 � pickle。 �议版本 4 之�已支�此场景。 (由 Serhiy Storchaka 在 bpo-24164 中贡献。)

pickletools¶

现在 pickletools.dis() 将为 MEMOIZE �作�输出��的 memo 索引。 (由 Serhiy Storchaka 在 bpo-25382 中贡献。)

pydoc¶

pydoc 模�将能�守 MANPAGER 环境��的设置。 (由 Matthias Klose 在 bpo-8637 中贡献。)

help() 和 pydoc 现在将以具�元组字段被定义的顺�而�字�顺�列出它们。 (由 Raymond Hettinger 在 bpo-24879 中贡献。)

random¶

新增 choices() 函数用于从给定的总体中返回指定大�的元素列表并有�选��。 (由 Raymond Hettinger 在 bpo-18844 中贡献。)

re¶

在正则表达�中增加了对修饰符区段的支�。 示例: '(?i:p)ython' 匹� 'python' 和 'Python',但�匹� 'PYTHON';'(?i)g(?-i:v)r' 匹� 'GvR' 和 'gvr',但�匹� 'GVR'。 (由 Serhiy Storchaka 在 bpo-433028 中贡献。)

Match 对象分组�通过 __getitem__ �访问,这等价于 group()。 因此 mo['name'] 现在将等价于 mo.group('name')。 (由 Eric Smith 在 bpo-24454 中贡献。)

Match 对象现在支�将 索引型对象 作为分组索引。 (由 Jeroen Demeyer 和 Xiang Zhang 在 bpo-27177 中贡献。)

readline¶

新增 set_auto_history() ��用或�用历�列表输入的自动添加。 (由 Tyler Crompton 在 bpo-26870 中贡献。)

rlcompleter¶

�有和特殊属性�称现在会被�略除�带有以下划线开头的�缀。 在�些已完�的关键字�会加上空格或冒�。 (由 Serhiy Storchaka 在 bpo-25011 和 bpo-25209 中贡献。)

shlex¶

shlex 通过新的 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 控制�。 (由 Daniel Stokes 在 bpo-26536 中贡献。)

getsockopt() 常� SO_DOMAIN, SO_PROTOCOL, SO_PEERSEC 和 SO_PASSSEC 现在已得到支�。 (由 Christian Heimes 在 bpo-26907 中贡献。)

setsockopt() 现在支� setsockopt(level, optname, None, optlen: int) 的形�。 (由 Christian Heimes 在 bpo-27744 中贡献。)

现在 socket 模�已支�地�� AF_ALG 到 Linux Kernel crypto API 的接�。 增加了 ALG_*, SOL_ALG 和 sendmsg_afalg()。 (由 Christian Heimes 在 bpo-27744 中贡献并得到 Victor Stinner 的�助。)

新增 Linux 常� TCP_USER_TIMEOUT 和 TCP_CONGESTION。 (由 Omar Sandoval 在 bpo-26273 中贡献。)

socketserver¶

基于 socketserver 模�的�务器,包括在 http.server�xmlrpc.server 和 wsgiref.simple_server 中定义的�务器,现在都支� context manager �议。(由 Aviv Palivoda 在 bpo-26404 中贡献。)

StreamRequestHandler 类的 wfile 属性现在实现了 io.BufferedIOBase �写接�。 特别地,现在调用 write() 会��完整地��数�。 (由 Martin Panter 在 bpo-26721 中贡献。)

ssl¶

ssl 已支� OpenSSL 1.1.0。 最低的建议版本为 1.0.2。 (由 Christian Heimes 在 bpo-26470 中贡献。)

已从默认的密�套件中删除 3DES 并添加了 ChaCha20 Poly1305 密�套件。 (由 Christian Heimes 在 bpo-27850 和 bpo-27766 中贡献。)

SSLContext 已具有更好的选项和密��置。 (由 Christian Heimes 在 bpo-28043 中贡献。).)

SSL 会��以通过新的 SSLSession 类从一个客户端连接�制到�一个。 TLS 会����以加快�始�手过程��少延迟并��性能。 (由 Christian Heimes 根� Alex Warhawk 的�案在 bpo-19500 中贡献。)

新的 get_ciphers() 方法�被用�获�按密�优先级排�的已�用密�列表。

所有常�和旗标都已被转�为 IntEnum 和 IntFlags。 (由 Christian Heimes 在 bpo-28025 中贡献。)

为 SSLContext 添加了�务器和客户端专属的 TLS �议。 (由 Christian Heimes 在 bpo-28085 中贡献。)

增加了 ssl.SSLContext.post_handshake_auth 以�用并通过 ssl.SSLSocket.verify_client_post_handshake() ��始化 TLS 1.3 �手�验�。 (由 Christian Heimes 在 gh-78851 中贡献。)

statistics¶

新增 harmonic_mean() 函数。 (由 Steven D'Aprano 在 bpo-27181 中贡献。)

struct¶

现在 struct �通过 'e' 格�说明符支� IEEE 754 �精度浮点数。 (由 Eli Stevens 和 Mark Dickinson 在 bpo-11734 中贡献。)

subprocess¶

现在 subprocess.Popen �构器会在�进程�然�行时�出 ResourceWarning 警告。 请使用上下文管�器�议 (with proc: ...) 或显�地调用 wait() 方法�读��进程的退出状�。 (由 Victor Stinner 在 bpo-26741 中贡献。)

subprocess.Popen 构造器以�所有会�其传递�数的函数现在�接� encoding 和 errors �数。 指定这两者中的任何一个都将为 stdin, stdout 和 stderr ��用文本模�。 (由 Steve Dower 在 bpo-6135 中贡献。)

sys¶

新的 getfilesystemencodeerrors() 函数�返回在 Unicode 文件�和 bytes 文件�之间进行转�时使用的错误模�的�称。 (由 Steve Dower 在 bpo-27781 中贡献。)

在 Windows 上 getwindowsversion() 函数的返回值现在将包括 platform_version 字段,该字段包�当��作系统准确的主版本�次版本和构建版本�,而�是进行所模拟的版本信�。 (由 Steve Dower 在 bpo-27932 中�供贡献。)

telnetlib¶

Telnet 现在是一个上下文管�器。 (由 Stéphane Wirtel 在 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 模�处于 暂定状�,在 Python 3.6 中引入的所有改�都已被��移�到 Python 3.5.x。

typing 模�对泛型类别�的支�得到大幅改进。 例如 Dict[str, Tuple[S, T]] 现在将是有效的类型标注。 (由 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 中的��标注表示给定的属性将被用作类��而�应在该类的实例上设置。 (由 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 类具有以下改进:

  • 两个新方法,Mock.assert_called() å’Œ Mock.assert_called_once() 用于检测 mock 对象是å�¦å·²è¢«è°ƒç”¨ã€‚ (由 Amit Saha 在 bpo-26323 中贡献。)

  • Mock.reset_mock() 方法现在有两个å�¯é€‰çš„ä»…é™�关键字å�‚æ•°: return_value å’Œ side_effect。 (由 Kushal Das 在 bpo-21271 中贡献。)

urllib.request¶

如果一个 HTTP 请求具有文件或�迭代对象请求体(而�是 bytes 对象)但没有 Content-Length 标头,AbstractHTTPHandler 现在将�会抛出错误,而是回退为使用分�传输编�格�。 (由 Demian Brecht 和 Rolf Krahl 在 bpo-12319 中贡献。)

urllib.robotparser¶

RobotFileParser 现在将支� Crawl-delay 和 Request-rate 扩展。 (由 Nikolay Bogoychev 在 bpo-16099 中贡献。)

venv¶

venv 接�一个新的形� --prompt。 此形��供了用于虚拟环境的替代�缀。 (由 �ukasz Balcerzak �议并由 Stéphane Wirtel 在 bpo-22829 中移�到 3.6。)

warnings¶

为 warnings.warn_explicit() 新增�选的 source 形�:被销�的对象将�出 ResourceWarning。 还为 warnings.WarningMessage 增加了 source 属性。 (由 Victor Stinner 在 bpo-26568 和 bpo-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()

"Object allocated at" 回溯信�是新增的并且仅当 tracemalloc 在跟踪 Python 内存分�且 warnings 模�已被导入时�会显示。

winreg¶

增加了 64 �整数类型 REG_QWORD。 (由 Clement Rouault 在 bpo-23026 中贡献。)

winsound¶

�许将关键字�数传给 Beep, MessageBeep 和 PlaySound (bpo-27982)。

xmlrpc.client¶

xmlrpc.client 模�现在支�� marshall 由 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() 函数��接�关键字�数。 (分别由 Aviv Palivoda 在 bpo-26243 以� Xiang Zhang 在 bpo-16764 中贡献。)

性能优化¶

  • Python 解释器现在使用 16 ä½�字代ç �而ä¸�是字节代ç �,这使得许多æ“�作ç �优化æˆ�为å�¯èƒ½ã€‚ (由 Demur Rumed 在 bpo-26647 å’Œ bpo-28050 中贡献并得到æ�¥è‡ª Serhiy Storchaka å’Œ Victor Stinner çš„å��助和评估。)

  • 现在 asyncio.Future 类已拥有ç»�优化的 C 实现。 (由 Yury Selivanov å’Œ INADA Naoki 在 bpo-26081 中贡献。)

  • 现在 asyncio.Task 类已拥有ç»�优化的 C 实现。 (由 Yury Selivanov 在 bpo-28544 中贡献。)

  • 在 typing 模å�—中多项对实现的改进(如泛型类型的缓存)获得至多 30 å€�çš„è¿�行效率æ��å�‡å¹¶é™�低了内存消耗。

  • 现在 ASCII è§£ç �器使用 surrogateescape, ignore å’Œ replace 错误处ç�†å�¥æŸ„æ—¶å�¯æ��速至多 60 å€�。 (由 Victor Stinner 在 bpo-24870 中贡献。)

  • 现在 ASCII å’Œ Latin1 è§£ç �器使用 surrogateescape 错误处ç�†å�¥æŸ„æ—¶å�¯æ��速至多 3 å€�。 (由 Victor Stinner 在 bpo-25227 中贡献。)

  • 现在 UTF-8 è§£ç �器使用 ignore, replace, surrogateescape, surrogatepass 错误处ç�†å�¥æŸ„æ—¶å�¯æ��速至多 75 å€�。 (由 Victor Stinner 在 bpo-25267 中贡献。)

  • 现在 UTF-8 è§£ç �器使用 ignore, replace å’Œ surrogateescape 错误处ç�†å�¥æŸ„æ—¶å�¯æ��速至多 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(): 现在它们获得了 2x å’Œ 3.5x çš„æ��速。 (由 Victor Stinner 在 bpo-25401 中贡献。)

  • 优化 bytes.replace(b'', b'.') å’Œ bytearray.replace(b'', b'.'): æ��速至多 80%。 (由 Josh Snider 在 bpo-26574 中贡献。)

  • PyMem_Malloc() 域的分é…�器函数 (PYMEM_DOMAIN_MEM) 现在使用 pymalloc 内存 分é…�器 而ä¸�是 C 库的 malloc() 函数。 pymalloc 分é…�器针对å°�于等于 512 字节的较短生命周期对象进行了优化,而对于较大的内存å�—则使用 malloc()。 (由 Victor Stinner 在 bpo-26249 中贡献。)

  • 现在 pickle.load() å’Œ pickle.loads() 在å��åº�列化许多å°�对象时å�¯æ��速多至 10%。 (由 Victor Stinner 在 bpo-27056 中贡献。)

  • å�‘函数传入 关键字å�‚æ•° 相比传入 ä½�ç½®å�‚æ•° 会有é¢�外的开销。 现在对于使用 Argument Clinic 实现的扩展函数此开销已显著é™�低。 (由 Serhiy Storchaka 在 bpo-27574 中贡献。)

  • 优化了 glob 模å�—中的 glob() å’Œ iglob() 函数;现在它们å�¯æ��速约 3--6 å€�。 (由 Serhiy Storchaka 在 bpo-25596 中贡献。)

  • 通过使用 os.scandir() 优化了 pathlib 中的 glob æ“�作;现在它å�¯æ��速约 1.5--4 å€�。 (由 Serhiy Storchaka 在 bpo-26032 中贡献。)

  • xml.etree.ElementTree è§£æž�ã€�迭代和深拷è´�效率已获得显著æ��å�‡ã€‚ (由 Serhiy Storchaka 在 bpo-25638, bpo-25873 å’Œ bpo-25869 中贡献。)

  • 基于 float å’Œ decimal 创建 fractions.Fraction 实例现已æ��速 2 至 3 å€�。 (由 Serhiy Storchaka 在 bpo-25971 中贡献。)

构建和 C API 的改�¶

  • Python 现在需è¦�在工具链中æ��供一些 C99 支æŒ�æ�¥è¿›è¡Œæž„建 。 最值得注æ„�的是,Python 现在使用标准的整数类型和å®�æ�¥ä»£æ›¿åƒ� PY_LONG_LONG 这样的自定义å®�。 è¦�获å�–更多信æ�¯ï¼Œå�‚è§� PEP 7 å’Œ bpo-17884。

  • 使用 Android NDK 和将 Android API 设为 21(Android 5.0 Lollipop)或更高级别的交å�‰ç¼–译 CPython å�¯æˆ�功è¿�行。 虽然 Android 还ä¸�是一个å�—支æŒ�的平å�°ï¼Œä½† Python 测试套件在 Android 模拟器上è¿�行时å�ªæœ‰çº¦ 16 次测试失败。 请å�‚è§� Android meta-issue bpo-26865。

  • 已添加 --enable-optimizations é…�置旗标 。 打开它将激活 PGO 等高消耗的优化功能。 (原始补ä¸�ç”± Intel çš„ Alecsandru Patrascu 在 bpo-26359 中贡献。)

  • 现当调用 PYMEM_DOMAIN_OBJ (如: PyObject_Malloc()) å’Œ PYMEM_DOMAIN_MEM (如: PyMem_Malloc()) 域的分é…�器函数时必须æŒ�有在 GIL。

  • 新增 Py_FinalizeEx() API 用于æ��示缓冲数æ�®çš„刷新是å�¦å¤±è´¥ã€‚ (由 Martin Panter 在 bpo-5319 中贡献。)

  • PyArg_ParseTupleAndKeywords() 现在支æŒ� ä»…é™�ä½�置形å�‚,仅é™�ä½�置形å�‚是ä¸�带å��称定义的。 (由 Serhiy Storchaka 在 bpo-26282 中贡献。)

  • 现在 PyTraceback_Print 方法会将由é‡�å¤�行组æˆ�的长åº�列缩写为 "[Previous line repeated {count} more times]"。 (由 Emanuel Barry 在 bpo-26823 中贡献。)

  • 新增的 PyErr_SetImportErrorSubclass() 函数å…�许指定一个è¦�引å�‘çš„ ImportError å­�类。 (由 Eric Snow 在 bpo-15767 中贡献。)

  • 新增的 PyErr_ResourceWarning() 函数å�¯è¢«ç”¨äºŽç”Ÿæˆ�æ��供资æº�分é…�æ�¥æº�çš„ ResourceWarning。(由 Victor Stinner 在 bpo-26567 中贡献。)

  • 新增的 PyOS_FSPath() 函数å�¯è¿”回一个 path-like object 的文件系统表示形å¼�。 (由 Brett Cannon 在 bpo-27186 中贡献。)

  • 现在 PyUnicode_FSConverter() å’Œ PyUnicode_FSDecoder() 函数将接å�— 路径类对象。

其他改进¶

  • 当 --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)]
    

弃用¶

新关键字¶

�建议将 async 和 await 作为���类�函数或模�的�称。 它们通过 PEP 492 在 Python 3.5 中被引入,并将在 Python 3.7 �为�留关键字。 从 Python 3.6 开始,使用 async 或 await 作为�称将会产生 DeprecationWarning。

已弃用的 Python 行为¶

在生�器内部引� StopIteration 异常现在将产生 DeprecationWarning,并将在 Python 3.7 中触� RuntimeError。 详情�� PEP 479:更改生�器内部的 StopIteration 处�。

现在 __aiter__() 方法应当直接返回一个异步迭代器而�如之�那样返回一个�等待对象。 继续返回�等待对象将触� DeprecationWarning。 �下兼容将在 Python 3.7 中被移除。 (由 Yury Selivanov 在 bpo-27243 中贡献。)

现在如果一个�斜�-字符对�是有效的转义�列则会产生 DeprecationWarning。 虽然这最终会改为 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¶

未写入文档的传给 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 中仅存的尚未在之�的 Python 版本中被弃用并改为 importlib.abc.Loader.exec_module() 的 importlib.abc.Loader.load_module() 实现。

现在 importlib.machinery.WindowsRegistryFinder 类已被弃用。 在 3.6.0 中,默认它�会被添加到 sys.meta_path (对于 Windows),但这�能在未��生改�。

os¶

未写入文档的对于将普通 字节型对象 作为 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。

ftplib, http.client, imaplib, poplib 和 smtplib 中的 SSL 相关�数如 certfile, keyfile 和 check_hostname 已被弃用而应改用 context。 (由 Christian Heimes 在 bpo-28022 中贡献。)

ssl 模�中的多个�议和函数现已被弃用。 �些特性在未�的 OpenSSL 版本中将���用。 �一些特性则因建议使用��的 API 而被弃用。 (由 Christian Heimes 在 bpo-28022 和 bpo-26470 中贡献。)

tkinter¶

tkinter.tix 模�现已被弃用。 tkinter 用户应当改用 tkinter.ttk。

venv¶

pyvenv 脚本已被弃用而应改用 python3 -m venv。 这�以�� pyvenv 容易混淆所连接的 Python 解释器从而导致弄错虚拟环境所使用的 Python 解释器这样的问题。 (由 Brett Cannon 在 bpo-25154 中贡献。)

xml¶

  • 作为对 DTD 和外部实体检查的缓解,在默认情况下 xml.dom.minidom å’Œ xml.sax 模å�—å°†ä¸�å†�处ç�†å¤–部实体。 (由 Christian Heimes 在 gh-61441 中贡献。)

已弃用的 C API 函数和类型¶

未写入文档的函数 PyUnicode_AsEncodedObject(), PyUnicode_AsDecodedObject(), PyUnicode_AsEncodedUnicode() 和 PyUnicode_AsDecodedUnicode() 现已被弃用。 请改用 基于泛型编解�器的 API。

弃用的构建选项¶

现在 --with-system-ffi �置旗标在� macOS UNIX 平�上将默认�用。 它�以通过 --without-system-ffi ��用,但该旗标已被弃用并将在 Python 3.7 中��被接�。 macOS �会�此�化的影�。 请注�许多 OS �布方在构建它们的系统 Python 时已�使用了 --with-system-ffi 旗标。

移除¶

API 与特性的移除¶

  • 正则表达å¼�中由 '\' 和一个 ASCII å­—æ¯�组æˆ�的未知转义åº�列现在将导致报错。 它们在 re.sub() 的替æ�¢æ¨¡æ�¿ä¸­ä»�被å…�许,但已被弃用。 现在 re.LOCALE æ——æ ‡å�ªèƒ½ç”¨äºŽäºŒè¿›åˆ¶æ¨¡å¼�。

  • inspect.getmoduleinfo() 已被移除(自 CPython 3.3 起已被弃用)。 应当使用 inspect.getmodulename() æ�¥èŽ·å�–对应于给定路径的模å�—å��称。 (由 Yury Selivanov 在 bpo-13248 中贡献。)

  • traceback.Ignore 类和 traceback.usage, traceback.modname, traceback.fullmodname, traceback.find_lines_from_code, traceback.find_lines, traceback.find_strings, traceback.find_executable_lines 等方法已从 traceback 模å�—中移除。 它们是自 Python 3.2 èµ·å�³å·²è¢«å¼ƒç”¨çš„æœªå†™å…¥æ–‡æ¡£çš„æ–¹æ³•å¹¶å�¯é€šè¿‡ç§�有方法使用等价的功能。

  • tkinter 控件类中的 tk_menuBar() å’Œ tk_bindForTraversal() 虚拟方法已被移除(相应的 Tk 命令自 Tk 4.0 èµ·å�³å·²è¿‡æ—¶ï¼‰ã€‚

  • 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 ä¸�会输出具有负行å�·å·®å€¼çš„字节ç �。 使用 frame.f_linenoã€�PyFrame_GetLineNumber() 或 PyCode_Addr2Line() 的函数将ä¸�å�—å½±å“�。 直接解ç �:attr:!co_lnotab 的函数应当被更新以便为行å�·å·®å€¼ä½¿ç”¨æœ‰ç¬¦å�·çš„ 8 ä½�整数类型,但这å�ªæ˜¯å¯¹æ”¯æŒ�使用负行å�·å·®å€¼çš„应用程åº�çš„è¦�求。 有关 co_lnotab æ ¼å¼�以å�Šå¦‚何对其进行解ç �的详情å�‚è§� Objects/lnotab_notes.txt,相关的ç�†ç”±å�‚è§� PEP 511。

  • 现在 compileall 模å�—中的函数将返回布尔值而ä¸�是 1 或 0 æ�¥åˆ†åˆ«è¡¨ç¤ºæˆ�功或失败。 由于布尔值是整数的å­�类,这应当å�ªæœ‰åœ¨ä½ å¯¹ 1 或 0 执行标识å�·æ£€æµ‹æ—¶æ‰�会出现问题。 å�‚è§� bpo-25768。

  • 现在读å�– urllib.parse.urlsplit() å’Œ urlparse() 结果的 port 属性对于超出范围的值将引å�‘ ValueError,而ä¸�是返回 None。 å�‚è§� bpo-20059。

  • imp 模å�—现在将引å�‘ DeprecationWarning 而ä¸�是 PendingDeprecationWarning。

  • 下列模å�—在其 __all__ 属性中添加了缺失的 API 以匹é…�已写入文档的 API: calendar, cgi, csv, ElementTree, enum, fileinput, ftplib, logging, mailbox, mimetypes, optparse, plistlib, smtpd, subprocess, tarfile, threading å’Œ wave。 è¿™æ„�味ç�€å½“使用 import * 时它们将会导出新的符å�·ã€‚ (由 Joel Taddei å’Œ Jacek KoÅ‚odziej 在 bpo-23883 中贡献。)

  • 当执行相对导入时,如果 __package__ 与 __spec__.parent 的比较结果ä¸�相等则会引å�‘ ImportWarning。 (由 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 。

  • 现在 socket.socket.close() 方法当下层系统调用报告错误 (例如 EBADF) 时将会引å�‘一个异常。 (由 Martin Panter 在 bpo-26685 中贡献。)

  • 现在 smtpd.SMTPChannel å’Œ smtpd.SMTPServer 构造器的 decode_data å�‚数默认为 False。 è¿™æ„�味ç�€ä¼ ç»™ process_message() çš„å�‚数现在默认为字节串对象,而 process_message() 将被传入关键字å�‚数。 已根æ�® 3.5 所生æˆ�的弃用警告进行更新的代ç �å°†ä¸�会å�—到影å“�。

  • 现在 json 模å�—中 dump(), dumps(), load() å’Œ loads() 函数以å�Š JSONEncoder å’Œ JSONDecoder 类构造器的所有å�¯é€‰å�‚数都是 ä»…é™�关键字å�‚数。 (由 Serhiy Storchaka 在 bpo-18726 中贡献。)

  • type çš„å­�类如果未é‡�è½½ type.__new__,将ä¸�å†�能使用一个å�‚数的形å¼�æ�¥èŽ·å�–对象的类型。

  • 作为 PEP 487 的一部分,对传递给 type 的关键字å�‚数的处ç�†ï¼ˆå…ƒç±»æ��示 metaclass 除外)现在统一委托给 object.__init_subclass__()。 è¿™æ„�味ç�€ type.__new__() å’Œ type.__init__() 现在都接å�—ä»»æ„�的关键字å�‚数,但 object.__init_subclass__() (从 type.__new__() 调用)默认将拒ç»�它们。 接å�—é¢�外关键字å�‚数的自定义元类需è¦�相应调整对 type.__new__() 的调用(无论是直接调用还是通过 super 间接调用)。

  • 在 distutils.command.sdist.sdist 中,default_format 属性已被移除而ä¸�å†�被使用。 作为代替,在所有平å�°ä¸Šï¼Œå¸¦ gzip çš„ tarfile æ ¼å¼�都是默认的而ä¸�会针对特定平å�°è¿›è¡Œé€‰æ‹©ã€‚ 在å�‘行版基于 Windows 构建且需è¦� zip å�‘行版的环境中,请使用包å�«ä»¥ä¸‹å†…容的 setup.cfg 文件æ�¥é…�置项目:

    [sdist]
    formats=zip
    

    此行为已通过 Setuptools 26.0.0 ��移�到更早的 Python 版本中。

  • 在 urllib.request 模å�—å’Œ http.client.HTTPConnection.request() 方法中,如果没有指定 Content-Length 标头字段并且请求体是一个文件对象,现在它将使用 HTTP 1.1 分å�—ç¼–ç �æ ¼å¼�å�‘é€�。 如果必须è¦�将一个文件对象å�‘é€�ç»™ HTTP 1.0 æœ�务器,那么现在必须由调用方指定 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() 函数将返回 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。

  • With the introduction of ModuleNotFoundError, import system consumers may start expecting import system replacements to raise that more specific exception when appropriate, rather than the less-specific ImportError. To provide future compatibility with such consumers, implementors of alternative import systems that completely replace __import__() will need to update their implementations to raise the new subclass when a module can't be found at all. Implementors of compliant plugins to the default import system shouldn't need to make any changes, as the default import system will raise the new subclass when appropriate.

C API 的�化¶

  • 现在 PyMem_Malloc() 分é…�器æ—�将使用 pymalloc 分é…�器 而ä¸�是系统 malloc()。 调用 PyMem_Malloc() 时未æŒ�有 GIL 的应用程åº�现在å�¯èƒ½å�‘生崩溃。 请将 PYTHONMALLOC 环境å�˜é‡�设为 debug 以便在你的应用程åº�中验è¯�内存分é…�器的使用。 å�‚è§� bpo-26249。

  • 现在如果缓冲数æ�®åˆ·æ–°å¤±è´¥ Py_Exit() (以å�Šä¸»è§£é‡Šå™¨) 会将退出状æ€�é‡�写为 120。 å�‚è§� bpo-5319。

CPython 字节�的改�¶

在 Python 3.6 中对 bytecode 进行了一些�大修改。

  • Python 解释器现在使用 16 ä½�字代ç �而ä¸�是字节代ç �。 (由 Demur Rumed 在 bpo-26647 å’Œ bpo-28050 中贡献并得到æ�¥è‡ª Serhiy Storchaka å’Œ Victor Stinner çš„å��助和评估。)

  • 新增 FORMAT_VALUE å’Œ BUILD_STRING æ“�作ç �作为 æ ¼å¼�化字符串字é�¢å€¼ 实现的组æˆ�部分。 (由 Eric Smith 在 bpo-25483 以å�Š Serhiy Storchaka 在 bpo-27078 中贡献。)

  • 新增的 BUILD_CONST_KEY_MAP æ“�作ç �用于优化具有常é‡�键的字典的创建。 (由 Serhiy Storchaka 在 bpo-27140 中创建。)

  • 函数调用æ“�作ç �进行了大幅改进以æ��å�‡æ•ˆçŽ‡å¹¶ç®€åŒ–å®žçŽ°ã€‚ MAKE_FUNCTION, CALL_FUNCTION, CALL_FUNCTION_KW å’Œ BUILD_MAP_UNPACK_WITH_CALL æ“�作ç �已被修改,新增了 CALL_FUNCTION_EX å’Œ BUILD_TUPLE_UNPACK_WITH_CALL,并移除了 CALL_FUNCTION_VAR, CALL_FUNCTION_VAR_KW å’Œ MAKE_CLOSURE æ“�作ç �。 (由 Demur Rumed 在 bpo-27095 中,以å�Š Serhiy Storchaka 在 bpo-27213, bpo-28257 中贡献。)

  • 新增了 SETUP_ANNOTATIONS å’Œ STORE_ANNOTATION æ“�作ç �以支æŒ�æ–°çš„ variable annotation 语法。 (由 Ivan Levkivskyi 在 bpo-27985 中贡献。)

Python 3.6.2 中的���化¶

新增 make regen-all 构建目标¶

为了简化交�编译,并确� CPython 能够��地编译而�需�已存在�用的 Python 版本,基于 autotools 的构建系统将���试根�文件修改时间��地�新编译已生�的文件。

�而代之的是,新增了一个 make regen-all 命令以便在需�时强制�新生�这些文件(例如在基于预生�版本构建了 Python 的�始版本之�)。

还定义了其他一些更具选择性的�生�目标 —— 详情�� Makefile.pre.in。

(由 Victor Stinner 在 bpo-23404 中贡献。)

在 3.6.2 版本加入.

移除了 make touch 构建目标¶

之�用于通过更新生�文件的修改时间�请求��的�新生�这些文件的 make touch 构建目标已被移除。

它已被新的 make regen-all 目标所替代。

(由 Victor Stinner 在 bpo-23404 中贡献。)

在 3.6.2 版本�生�更.

Python 3.6.4 中的���化¶

曾�作为 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 中的���化¶

在默认情况下 xml.dom.minidom 和 xml.sax 模�将��处�外部实例。 �请�阅 gh-61441。

在 3.6.7 中当�供�带末尾�行符的输入时 tokenize 模�现在会��地�出 NEWLINE 形符。 此行为现在已与 C 分�器的内部行为相匹�。 (由 Ammar Askar 在 bpo-33899 中贡献。)

Python 3.6.10 中的���化¶

出于��的安全性考�,asyncio.loop.create_datagram_endpoint() 的 reuse_address 形���被支�。 这是由 UDP 中的套接字选项 SO_REUSEADDR 的行为导致的。 更多细节请�阅 loop.create_datagram_endpoint() 的文档。 (由 Kyle Stanley, Antoine Pitrou 和 Yury Selivanov 在 bpo-37228 中贡献。。)

Python 3.6.13 中的���化¶

早先的 Python 版本�许使用 ; 和 & 作为 urllib.parse.parse_qs() 和 urllib.parse.parse_qsl() 中 query 形�的分隔键。 出于安全考虑,也为了�循更新的 W3C 推�设置,这已被改为��许�个分隔键,默认为 &。 这一改�还会影� cgi.parse() 和 cgi.parse_multipart() 因为它们在内部使用了�影�的函数。 �了解更多细节,请查看它们�自的文档。 (由 Adam Goldschmidt, Senthil Kumaran 和 Ken Jin 在 bpo-42967 中贡献。)

Python 3.6.14 中的���化¶

新的安全修正将 ftplib.FTP 的行为改�当设置被动数�通�时�信任远程�务器所��的 IPv4 地�。 我们会改为�用 ftp �务器的 IP 地�。 对于需�原先的行为的�常�代�,请在你的 FTP 实例上将 trust_server_pasv_ipv4_address 属性设为 True。 (�� gh-87451。)

在 URL 中存在�行符或制表符�能会导致��形�的攻击。 根�更新了 RFC 3986 的 WHATWG 规范,解�器 urllib.parse() 将从 URL 中去除 ASCII �行符 \n, \r 和制表符 \t 以防止这�攻击。 移除的字符将由一个新的模�层级�� urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE �控制。 (�� gh-88048。)