python 3.6的新功能

编辑

埃尔维斯·普兰斯基·维库斯<elvis@magic.io>,尤里·塞利万诺夫<yury@magic.io>

本文解释了与3.5相比,python 3.6中的新特性。python 3.6于2016年12月23日发布。见 changelog 以获取完整的更改列表。

参见

PEP 494 -python 3.6发布计划

总结——发布亮点

新语法功能:

  • PEP 498 ,格式化字符串文本。

  • PEP 515 ,数字文本中有下划线。

  • PEP 526 ,变量注释的语法。

  • PEP 525 ,异步生成器。

  • PEP 530 :异步理解。

新库模块:

CPython实施改进:

标准库的重大改进:

安全改进:

  • 新的 secrets 增加了模块以简化密码强伪随机数的生成,这些伪随机数适用于管理诸如帐户验证、令牌等机密。

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

  • 这个 hashlibssl 模块现在支持openssl 1.1.0。

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

  • 这个 hashlib 模块接收到对blake2、sha-3和shakehash算法以及 scrypt() 密钥派生函数。

Windows改进:

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

  • 这个 py.exe 当以交互方式使用时,当用户没有指定版本(通过命令行参数或配置文件)时,与python 3相比,launcher不再偏好python 2。shebang行的处理保持不变-“python”在这种情况下指的是python 2。

  • python.exepythonw.exe 已标记为长路径感知,这意味着260个字符的路径限制可能不再适用。见 removing the MAX_PATH limitation 有关详细信息。

  • A ._pth 可以添加文件以强制隔离模式,并完全指定所有搜索路径以避免注册表和环境查找。见 the documentation 更多信息。

  • A python36.zip 文件现在作为一个地标来推断 PYTHONHOME . 见 the documentation 更多信息。

新特点

PEP 498:格式化字符串文本

PEP 498 介绍一种新的字符串文本: f-stringsformatted string literals .

带格式的字符串文本的前缀为 'f' 与接受的格式字符串类似 str.format() . 它们包含由大括号包围的替换字段。替换字段是在运行timeit算的表达式,然后使用 format() 协议::

>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}"  # nested fields
'result:      12.35'

参见

PEP 498 --文字字符串插值。

由Eric v.Smith编写和实现。

Feature documentation .

PEP 526:变量注释的语法

PEP 484 介绍了函数参数类型注释的标准,A.K.A.类型提示。此PEP为python添加了语法,用于注释变量类型,包括类变量和实例变量:

primes: List[int] = []

captain: str  # Note: no initial value!

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

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

与静态类型语言中的变量声明不同,注释语法的目标是通过抽象语法树和 __annotations__ 属性。

参见

PEP 526 --变量注释的语法。

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

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

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

PEP 515 添加在数字文本中使用下划线的功能,以提高可读性。例如::

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

允许在数字之间和任何基说明符之后使用单下划线。行中不允许有前导、尾随或多个下划线。

这个 string formatting 语言现在也支持 '_' 用于指示对浮点表示类型和整数表示类型的千位分隔符使用下划线的选项 'd' . 对于整数表示类型 'b''o''x''X' ,下划线将每隔4位插入:

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

参见

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

乔治·布兰德和塞尔希·斯托查卡写的PEP。

PEP 525:异步生成器

PEP 492 引入了对本地协同程序的支持 async / await 语法为python 3.5。python 3.5实现的一个显著限制是不可能使用 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 --异步生成器

由Yury Selivanov编写和实施的PEP。

PEP 530:异步理解

PEP 530 添加对使用的支持 async for 在列表、集合、dict理解和生成器表达式中:

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

此外, await 各种理解都支持表达式::

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

参见

PEP 530 --异步理解

由Yury Selivanov编写和实施的PEP。

PEP 487:类创建的简单定制

现在可以自定义子类创建而不使用元类。新的 __init_subclass__ 每当创建新的子类时,将在基类上调用ClassMethod::

class PluginBase:
    subclasses = []

    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        cls.subclasses.append(cls)

class Plugin1(PluginBase):
    pass

class Plugin2(PluginBase):
    pass

为了允许零参数 super() 调用以正确工作 __init_subclass__() 实现,自定义元类必须确保 __classcell__ 命名空间条目传播到 type.__new__ (如中所述 创建类对象

参见

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

PEP由Martin Teichmann编写并实施。

Feature documentation

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

Feature documentation

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

文件系统路径历史上表示为 strbytes 物体。这导致了编写在文件系统路径上操作的代码的人认为这些对象只是这两种类型中的一种(即 int 表示文件描述符并不算作文件路径)。不幸的是,该假设阻止了文件系统路径的替代对象表示,例如 pathlib 从使用预先存在的代码开始,包括Python的标准库。

为了解决这个问题,一个新的接口由 os.PathLike 已定义。通过实施 __fspath__() 方法,对象表示它表示路径。然后,对象可以提供文件系统路径的低级表示,作为 strbytes 对象。这意味着考虑对象 path-like 如果它实现 os.PathLike 或者是 strbytes 表示文件系统路径的对象。代码可以使用 os.fspath()os.fsdecode()os.fsencode() 明确地得到 str 和/或 bytes 类似路径的对象的表示。

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

希望更新文件系统路径上操作的基本函数将导致第三方代码隐式支持所有 path-like objects 没有任何代码更改,或至少非常小的更改(例如,调用 os.fspath() 在对类似路径的对象进行操作之前的代码开头)。

下面是一些新接口如何允许 pathlib.Path 与预先存在的代码一起更容易、更透明地使用:

>>> import pathlib
>>> with open(pathlib.Path("README")) as f:
...     contents = f.read()
...
>>> import os.path
>>> os.path.splitext(pathlib.Path("some_file.txt"))
('some_file', '.txt')
>>> os.path.join("/a/b", pathlib.Path("c"))
'/a/b/c'
>>> import os
>>> os.fspath(pathlib.Path("some_file.txt"))
'some_file.txt'

(由Brett Cannon、Ethan Furman、Dusty Phillips和Jelle Zijlstra实施。)

参见

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

布雷特·坎农和库斯·泽文霍夫写的PEP。

PEP 495:当地时间消除歧义

在世界上大多数地方,本地时钟已经或将要被移回。在这些时间中,引入了本地时钟在同一天显示两次相同时间的间隔。在这些情况下,本地时钟上显示的信息(或存储在Python日期时间实例中)不足以标识特定的时间点。

PEP 495 添加新的 fold 属性到的实例 datetime.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)而不是字节。但是,在某些情况下,使用字节是充分和正确的。

在Python3.6之前,在Windows上使用字节路径可能会导致数据丢失。通过这种更改,现在Windows支持使用字节来表示路径,前提是这些字节是用返回的编码进行编码的。 sys.getfilesystemencoding() ,现在默认为 'utf-8' .

不使用str表示路径的应用程序应使用 os.fsencode()os.fsdecode() 以确保其字节正确编码。要恢复到以前的行为,请设置 PYTHONLEGACYWINDOWSFSENCODING 或调用 sys._enablelegacywindowsfsencoding() .

PEP 529 有关可能需要的代码修改的更多信息和讨论。

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

Windows上的默认控制台现在将接受所有Unicode字符,并为python代码提供正确读取的str对象。 sys.stdinsys.stdoutsys.stderr 现在默认为UTF-8编码。

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

参见

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

PEP由Steve Dower编写并实施。

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

类定义主体中的属性具有自然的顺序:名称在源中的显示顺序相同。这个顺序现在保存在新类的 __dict__ 属性。

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

参见

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

Pep由Eric Snow编写并实施。

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

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

参见

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

Pep由Eric Snow编写并实施。

新的 dict 实施

这个 dict 类型现在使用基于 a proposal by Raymond Hettinger 那是 first implemented by PyPy . 新的内存使用 dict() 比python 3.5小20%到25%。

这个新实现的订单保留方面被认为是一个实现细节,不应该依赖(这在将来可能会改变,但在将语言规范更改为强制为所有当前和未来的pyth保留订单语义之前,希望在语言中使用这个新的dict实现几个版本。在实现上,这也有助于保持与旧版本的语言的向后兼容性,在这些版本中,随机迭代顺序仍然有效,例如python 3.5)。

(Inada Naoki在 bpo-27350 . 想法 originally suggested by Raymond Hettinger

PEP 523:向CPython添加帧评估API

虽然python提供了广泛的支持来定制代码的执行方式,但有一个地方它没有这样做,那就是对框架对象的评估。如果您想用某种方法来拦截Python中的帧评估,那么在没有直接为定义的函数操作函数指针的情况下,就没有任何方法。

PEP 523 通过提供一个API来改变这一点,使框架评估在C级可插入。这将允许调试程序和JIT等工具在开始执行python代码之前拦截帧评估。这允许对python代码、跟踪帧评估等使用可选的评估实现。

此API不是受限C API的一部分,并标记为私有,以表示此API的使用将受到限制,并且仅适用于非常精选的低级用例。必要时,API的语义将随python的变化而变化。

参见

PEP 523 --向cpython添加帧评估API

布雷特·坎农和迪诺·维埃兰写的PEP。

pythonmalloc环境变量

新的 PYTHONMALLOC 环境变量允许设置python内存分配器和安装调试挂钩。

现在可以在以发布模式编译的python上的python内存分配器上安装调试挂钩,使用 PYTHONMALLOC=debug .调试挂钩的效果:

  • 新分配的内存中充满了字节 0xCB

  • 释放的内存中充满了字节 0xDB

  • 检测是否违反了python内存分配器API。例如, PyObject_Free() 在由分配的内存块上调用 PyMem_Malloc() .

  • 在缓冲区开始之前检测写入(缓冲区下溢)

  • 在缓冲区结束后检测写入(缓冲区溢出)

  • 检查一下 GIL 当分配器的函数 PYMEM_DOMAIN_OBJ (EX: PyObject_Malloc()PYMEM_DOMAIN_MEM (EX: PyMem_Malloc() )调用域。

检查是否持有gil也是Python3.6的一个新特性。

PyMem_SetupDebugHooks() 用于调试python内存分配器挂钩的函数。

现在也可以强制使用 malloc() 所有python内存分配的C库的分配器 PYTHONMALLOC=malloc . 当在以发布模式编译的Python上使用外部内存调试程序(如valgrind)时,这很有用。

出错时,python内存分配器上的调试挂钩现在使用 tracemalloc 模块以获取分配内存块的跟踪。

缓冲区溢出致命错误示例 python3.6 -X tracemalloc=5 (在记录道中存储5帧)::

Debug memory block at address p=0x7fbcd41666f8: API 'o'
    4 bytes originally requested
    The 7 pad bytes at p-7 are FORBIDDENBYTE, as expected.
    The 8 pad bytes at tail=0x7fbcd41666fc are not all FORBIDDENBYTE (0xfb):
        at tail+0: 0x02 *** OUCH
        at tail+1: 0xfb
        at tail+2: 0xfb
        at tail+3: 0xfb
        at tail+4: 0xfb
        at tail+5: 0xfb
        at tail+6: 0xfb
        at tail+7: 0xfb
    The block was made by call #1233329 to debug malloc/realloc.
    Data at p: 1a 2b 30 00

Memory block allocated at (most recent call first):
  File "test/test_bytes.py", line 323
  File "unittest/case.py", line 600
  File "unittest/case.py", line 648
  File "unittest/suite.py", line 122
  File "unittest/suite.py", line 84

Fatal Python error: bad trailing pad byte

Current thread 0x00007fbcdbd32700 (most recent call first):
  File "test/test_bytes.py", line 323 in test_hex
  File "unittest/case.py", line 600 in run
  File "unittest/case.py", line 648 in __call__
  File "unittest/suite.py", line 122 in run
  File "unittest/suite.py", line 84 in __call__
  File "unittest/suite.py", line 122 in run
  File "unittest/suite.py", line 84 in __call__
  ...

(由Victor Stinner在 bpo-26516bpo-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语言所做的一些较小的更改是:

  • A globalnonlocal 语句现在必须在同一作用域中首次使用受影响的名称之前以文本形式出现。以前这是一个 SyntaxWarning .

  • 现在可以设置 special methodNone 以指示相应的操作不可用。例如,如果类集 __iter__()None ,类不可重复。(由Andrew Barnert和Ivan Levkivskyi在 bpo-25958

  • 长序列的重复追溯线现在缩写为 "[Previous line repeated {{count}} more times]" (见 追溯 例如)。(伊曼纽尔·巴里在 bpo-26823

  • 导入现在引发新的异常 ModuleNotFoundError (子类) ImportError )当它找不到模块时。当前检查importError(在try-except中)的代码仍然有效。(埃里克·斯诺在 bpo-15767

  • 依赖零参数的类方法 super() 在类创建过程中从元类方法调用时,现在可以正常工作。(马丁·泰希曼在 bpo-23722

新模块

秘密

新的主要目的 secrets 模块提供了一种可靠地生成密码强的伪随机值的明显方法,这些值适用于管理机密,如帐户身份验证、令牌和类似的内容。

警告

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

参见

PEP 506 --向标准库添加机密模块

PEP由Steven D'Aprano编写并实施。

改进的模块

数组

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

Serhiy Storchaka在 bpo-26492 .

AST

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

维克多·斯廷纳在 bpo-26146 .

asyncio

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

中的显著变化 asyncio 自python 3.5.0以来的模块(由于临时状态,所有模块都返回到3.5.x):

binascii

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

cmath

新的 cmath.tauτ )已添加常量。(莉萨·罗奇在 bpo-12345PEP 628 详情。

新常量: cmath.infcmath.nan 相配 math.infmath.nan ,而且 cmath.infjcmath.nanj 以匹配复杂repr使用的格式。(马克·狄金森在 bpo-23229

收藏

新的 Collection 已添加抽象基类以表示大小不可重的容器类。(Ivan Levkivskyi提供,Neil Girdhar在 bpo-27598

新的 Reversible 抽象基类表示还提供 __reversed__() 方法。(Ivan Levkivskyi在 bpo-25987

新的 AsyncGenerator 抽象基类表示异步生成器。(由Yury Selivanov在 bpo-28720

这个 namedtuple() 函数现在接受可选关键字参数 模块 ,当指定时,用于 __module__ 返回的命名元组类的属性。(由Raymond Hettinger在 bpo-17941

这个 verbose重命名 参数的理由 namedtuple() 现在只显示关键字。(由Raymond Hettinger在 bpo-25628

递归 collections.deque 现在可以酸洗实例。(Serhiy Storchaka在 bpo-26482

concurrent.futures

这个 ThreadPoolExecutor 类构造函数现在接受一个可选的 thread_name_prefix 参数,以便自定义由池创建的线程的名称。(格雷戈里·史密斯在 bpo-27664

contextlib

The contextlib.AbstractContextManager class has been added to provide an abstract base class for context managers. It provides a sensible default implementation for __enter__() which returns self and leaves __exit__() an abstract method. A matching class has been added to the typing module as typing.ContextManager. (Contributed by Brett Cannon in bpo-25609.)

日期时间

这个 datetimetime 类有新的 fold 属性,用于在必要时消除本地时间的歧义。中的许多功能 datetime 已更新以支持本地时间消除歧义。参见 Local Time Disambiguation 有关详细信息,请参阅。(亚历山大·伯罗波尔斯基于年 bpo-24773

这个 datetime.strftime()date.strftime() 方法现在支持ISO 8601日期指令 %G%u%V . (阿什利·安德森在 bpo-12006

这个 datetime.isoformat() 函数现在接受一个可选的 TimeSime 参数,指定要包含的时间值的其他组件的数量。(由亚历山德罗·库奇和亚历山大·伯罗波尔斯基于 bpo-19475

这个 datetime.combine() 现在接受一个可选的 茨芬格 参数。(亚历山大·伯罗波尔斯基于年 bpo-27661

十进制的

新的 Decimal.as_integer_ratio() 返回对的方法 (n, d) 表示给定的 Decimal 以分数、最低值和正分母表示的实例:

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

(由Stefan Krah和Mark Dickinson在 bpo-25928

distutils

这个 default_format 属性已从中删除 distutils.command.sdist.sdist 以及 formats 属性默认为 ['gztar'] . 尽管没有预料到,任何依赖于 default_format 可能需要调整。参见 bpo-27819 了解更多详细信息。

电子邮件

新的电子邮件API,通过 policy 关键字到各个构造函数,不再是临时的。这个 email 文档已经重新组织和重写,以关注新的API,同时保留旧的API文档。(R.David Murray在 bpo-24277

这个 email.mime 现在所有的类都接受一个可选的 policy 关键字。(由Berker Peksag在 bpo-27331

这个 DecodedGenerator 现在支持 policy 关键字。

有一种新的 policy 属性, message_factory 它控制解析器创建新消息对象时默认使用的类。对于 email.policy.compat32 这是政策 Message 对于新政策来说 EmailMessage . (R.David Murray在 bpo-20476

编码

在Windows上,添加了 'oem' 使用编码 CP_OEMCP'ansi' 现有的别名 'mbcs' 编码,使用 CP_ACP 代码页。(史蒂夫·道尔在 bpo-27959

枚举

已将两个新的枚举基类添加到 enum 模块: FlagIntFlags . 两者都用于定义可以使用位运算符组合的常量。(伊桑·弗曼在 bpo-23591

许多标准库模块已更新为使用 IntFlags 为其常量初始化。

新的 enum.auto 值可用于自动为枚举成员分配值::

>>> from enum import Enum, auto
>>> class Color(Enum):
...     red = auto()
...     blue = auto()
...     green = auto()
...
>>> list(Color)
[<Color.red: 1>, <Color.blue: 2>, <Color.green: 3>]

faulthandler

在Windows上 faulthandler 模块现在安装Windows异常处理程序:请参见 faulthandler.enable() . (由Victor Stinner在 bpo-23848

文件输入

hook_encoded() 现在支持 errors 参数。(约瑟夫·哈克曼在 bpo-25788

hashlib

hashlib 支持OpenSSL 1.1.0。最低推荐版本为1.0.2。(由Christian Heimes在 bpo-26470

blake2散列函数已添加到模块中。 blake2b()blake2s() 始终可用并支持Blake2的完整功能集。(由Christian Heimes在 bpo-26798 基于Dmitry Chestnykh和Samuel Neves的代码。文件由Dmitry Chestnykh编写。)

sha-3散列函数 sha3_224()sha3_256()sha3_384()sha3_512() ,并震动hash函数 shake_128()shake_256() 加入。(由Christian Heimes在 bpo-16113 . 由Guido Bertoni、Joan Daemen、Micha_l Peeters、Gilles van Assche和Ronny van Keer编写的Keccak代码包。)

基于密码的密钥派生函数 scrypt() 现在可用于OpenSS1.1.0及更高版本。(由Christian Heimes在 bpo-27928

http.client

HTTPConnection.request()endheaders() 现在两者都支持分块编码请求体。(德米安·布莱希特和罗尔夫·克莱尔在 bpo-12319

idlelib和idle

idlelib包正在进行现代化和重构,以使idle看起来和工作得更好,并使代码更易于理解、测试和改进。让空闲看起来更好的一部分,特别是在Linux和Mac上,是使用TTK小部件,主要是在对话框中。因此,IDLE不再使用TCL/TK 8.4运行。现在需要tcl/tk 8.5或8.6。我们建议运行其中一个的最新版本。

“现代化”包括重命名和合并idlelib模块。用部分大写名称重命名文件类似于将3.0中的tkinter和tkfont重命名为tkinter和tkinter.font。因此,在3.5中工作的idlelib文件的导入通常在3.6中不工作。至少需要对模块名进行更改(请参阅idlelib/readme.txt),有时甚至更多。(Al Swiegart和Terry Reedy在 bpo-24225 . 自那以后,大多数idlelib补丁已经并且将成为进程的一部分。)

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

3.3.2新

自动完成的多个修复程序。(由路易路在 bpo-15786

3.3.3新

模块浏览器(在文件菜单上,以前称为类浏览器),现在除了顶级函数和类之外,还显示嵌套函数和类。(由Guilherme Polo、Cheryl Sabella和Terry Jan Reedy在 bpo-1612262

以前作为扩展实现的空闲特性已经作为普通特性重新实现。它们的设置已从扩展选项卡移到其他对话框选项卡。(由Charles Wohlganger和Terry Jan Reedy在 bpo-27099

设置对话框(选项、配置空闲)已部分重写,以改善外观和功能。(Cheryl Sabella和Terry Jan Reedy在多个问题上作了贡献。)

3.3.4新版本:

字体示例现在包括非拉丁字符的选择,这样用户可以更好地看到选择特定字体的效果。(由Terry Jan Reedy在 bpo-13802 .)可以编辑样本以包含其他字符。(Serhiy Storchaka在 bpo-31860

3.3.6:

编辑代码上下文选项已修订。框显示所有上下文行,最多可显示最大行。单击上下文行会将编辑器跳到该行。自定义主题的上下文颜色将添加到“设置”对话框的“突出显示”选项卡中。(由Cheryl Sabella和Terry Jan Reedy在 bpo-33642bpo-33768bpo-33679

在Windows上,一个新的API调用告诉Windows tk为dpi缩放。在Windows8.1+或10上,python二进制文件的dpi兼容性属性保持不变,并且监视器分辨率大于96dpi,这将使文本和行更清晰。否则应该没有效果。(由Terry Jan Reedy在 bpo-33656

3.3.7:

N行上的输出(默认为50)被压缩为一个按钮。n可以在设置对话框的常规页面的pyshell部分更改。用鼠标右键单击输出可以压缩的行更少,但也可能更长。通过双击按钮或右键单击按钮进入剪贴板或单独的窗口,可以就地扩展压缩输出。(由Tal Einat在 bpo-1529353

importlib

导入现在引发新的异常 ModuleNotFoundError (子类) ImportError )当它找不到模块时。当前检查的代码 ImportError (试用版除外)仍然有效。(埃里克·斯诺在 bpo-15767

importlib.util.LazyLoader 现在调用 create_module() 在打封加载器上,移除 importlib.machinery.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在 bpo-19611

在从python 2.7和旧版本升级时减少代码流失 inspect.getargspec() API,先前记录的 inspect.getfullargspec() 已被撤消。虽然此函数对于单个/源代码的python 2/3代码基很方便,但是 inspect.signature() 接口仍然是新代码的推荐方法。(由Nick Coghlan在 bpo-27172

json

json.load()json.loads() 现在支持二进制输入。编码的JSON应该使用utf-8、utf-16或utf-32表示。(Serhiy Storchaka在 bpo-17909

登录

新的 WatchedFileHandler.reopenIfNeeded() 已添加方法以添加检查是否需要重新打开日志文件的功能。(由Marian Horban在 bpo-24884

数学

Tau(Tau) τ )常量已添加到 mathcmath 模块。(莉萨·罗奇在 bpo-12345PEP 628 详情。

多重处理

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

操作系统

参见 PEP 519 有关如何 osos.path 模块现在支持 path-like objects .

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

一个新的 close() 方法允许显式关闭 scandir() 迭代器。这个 scandir() 迭代器现在支持 context manager 协议。如果A scandir() 迭代器既没有耗尽也没有显式关闭 ResourceWarning 将在其析构函数中发出。(Serhiy Storchaka在 bpo-25994

在Linux上, os.urandom() 现在阻塞,直到系统urandom熵池初始化以提高安全性。见 PEP 524 理由是。

Linux getrandom() 系统调用(获取随机字节)现在作为新的 os.getrandom() 功能。(由Victor Stinner提供,属于 PEP 524

pathlib

pathlib 现在支持 path-like objects .(布雷特·坎农在 bpo-27186

参见 PEP 519 有关详细信息。

pdb

这个 Pdb 类构造函数有一个新的可选 读写器 控制是否 .pdbrc 应该读取文件。

pickle

需要的对象 __new__ 现在可以使用pickle使用关键字参数调用 pickle protocols 早于协议版本4。协议版本4已经支持这种情况。(Serhiy Storchaka在 bpo-24164

pickletools

pickletools.dis() 现在输出 MEMOIZE 操作码。(Serhiy Storchaka在 bpo-25382

pydoc

这个 pydoc 模块已经学会尊重 MANPAGER 环境变量。(由Matthias Klose在 bpo-8637

help()pydoc 现在可以按定义的顺序而不是按字母顺序列出命名的元组字段。(由Raymond Hettinger在 bpo-24879

随机的

新的 choices() 函数返回具有可选权重的给定总体中指定大小的元素的列表。(由Raymond Hettinger在 bpo-18844

重新

在正则表达式中添加了对修饰符跨度的支持。实例: '(?i:p)ython' 比赛 'python''Python' ,但不是 'PYTHON''(?i)g(?-i:v)r' 比赛 'GvR''gvr' ,但不是 'GVR' . (Serhiy Storchaka在 bpo-433028

匹配对象组可以通过 __getitem__ ,相当于 group() . 所以 mo['name'] 现在等于 mo.group('name') . (埃里克·史密斯在 bpo-24454

Match 对象现在支持 index-like objects 作为组索引。(由杰伦·德迈尔和张翔于 bpo-27177

readline

补充 set_auto_history() 启用或禁用自动向历史记录列表添加输入。(由Tyler Crompton在 bpo-26870

RLeNever

除非前缀以下划线开头,否则现在将省略私有和特殊属性名。在一些完成的关键字后添加空格或冒号。(Serhiy Storchaka在 bpo-25011bpo-25209

施莱克斯

这个 shlex 有很多 improved shell compatibility 通过新的 punctuation_chars 控制哪些字符被视为标点符号的参数。(由Vinay Sajip在 bpo-1521950

网站

指定要添加到的路径时 sys.path 在一个 .pth 文件,现在可以在目录顶部指定文件路径(例如zip文件)。(由Wolfgang Langner在 bpo-26587

sqlite3

sqlite3.Cursor.lastrowid 现在支持 REPLACE 语句。(亚历克斯·洛德索森在 bpo-16864

Socket

这个 ioctl() 函数现在支持 SIO_LOOPBACK_FAST_PATH 控制代码。(丹尼尔·斯托克斯在 bpo-26536

这个 getsockopt() 常量 SO_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() 加入。(由Christian Heimes在 bpo-27744 在维克多·斯廷纳的支持下。)

新的Linux常量 TCP_USER_TIMEOUTTCP_CONGESTION 加入。(由奥马尔·桑多瓦尔撰稿,发行号:26273)。

socketserver

基于的服务器 socketserver 模块,包括 http.serverxmlrpc.serverwsgiref.simple_server ,现在支持 context manager 协议。(由Aviv Palivoda在 bpo-26404

这个 wfile 属性 StreamRequestHandler 类现在实现 io.BufferedIOBase 可写接口。尤其是调用 write() 现在保证全部发送数据。(马丁·潘特在 bpo-26721

ssl

ssl 支持OpenSSL 1.1.0。最低推荐版本为1.0.2。(由Christian Heimes在 bpo-26470

已从默认密码套件中删除3DES,并添加了chacha20 poly1305密码套件。(由Christian Heimes在 bpo-27850bpo-27766

SSLContext 有更好的选项和密码的默认配置。(由Christian Heimes在 bpo-28043

可以使用新的 SSLSession 类。TLS会话恢复可以加速初始握手,减少延迟并提高性能(由Christian Heimes在 bpo-19500 根据Alex Warhawk的草稿。)

新的 get_ciphers() 方法可用于按密码优先级顺序获取已启用密码的列表。

所有常量和标志都已转换为 IntEnumIntFlags . (由Christian Heimes在 bpo-28025

服务器和客户端特定的TLS协议 SSLContext 加入。(由Christian Heimes在 bpo-28085

统计学

一个新的 harmonic_mean() 已添加函数。(由Steven D'Aprano在 bpo-27181

结构

struct 现在通过 'e' 格式说明符。(由Eli Stevens、Mark Dickinson在 bpo-11734

子过程

subprocess.Popen 析构函数现在发出 ResourceWarning 如果子进程仍在运行,则发出警告。使用上下文管理器协议 (with proc: ... )或者直接调用 wait() 方法读取子进程的退出状态。(由Victor Stinner在 bpo-26741

这个 subprocess.Popen 构造函数和所有传递参数给它的函数现在接受 encodingerrors 参数。指定其中一个将启用 stdinstdoutstderr 溪流。(史蒂夫·道尔在 bpo-6135

sys

新的 getfilesystemencodeerrors() 函数返回用于在Unicode文件名和字节文件名之间转换的错误模式的名称。(史蒂夫·道尔在 bpo-27781

在Windows上 getwindowsversion() 功能现在包括 platform_version 包含当前操作系统的准确主版本、次版本和内部版本号的字段,而不是为进程模拟的版本(由Steve Dower在 bpo-27932

远程网络接口

Telnet 现在是上下文管理器(由St_phane Wirtel在 bpo-25485

时间

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

timeit

新的 Timer.autorange() 已将便利方法添加到调用中 Timer.timeit() 重复,使总运行时间大于或等于200毫秒。(由Steven D'Aprano在 bpo-6422

timeit 现在,当最佳和最差时间之间存在实质性(4倍)差异时发出警告。(Serhiy Storchaka在 bpo-23552

tkinter

添加方法 trace_add()trace_remove()trace_info()tkinter.Variable 类。它们取代了旧方法 trace_variable()trace()trace_vdelete()trace_vinfo() 它使用过时的tcl命令,在未来的tcl版本中可能不起作用。(Serhiy Storchaka在 bpo-22115

追溯

回溯模块和解释器的内置异常显示现在都缩写了回溯中重复行的长序列,如下例所示:

>>> def f(): f()
...
>>> f()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in f
  File "<stdin>", line 1, in f
  File "<stdin>", line 1, in f
  [Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded

(伊曼纽尔·巴里在 bpo-26823

tracemalloc

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

新的 DomainFilter 已按地址空间(域)将筛选器类添加到筛选器块跟踪中。

(由Victor Stinner在 bpo-26588

打字

自从 typing 模块是 provisional ,python 3.6中引入的所有更改也都已返回到python 3.5.x。

这个 typing 模块对泛型类型别名的支持有了很大的改进。例如 Dict[str, Tuple[S, T]] 现在是有效的类型批注。(由Guido van Rossum在 Github #195

这个 typing.ContextManager 已添加类以表示 contextlib.AbstractContextManager .(布雷特·坎农在 bpo-25609

这个 typing.Collection 已添加类以表示 collections.abc.Collection . (Ivan Levkivskyi在 bpo-27598

这个 typing.ClassVar 类型构造已添加到标记类变量。如中所述 PEP 526 ,用classvar封装的变量注释表示给定属性将用作类变量,不应在该类的实例上设置。(Ivan Levkivskyi在 Github #280

一个新的 TYPE_CHECKING 假设为常数 True 通过静态类型检查程序,但是 False 在运行时。(由Guido van Rossum在 Github #230

一个新的 NewType() 已添加helper函数以创建注释的轻量级不同类型:

from typing import NewType

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

静态类型检查器会将新类型视为原始类型的子类。(Ivan Levkivskyi在 Github #189

unicodedata

这个 unicodedata 模块现在使用来自 Unicode 9.0.0 . (本杰明·彼得森供稿)

unittest.mock

这个 Mock 类有以下改进:

urllib.request

如果一个HTTP请求有一个文件或ITerable主体(字节对象除外),但没有 Content-Length 头,而不是抛出错误, AbstractHTTPHandler 现在返回使用分块传输编码。(德米安·布莱希特和罗尔夫·克莱尔在 bpo-12319

urllib.robotparser

RobotFileParser 现在支持 Crawl-delayRequest-rate 扩展。(由Nikolay Bogoychev在 bpo-16099

venv

venv 接受新参数 --prompt . 此参数为虚拟环境提供了一个可选的前缀。(由_Ukasz Balcerzak提出,由St_phane Wirtel于年移植至3.6) bpo-22829

警告

新选项 source 参数已添加到 warnings.warn_explicit() 功能:发出 ResourceWarning . 一 source 属性也已添加到 warnings.WarningMessage (由Victor Stinner在 bpo-26568bpo-26567

当A ResourceWarning 警告被记录, tracemalloc 模块现在用于尝试检索已销毁对象分配到的回溯。

脚本示例 example.py ::

import warnings

def func():
    return open(__file__)

f = func()
f = None

命令的输出 python3.6 -Wd -X tracemalloc=5 example.py ::

example.py:7: ResourceWarning: unclosed file <_io.TextIOWrapper name='example.py' mode='r' encoding='UTF-8'>
  f = None
Object allocated at (most recent call first):
  File "example.py", lineno 4
    return open(__file__)
  File "example.py", lineno 6
    f = func()

“对象分配位置”回溯是新的,仅当 tracemalloc 正在跟踪python内存分配,如果 warnings 模块已导入。

温雷格

添加了64位整数类型 REG_QWORD . (由Clement Rouault在 bpo-23026

winsound

允许将关键字参数传递给 BeepMessageBeepPlaySound (bpo-27982

xmlrpc.client

这个 xmlrpc.client 模块现在支持将ApacheXML-RPC实现用于数字和 None . (Serhiy Storchaka在 bpo-26885

压缩文件

一个新的 ZipInfo.from_file() 类方法允许 ZipInfo 文件系统文件中的实例。一个新的 ZipInfo.is_dir() 方法可用于检查 ZipInfo 实例表示一个目录。(托马斯·克鲁弗在 bpo-26039

这个 ZipFile.open() 方法现在可以用于将数据写入zip文件,也可以用于提取数据。(托马斯·克鲁弗在 bpo-26039

zlib

这个 compress()decompress() 函数现在接受关键字参数。(由Aviv Palivoda在 bpo-26243 和张翔在一起 bpo-16764 分别)。

优化

  • python解释器现在使用16位的字代码而不是字节码,这使得许多操作码优化成为可能。(由提出异议的Serhiy Storchaka和Victor Stinner在 bpo-26647bpo-28050

  • 这个 asyncio.Future 类现在有一个优化的C实现。(由Yury Selivanov和Inada Naoki在 bpo-26081

  • 这个 asyncio.Task 类现在有一个优化的C实现。(由Yury Selivanov在 bpo-28544

  • typing 模块(如通用类型的缓存)可实现高达30倍的性能改进和减少内存占用。

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

  • 对于错误处理程序来说,ASCII和Latin1编码器的速度现在高达3倍。 surrogateescape (由Victor Stinner在 bpo-25227

  • 对于错误处理程序来说,UTF-8编码器现在的速度是75倍。 ignorereplacesurrogateescapesurrogatepass (由Victor Stinner在 bpo-25267

  • 对于错误处理程序来说,UTF-8解码器现在的速度是15倍 ignorereplacesurrogateescape (由Victor Stinner在 bpo-25301

  • bytes % args 现在快了2倍。(由Victor Stinner在 bpo-25349

  • bytearray % args 现在快了2.5到5倍。(由Victor Stinner在 bpo-25399

  • 优化 bytes.fromhex()bytearray.fromhex() :现在速度在2到3.5倍之间。(由Victor Stinner在 bpo-25401

  • 优化 bytes.replace(b'', b'.')bytearray.replace(b'', b'.') :快80%。(乔希·斯奈德在 bpo-26574

  • 的分配器函数 PyMem_Malloc() 域 (PYMEM_DOMAIN_MEM )现在使用 pymalloc memory allocator 而不是 malloc() C库的功能。pymalloc分配器针对小于或等于512字节、寿命短的对象进行了优化,并使用 malloc() 对于更大的内存块。(由Victor Stinner在 bpo-26249

  • pickle.load()pickle.loads() 现在反序列化许多小对象(由Victor Stinner在 bpo-27056

  • 经过 keyword arguments 与传递相比,函数具有开销 positional arguments . 现在,在使用Argument Clinic实现的扩展函数中,这一开销显著减少。(Serhiy Storchaka在 bpo-27574

  • 优化 glob()iglob() 中的函数 glob 模块;它们现在大约快3-6倍。(Serhiy Storchaka在 bpo-25596

  • 优化的球化 pathlib 通过使用 os.scandir() ,现在大约快了1.5-4倍。(Serhiy Storchaka在 bpo-26032

  • xml.etree.ElementTree 解析、迭代和deepcopy性能显著提高。(Serhiy Storchaka在 bpo-25638bpo-25873bpo-25869

  • 创造 fractions.Fraction 浮点和小数的实例现在快了2到3倍。(Serhiy Storchaka在 bpo-25971

构建和C API更改

其他改进

  • 什么时候? --version (简称: -V )提供两次,python prints 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 ,并将触发 RuntimeError 在python 3.7中。参见 PEP 479:更改生成器内的停止迭代处理 有关详细信息。

这个 __aiter__() 方法现在应该直接返回异步迭代器,而不是像以前那样返回可等待的。做前者会触发 DeprecationWarning . 向后兼容性将在python 3.7中删除。(由Yury Selivanov在 bpo-27243

不是有效转义序列的反斜杠字符对现在生成一个 DeprecationWarning . 虽然这最终会成为 SyntaxError ,这将不适用于几个Python版本。(伊曼纽尔·巴里在 bpo-27364

执行相对导入时,返回 __name____path__ 从调用模块 __spec____package__ 现在未定义引发 ImportWarning . (由Rose Ames在 bpo-25791

不推荐使用的python模块、函数和方法

异步聊天

这个 asynchat 已弃用,赞成 asyncio . (由Mariatta在 bpo-25002

异步内核

这个 asyncore 已弃用,赞成 asyncio . (由Mariatta在 bpo-25002

数据库管理

不像其他 dbm 实施, dbm.dumb 模块使用创建数据库 'rw' 模式,并允许修改用 'r' 模式。此行为现在已弃用,将在3.8中删除。(Serhiy Storchaka在 bpo-21708

distutils

无证件者 extra_path 参数 Distribution 构造函数现在被视为已弃用,如果设置,将引发警告。对这个参数的支持将在将来的Python版本中被删除。见 bpo-27919 有关详细信息。

grp

支持中的非整数参数 getgrgid() 已弃用。(Serhiy Storchaka在 bpo-26129

importlib

这个 importlib.machinery.SourceFileLoader.load_module()importlib.machinery.SourcelessFileLoader.load_module() 方法现在已弃用。它们是 importlib.abc.Loader.load_module() 在里面 importlib 在以前的Python版本中,这一点没有被否决,取而代之的是 importlib.abc.Loader.exec_module() .

这个 importlib.machinery.WindowsRegistryFinder 类现在已弃用。从3.6.0开始,它仍然添加到 sys.meta_path 默认情况下(在Windows上),但在将来的版本中可能会改变。

操作系统

无文件证明的将军支持 bytes-like objects 作为路径 os 功能, compile() 类似的函数现在被否决了。(Serhiy Storchaka在 bpo-25791bpo-26754

重新

支持内联标志 (?letters) 在正则表达式的中间部分已被弃用,并将在将来的Python版本中删除。正则表达式开头的标志仍然是允许的。(Serhiy Storchaka在 bpo-22493

ssl

openssl 0.9.8、1.0.0和1.0.1已被弃用,不再受支持。在未来 ssl 模块至少需要openssl 1.0.2或1.1.0。

与SSL相关的参数,如 certfilekeyfilecheck_hostname 在里面 ftplibhttp.clientimaplibpoplibsmtplib 已弃用,赞成 context . (由Christian Heimes在 bpo-28022

一些协议和函数 ssl 模块现在已弃用。某些功能在将来的OpenSSL版本中将不再可用。其他功能不推荐使用其他API。(由Christian Heimes在 bpo-28022bpo-26470

tkinter

这个 tkinter.tix 模块现在已弃用。 tkinter 用户应该使用 tkinter.ttk 相反。

venv

这个 pyvenv 脚本已被弃用,取而代之的是 python3 -m venv . 这可以防止混淆什么是python解释器 pyvenv 连接到,因此虚拟环境将使用什么样的python解释器。(布雷特·坎农在 bpo-25154

C API的函数和类型已弃用

未记录的函数 PyUnicode_AsEncodedObject()PyUnicode_AsDecodedObject()PyUnicode_AsEncodedUnicode()PyUnicode_AsDecodedUnicode() 现已弃用。使用 generic codec based API 相反。

不推荐使用的生成选项

这个 --with-system-ffi 默认情况下,非MacOS UNIX平台上的配置标志现在处于打开状态。可通过使用禁用 --without-system-ffi ,但不推荐使用该标志,在Python3.7中不会接受该标志。MacOS不受这一变化的影响。请注意,许多OS发行商已经使用 --with-system-ffi 在构建其系统python时标记。

弃用

API和功能删除

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

  • inspect.getmoduleinfo() 已删除(自CPython 3.3以来已弃用)。 inspect.getmodulename() 应用于获取给定路径的模块名。(由Yury Selivanov在 bpo-13248

  • traceback.Ignore 类和 traceback.usagetraceback.modnametraceback.fullmodnametraceback.find_lines_from_codetraceback.find_linestraceback.find_stringstraceback.find_executable_lines 方法已从 traceback 模块。由于python 3.2和私有方法中提供的等效功能,因此这些方法被弃用了。

  • 这个 tk_menuBar()tk_bindForTraversal() 中的虚拟方法 tkinter 小部件类被删除(相应的tk命令自tk 4.0以来已过时)。

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

  • 无证件者 INCDROMDLFCNTYPESCDIOSTROPTS 模块已被移除。它们在特定平台中可用 Lib/plat-*/ 目录,但长期过时,跨平台不一致可用,未维护。创建这些模块的脚本在源分发中仍然可用,位于 Tools/scripts/h2py.py .

  • 被蔑视的 asynchat.fifo 类已被删除。

移植到python 3.6

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

“python”命令行为的更改

  • 使用定义的 COUNT_ALLOCSSHOW_ALLOC_COUNTSHOW_TRACK_COUNT 默认情况下,宏现在处于关闭状态。可以使用 -X showalloccount 选择权。它现在输出到 stderr 而不是 stdout . (Serhiy Storchaka在 bpo-23034

python api中的更改

  • open() 将不再允许组合 'U' 模式标志 '+' . (由Jeff Balogh和John O'Connor在 bpo-2091

  • sqlite3 在DDL语句之前不再隐式提交打开的事务。

  • 在Linux上, os.urandom() 现在阻塞,直到系统urandom熵池初始化以提高安全性。

  • 什么时候? importlib.abc.Loader.exec_module() 定义, importlib.abc.Loader.create_module() 还必须定义。

  • PyErr_SetImportError() 现在集 TypeError 当其 msg 参数未设置。以前只 NULL 回来了。

  • 的格式 co_lnotab 代码对象的属性已更改为支持负数的行号增量。默认情况下,python不会发出带有负数delta的字节码。使用函数 frame.f_linenoPyFrame_GetLineNumber()PyCode_Addr2Line() 不受影响。函数直接解码 co_lnotab 应该更新为对行号增量使用带符号的8位整数类型,但这只是支持使用负数行号增量的应用程序所必需的。见 Objects/lnotab_notes.txt 对于 co_lnotab 格式和如何解码,并查看 PEP 511 理由是。

  • 中的函数 compileall 模块现在返回布尔值而不是 10 分别代表成功或失败。由于booleans是整数的子类,因此只有在对 10 . 见 bpo-25768 .

  • 阅读 port 属性 urllib.parse.urlsplit()urlparse() 结果现在提高了 ValueError 对于超出范围的值,而不是返回 None . 见 bpo-20059 .

  • 这个 imp 模块现在引发 DeprecationWarning 而不是 PendingDeprecationWarning .

  • 以下模块缺少添加到其 __all__ 与文档化API匹配的属性: calendarcgicsvElementTreeenumfileinputftplibloggingmailboxmimetypesoptparseplistlibsmtpdsubprocesstarfilethreadingwave . 这意味着当 import * 使用。(由Joel Taddei和Jacek Ko_Odziej在 bpo-23883

  • 执行相对导入时,如果 __package__ 不比较等于 __spec__.parent 然后 ImportWarning 提高了。(布雷特·坎农在 bpo-25791

  • 当执行相对导入且不知道父包时,则 ImportError 将被引发。以前, SystemError 可以被引发。(布雷特·坎农在 bpo-18018

  • 基于的服务器 socketserver 模块,包括 http.serverxmlrpc.serverwsgiref.simple_server ,现在只捕获派生自 Exception . 因此,如果请求处理程序引发异常 SystemExitKeyboardInterrupthandle_error() 不再调用,异常将停止单线程服务器。(马丁·潘特在 bpo-23430

  • spwd.getspnam() 现在提出一个 PermissionError 而不是 KeyError 如果用户没有权限。

  • 这个 socket.socket.close() 如果出现错误(例如 EBADF )由基础系统调用报告。(马丁·潘特在 bpo-26685

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

  • 的所有可选参数 dump()dumps()load()loads() 功能和 JSONEncoderJSONDecoder 中的类构造函数 json 模块现在 keyword-only . (Serhiy Storchaka在 bpo-18726

  • 亚类 type 这不会覆盖 type.__new__ 不能再使用一个参数窗体获取对象的类型。

  • 作为一部分 PEP 487 ,传递给的关键字参数的处理 type (元类提示除外, metaclass )现在一直授权给 object.__init_subclass__() . 这意味着 type.__new__()type.__init__() 现在两者都接受任意关键字参数,但是 object.__init_subclass__() (从 type.__new__() )默认情况下将拒绝它们。接受其他关键字参数的自定义元类需要将其调用调整为 type.__new__() (无论是直接还是通过 super )因此。

  • distutils.command.sdist.sdist , the default_format 属性已被删除,不再使用。相反,gzipped tarfile格式是所有平台上的默认格式,不进行特定于平台的选择。在需要在Windows和Zip分发版上构建分发版的环境中,使用 setup.cfg 包含以下内容的文件:

    [sdist]
    formats=zip
    

    此行为也已由SETUPTOOLS 26.0.0返回到早期的Python版本。

  • urllib.request 模块与 http.client.HTTPConnection.request() 方法,如果未指定Content-Length头字段,并且请求主体是文件对象,则现在使用HTTP 1.1分块编码发送。如果必须将文件对象发送到HTTP 1.0服务器,则内容长度值现在必须由调用方指定。(由德米安·布莱希特和罗尔夫·克莱尔贡献,马丁·潘特在 bpo-12319

  • 这个 DictReader 现在返回类型为的行 OrderedDict . (由Steve Holden在 bpo-27842

  • 这个 crypt.METHOD_CRYPT 将不再添加到 crypt.methods 如果平台不支持。(由Victor Stinner在 bpo-25287

  • 这个 verbose重命名 参数的理由 namedtuple() 现在只显示关键字。(由Raymond Hettinger在 bpo-25628

  • 在Linux上, ctypes.util.find_library() 现在看着 LD_LIBRARY_PATH 对于共享库。(由Vinay Sajip在 bpo-9998

  • 这个 imaplib.IMAP4 类现在处理包含 ']' 从服务器发送的消息中的字符,以提高实际的兼容性。(利塔·乔在 bpo-21815

  • 这个 mmap.write() 函数现在返回像其他写入方法一样写入的字节数。(Jakub Stasiak在 bpo-26335

  • 这个 pkgutil.iter_modules()pkgutil.walk_packages() 函数现在返回 ModuleInfo 命名元组。(由Ramchandra Apte在 bpo-17211

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

  • zipfile.ZipFile 现在将提高 NotImplementedError 对于无法识别的压缩值。以前是平原 RuntimeError 被引发了。另外,拨打 ZipFile 方法,或调用 write() 使用模式创建的ZipFile上的方法 'r' 将提高 ValueError . 以前,A RuntimeError 在这些情况下被提出。

  • 当自定义元类与零参数组合时 super() 或者直接引用方法到隐式 __class__ 闭包变量,隐式 __classcell__ 命名空间项现在必须传递到 type.__new__ 用于初始化。不这样做将导致 DeprecationWarning 在python 3.6和a中 RuntimeError 在Python 3.8中。

  • 随着 ModuleNotFoundError ,导入系统使用者可能开始期望导入系统替换在适当时引发更具体的异常,而不是更不具体的异常。 ImportError . 为了与这些消费者提供未来的兼容性,替代输入系统的实施者将完全取代 __import__() 当一个模块根本找不到时,需要更新它们的实现来引发新的子类。默认导入系统的兼容插件的实现者不需要做任何更改,因为默认导入系统将在适当的时候引发新的子类。

C API中的更改

cpython字节码更改

bytecode 在Python 3.6中。

python 3.6.2的显著变化

新的 make regen-all 建立目标

为了简化交叉编译,并确保在不需要现有的python版本可用的情况下可靠地编译cpython,基于autotools的构建系统不再尝试根据文件修改时间隐式地重新编译生成的文件。

相反,一个新的 make regen-all 已添加命令以在需要时强制重新生成这些文件(例如,在基于预生成版本构建了Python的初始版本之后)。

还定义了更多选择性再生目标-参见 Makefile.pre.in 有关详细信息。

(由Victor Stinner在 bpo-23404

3.6.2 新版功能.

移除 make touch 建立目标

这个 make touch 以前用于通过更新所生成文件的修改时间请求隐式重新生成的生成目标已被删除。

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

(由Victor Stinner在 bpo-23404

在 3.6.2 版更改.

python 3.6.4的显著变化

这个 PyExc_RecursionErrorInst 作为公共API的一部分的singleton已被删除,因为其成员从未被清除可能会在解释器完成时导致segfault。(Xavier de Gaye在 bpo-22898bpo-30697

python 3.6.5的显著变化

这个 locale.localeconv() 函数现在临时设置 LC_CTYPE 本地化到 LC_NUMERIC 某些情况下的区域设置。(由Victor Stinner在 bpo-31900

python 3.6.7的显著变化

在3.6 tokenize 模块现在隐式地发出 NEWLINE 当输入没有尾随新行时提供标记。这种行为现在与C记号赋予器在内部所做的相匹配。(安马尔·阿斯卡尔在 bpo-33899

Python 3.6.10中的显著变化

由于重大安全问题 reuse_address 参数 asyncio.loop.create_datagram_endpoint() 不再支持。这是因为socket选项的行为 SO_REUSEADDR 在UDP中。有关详细信息,请参阅 loop.create_datagram_endpoint() . (作者:凯尔·斯坦利、安托万·皮特罗和尤里·塞利万诺夫 bpo-37228