python 3.7的新功能

编辑

埃尔维斯·普兰斯基·维奇<elvis@magic.io>

本文解释了与3.6相比,python 3.7中的新特性。python 3.7于2018年6月27日发布。有关详细信息,请参阅 changelog .

总结——发布亮点

新语法功能:

  • PEP 563 ,推迟了类型批注的计算。

向后不兼容的语法更改:

新库模块:

新的内置功能:

python数据模型改进:

  • PEP 562 ,自定义对模块属性的访问。

  • PEP 560 ,对类型模块和泛型类型的核心支持。

  • 插入顺序保存性质 dict 物体 has been declared 作为Python语言规范的正式部分。

标准库的重大改进:

CPython实施改进:

C API改进:

  • PEP 539 ,用于线程本地存储的新C API

文件改进:

这个版本在许多方面都有显著的性能改进。这个 优化 部分详细列出了它们。

有关可能影响与早期Python版本兼容性的更改列表,请参阅 移植到python 3.7 部分。

新特点

PEP 563:注释的延期评估

python中类型提示的出现揭示了两个突出的可用性问题,即添加注释的功能。 PEP 3107 并进一步完善 PEP 526

  • 注释只能使用当前作用域中已经可用的名称,换句话说,它们不支持任何类型的前向引用;并且

  • 注释源代码对python程序的启动时间有不利影响。

这两个问题都是通过推迟注释的评估来解决的。编译器不编译在定义时在注释中执行表达式的代码,而是将注释以字符串形式存储,该字符串形式等同于所讨论表达式的ast。如果需要,可以在运行时使用 typing.get_type_hints() .在不需要这样做的常见情况下,注释存储起来更便宜(因为短字符串由解释器内部保存),并且使启动时间更快。

可用性方面,注释现在支持前向引用,使以下语法有效:

class C:
    @classmethod
    def from_string(cls, source: str) -> C:
        ...

    def validate_b(self, obj: B) -> bool:
        ...

class B:
    ...

由于这种更改破坏了兼容性,因此需要在Python3.7中使用 __future__ 输入:

from __future__ import annotations

它将成为Python3.10中的默认值。

参见

PEP 563 --批注的延迟评估

PEP由_Ukasz Langa编写和实施。

PEP 538:传统C区域强制

python 3系列中的一个持续的挑战是确定一个明智的默认策略来处理“7位ascii”文本编码假设,当前这是在非Windows平台上使用默认的c或posix语言环境所暗示的。

PEP 538 更新默认的解释器命令行接口,自动将该区域设置强制为基于utf-8的可用区域设置,如新文档中所述 PYTHONCOERCECLOCALE 环境变量。自动设置 LC_CTYPE 这意味着核心解释器和支持区域设置的C扩展(例如 readline )将假定使用UTF-8作为默认文本编码,而不是使用ASCII。

中的平台支持定义 PEP 11 也被更新为将全文处理支持限制为适当配置的非基于ASCII的区域设置。

作为此更改的一部分,的默认错误处理程序 stdinstdout 现在是 surrogateescape (而不是 strict )使用任何定义的强制目标区域设置时(当前 C.UTF-8C.utf8UTF-8 )的默认错误处理程序 stderr 继续 backslashreplace ,不考虑区域设置。

默认情况下,区域设置强制是无声的,但为了帮助调试可能与区域设置相关的集成问题,显式警告(直接在 stderr )可通过设置请求 PYTHONCOERCECLOCALE=warn . 如果旧的C语言环境在核心解释器初始化时保持活动状态,此设置还将导致python运行时发出警告。

同时 PEP 538 的区域设置强制还可以影响扩展模块(如GNU) readline 以及子进程(包括运行非Python应用程序和旧版本的Python的进程),它的缺点是要求在运行的系统上存在合适的目标区域设置。为了更好地处理没有合适的目标区域设置的情况(例如,在RHEL/CentOS 7上发生的情况),python 3.7还实现了 PEP 540:强制UTF-8运行时模式 .

参见

PEP 538 --将旧的C区域设置强制为基于UTF-8的区域设置

PEP由Nick Coghlan编写并实施。

PEP 540:强制UTF-8运行时模式

新的 -X utf8 命令行选项和 PYTHONUTF8 环境变量可用于启用 Python UTF-8 Mode

在UTF-8模式下,cpython忽略区域设置,默认情况下使用UTF-8编码。的错误处理程序 sys.stdinsys.stdout 流设置为 surrogateescape .

强制的UTF-8模式可以用来更改嵌入的Python解释器中的文本处理行为,而无需更改嵌入应用程序的区域设置。

同时 PEP 540 的utf-8模式具有工作的好处,不管运行系统上有哪些可用的区域设置,它的缺点是对扩展模块(如GNU)没有影响 readline ,运行非python应用程序的子进程,以及运行旧版本python的子进程。为了降低与这些组件通信时损坏文本数据的风险,python 3.7还实现了 PEP 540:强制UTF-8运行时模式

当区域设置为 CPOSIXPEP 538 区域设置强制功能无法将其更改为基于UTF-8的替代项(无论该失败是否由于 PYTHONCOERCECLOCALE=0 被设定, LC_ALL 正在设置,或缺少合适的目标区域设置)。

参见

PEP 540 --添加新的UTF-8模式

由Victor Stinner编写和实现

PEP 553:内置 breakpoint()

python 3.7包含了新的内置 breakpoint() 作为进入Python调试器的一种简单而一致的方法。

内置的 breakpoint() 调用 sys.breakpointhook() . 默认情况下,后者导入 pdb 然后调用 pdb.set_trace() ,但通过绑定 sys.breakpointhook() 为了你的选择, breakpoint() 可以输入任何调试器。此外,环境变量 PYTHONBREAKPOINT 可以设置为所选调试器的可调用项。集合 PYTHONBREAKPOINT=0 完全禁用内置 breakpoint() .

参见

PEP 553 --内置断点()

由巴里·华沙编写和实现

PEP 539:用于线程本地存储的新C API

而python为线程本地存储支持提供了C API;现有的 Thread Local Storage (TLS) API 已使用 int 在所有平台上表示TLS密钥。对于正式的支持平台来说,这通常不是一个问题,但是这既不符合POSIX,也不具有任何实际意义上的可移植性。

PEP 539 通过提供新的 Thread Specific Storage (TSS) API 替换cpython解释器中现有tls api的cpython,同时弃用现有api。TSS API使用新类型 Py_tss_t 而不是 int 表示TSS密钥——一种不透明的类型,其定义可能取决于底层的TLS实现。因此,这将允许在以无法安全地强制转换到的方式定义本机TLS密钥的平台上构建CPython。 int .

请注意,在以无法安全地强制转换到的方式定义本机TLS密钥的平台上 int ,现有的tls api的所有函数都将是no op并立即返回failure。这清楚地表明,旧的API在不能可靠使用的平台上不受支持,并且不会努力添加这种支持。

参见

PEP 539 --cpython中线程本地存储的新C-API

由Erik M.Bray编写的PEP;由Yamayuki Yamamoto实施。

PEP 562:模块属性访问的自定义

python 3.7允许定义 __getattr__() 并将在未找到模块属性时调用它。定义 __dir__() 现在也允许在模块上。

其中一个可能有用的典型例子是模块属性取消预测和延迟加载。

参见

PEP 562 -- Module __getattr__ and __dir__

由Ivan Levkivskyi编写和实现

PEP 564:纳秒分辨率的新时间函数

现代系统中时钟的分辨率可以超过由 time.time() 函数及其变体。为了避免精度损失, PEP 564 将现有计时器函数的六个新“纳秒”变量添加到 time 模块:

新函数将纳秒数作为整数值返回。

Measurements 在Linux和Windows上显示 time.time_ns() 大约是 time.time() .

参见

PEP 564 --添加具有纳秒分辨率的新时间函数

由Victor Stinner编写和实现

PEP 565:显示DeprecationWarning 在``__main__``中

默认处理 DeprecationWarning 已更改,以便在默认情况下再次显示这些警告,但仅当触发这些警告的代码直接在 __main__ 模块。因此,单文件脚本的开发人员和交互使用python的开发人员应该再次看到他们所使用的API的拒绝警告,但是由导入的应用程序、库和框架模块触发的拒绝警告在默认情况下将继续隐藏。

由于这种变化,标准库现在允许开发人员在三种不同的拒绝警告行为之间进行选择:

  • FutureWarning :默认情况下始终显示,建议应用程序最终用户看到的警告(例如,对于不推荐使用的应用程序配置设置)。

  • DeprecationWarning :默认情况下仅显示在 __main__ 当运行测试时,建议其他Python开发人员看到警告,在这些警告中,版本升级可能导致行为改变或错误。

  • PendingDeprecationWarning :仅在运行测试时默认显示,用于将来版本升级将警告类别更改为的情况 DeprecationWarningFutureWarning .

以前两者 DeprecationWarningPendingDeprecationWarning 只有在运行测试时才可见,这意味着主要编写单文件脚本或交互使用Python的开发人员可能会对中断所使用的API中的更改感到惊讶。

参见

PEP 565 -- Show DeprecationWarning in __main__

由Nick Coghlan编写和实现

PEP 560:核心支持 typing 模块和通用类型

最初 PEP 484 其设计方式不会引入 any 对核心cpython解释器的更改。现在键入提示和 typing 模块被社区广泛使用,因此这一限制被取消。PEP介绍了两种特殊的方法 __class_getitem__()__mro_entries__ 中的大多数类和特殊构造现在都使用这些方法 typing . 因此,各种类型操作的速度提高了7倍,通用类型可以在没有元类冲突的情况下使用,并且在 typing 模块是固定的。

参见

PEP 560 --对类型模块和泛型类型的核心支持

由Ivan Levkivskyi编写和实现

PEP552:基于hash的.pyc文件

传统上,python会检查字节码缓存文件的最新版本(即, .pyc 文件)通过将源元数据(上次修改的时间戳和大小)与生成时保存在缓存文件头中的源元数据进行比较。这种失效方法虽然有效,但也有其缺点。当文件系统时间戳太粗糙时,python可能会错过源代码更新,从而导致用户混淆。此外,缓存文件中的时间戳对于 build reproducibility 以及基于内容的构建系统。

PEP 552 扩展pyc格式以允许源文件的散列用于无效化,而不是源时间戳。这样 .pyc 文件称为“基于hash”。默认情况下,python仍然使用基于时间戳的无效化,并且不生成基于hash的 .pyc 运行时的文件。基于hash的 .pyc 文件可以用 py_compilecompileall .

基于hash的 .pyc 文件有两种变体:选中和未选中。python验证基于检查hash的 .pyc 运行时针对相应源文件的文件,但不针对未选中的基于hash的Pyc执行此操作。未选中的基于hash的 .pyc 对于由Python外部的系统(例如,构建系统)负责保存的环境,文件是一种有用的性能优化。 .pyc 最新文件。

缓存字节码无效 更多信息。

参见

PEP 552 --确定性Pycs

由Benjamin Peterson编写和实现

PEP 545:python文档翻译

PEP 545 描述创建和维护Python文档翻译的过程。

增加了三个新翻译:

参见

PEP 545 --python文档翻译

PEP由Julien Palard、Inada Naoki和Victor Stinner编写并实施。

Python开发模式(-X dev)

新的 -X dev 命令行选项或新的 PYTHONDEVMODE 环境变量可用于启用 Python Development Mode . 在开发模式下,Python会执行额外的运行时检查,这些检查的成本太高,默认情况下无法启用。见 Python Development Mode 完整描述的文档。

其他语言更改

  • await 包含 async for 子句在中的表达式中是非法的 formatted string literals 因为执行过程中的问题。在Python3.7中,这个限制被解除了。

  • 现在可以向一个函数传递超过255个参数,一个函数现在可以有超过255个参数。(Serhiy Storchaka在 bpo-12844bpo-18896

  • bytes.fromhex()bytearray.fromhex() 现在忽略所有的ASCII空白,而不仅仅是空格。(罗伯特·肖恩供稿) bpo-28927

  • strbytesbytearray 为新产品赢得支持 isascii() 方法,该方法可用于测试字符串或字节是否只包含ASCII字符。(Inada Naoki在 bpo-32677

  • ImportError 现在显示模块名称和模块 __file__ path when from ... import ... 失败。(由Matthias Bussonnier在 bpo-29546

  • 现在支持循环导入,包括将子模块绑定到名称的绝对导入。(Serhiy Storchaka在 bpo-30024

  • object.__format__(x, '') 现在等于 str(x) 而不是 format(str(self), '') . (Serhiy Storchaka在 bpo-28974

  • 为了更好地支持动态创建堆栈跟踪, types.TracebackType 现在可以从python代码实例化, tb_next 属性对 tracebacks 现在可写。(Nathaniel J.Smith在 bpo-30579

  • 当使用 -m 开关, sys.path[0] 现在迫切地扩展到完整的起始目录路径,而不是保留为空目录(允许从 现在的 导入时的工作目录(由Nick Coghlan在 bpo-33053

  • 新的 -X importtime 选项或 PYTHONPROFILEIMPORTTIME 环境变量可用于显示每个模块导入的时间。(由Victor Stinner在 bpo-31415

新模块

上下文变量

新的 contextvars 模块和一套 new C APIs 介绍对的支持 上下文变量 . 上下文变量在概念上类似于线程局部变量。与TLS不同,上下文变量正确支持异步代码。

这个 asynciodecimal 模块已经更新,可以使用和支持开箱即用的上下文变量。尤其是活动的十进制上下文现在存储在一个上下文变量中,它允许十进制操作在异步代码中使用正确的上下文。

参见

PEP 567 --上下文变量

由Yury Selivanov编写和实现

数据包

新的 dataclass() decorator提供了一种声明 数据类 . 数据类使用类变量注释描述其属性。它的构造函数和其他神奇的方法,例如 __repr__()__eq__()__hash__() 自动生成。

例子::

@dataclass
class Point:
    x: float
    y: float
    z: float = 0.0

p = Point(1.5, 2.5)
print(p)   # produces "Point(x=1.5, y=2.5, z=0.0)"

参见

PEP 557 --数据类

由Eric V.Smith编写和实现

importlib.resources

新的 importlib.resources 模块提供了几个新的API和一个新的ABC,用于访问、打开和阅读 资源 封装内。资源与包中的文件大致相似,但它们不必是物理文件系统上的实际文件。模块加载器可以提供 get_resource_reader() 返回一个 importlib.abc.ResourceReader 实例以支持此新API。内置的文件路径加载器和zip文件加载器都支持这一点。

巴里·华沙和布雷特·坎农在 bpo-32248 .

参见

importlib_resources --用于早期Python版本的pypi后端。

改进的模块

argparse

新的 ArgumentParser.parse_intermixed_args() 方法允许混合使用选项和位置参数。(由Paul.J3于 bpo-14191

asyncio

这个 asyncio 模块已经收到许多新的功能、可用性和 performance improvements .显著变化包括:

几个 asyncio API已被 deprecated .

binascii

这个 b2a_uu() 函数现在接受一个可选的 backtick 关键字参数。当它为真时,零表示为 '`' 而不是空格。(由张翔于 bpo-30103

日历

这个 HTMLCalendar 类具有新的类属性,可以方便地在生成的HTML日历中自定义CSS类。(由Oz Tiram在 bpo-30095

收藏

collections.namedtuple() 现在支持默认值。(由Raymond Hettinger在 bpo-32320

编译所有

compileall.compile_dir() 学会了新的 invalidation_mode 参数,可用于启用 hash-based .pyc invalidation .也可以在命令行上使用新的 --invalidation-mode 参数。(本杰明·彼得森于 bpo-31650

concurrent.futures

ProcessPoolExecutorThreadPoolExecutor 现在支持新的 初始化器伊尼塔格斯 构造函数参数。(由Antoine Pitrou在 bpo-21423

这个 ProcessPoolExecutor 现在可以通过新的 mp_context 参数。(由Thomas Moreau在 bpo-31540

contextlib

新的 nullcontext() 是一个简单和快速的无操作上下文管理器 ExitStack . (由Jesse Bakker在 bpo-10049

新的 asynccontextmanager()AbstractAsyncContextManagerAsyncExitStack 已添加以补充它们的同步对应项。(由Jelle Zijlstra在 bpo-29679bpo-30241 亚历山大·莫尔和伊利亚·库拉科夫 bpo-29302

cProfile

这个 cProfile 命令行现在接受 -m module_name 作为脚本路径的替代。(由Sanyam Khurana在 bpo-21862

crypt

这个 crypt 模块现在支持Blowfish散列方法。(Serhiy Storchaka在 bpo-31664

这个 mksalt() 函数现在允许指定hash的循环数。(Serhiy Storchaka在 bpo-31702

日期时间

新的 datetime.fromisoformat() 方法构造 datetime 对象,该对象来自输出格式之一的字符串 datetime.isoformat() . (由Paul Ganssle在 bpo-15873

这个 tzinfo 类现在支持次分钟偏移量。(亚历山大·伯罗波尔斯基于年 bpo-5288

数据库管理

dbm.dumb 现在支持只读文件的读取,并且在索引文件未更改时不再写入索引文件。

十进制的

这个 decimal 模块现在使用 context variables 存储十进制上下文。(由Yury Selivanov在 bpo-32630

数字化信息系统

这个 dis() 函数现在可以分解嵌套的代码对象(理解代码、生成器表达式和嵌套函数,以及用于构建嵌套类的代码)。反汇编递归的最大深度由新的 深度 参数。(Serhiy Storchaka在 bpo-11822

distutils

README.rst 现在包含在distuils标准自述文件列表中,因此包含在源发行版中。(由Ryan Gonzalez在 bpo-11913

枚举

这个 Enum 学会了新的 _ignore_ 类属性,它允许列出不应成为枚举成员的属性的名称。(伊桑·弗曼在 bpo-31801

在python 3.8中,尝试在 Enum 课程将提高 TypeError (例如) 1 in Color );同样,尝试检查 Flag 会员将提高 TypeError (例如) 1 in Perm.RW );当前,两个操作都返回 False 相反,和被弃用。(伊桑·弗曼在 bpo-33217

功能工具

functools.singledispatch() 现在支持使用类型注释注册实现。(由Ukasz Langa在 bpo-32227

GC

新的 gc.freeze() 函数允许冻结垃圾收集器跟踪的所有对象,并将其从将来的集合中排除。这可以在posix之前使用 fork() 调用以使gc copy-on-write更友好或加快收集速度。新的 gc.unfreeze() 函数反转此操作。此外, gc.get_freeze_count() 可用于获取冻结对象的数量。(李泽坤在 bpo-31558

hmac

这个 hmac 模块现在有一个优化的单发。 digest() 功能,比 HMAC() . (由Christian Heimes在 bpo-32433

http.client

HTTPConnectionHTTPSConnection 现在支持新的 块状 提高上传吞吐量的理由。(Nir Soffer在 bpo-31945

http.server

SimpleHTTPRequestHandler 现在支持HTTP If-Modified-Since 标题。如果目标文件在头中指定的时间之后未被修改,服务器将返回304响应状态。(由Pierre Quentel在 bpo-29654

SimpleHTTPRequestHandler 接受新 目录 参数,除了新的 --directory 命令行参数。使用此参数,服务器将为指定的目录提供服务,默认情况下,它使用当前工作目录。(由圣潘·威特尔和朱利安·帕拉德于 bpo-28707

新的 ThreadingHTTPServer 类使用线程处理请求 ThreadingMixin . 使用时 http.server 运行与 -m . (朱利安帕拉德在 bpo-31639

idlelib和idle

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

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

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

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

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

编辑代码上下文选项已修订。框显示所有上下文行,最多可显示最大行。单击上下文行会将编辑器跳到该行。自定义主题的上下文颜色将添加到“设置”对话框的“突出显示”选项卡中。(由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.7.1中的新内容:

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

以上更改已返回到3.6维护版本。

3.7.4新增:

将“运行自定义”添加到“运行”菜单以运行具有自定义设置的模块。输入的任何命令行参数都将添加到sys.argv。它们将重新出现在下一次自定义运行的框中。也可以抑制正常的Shell主模块重启。(由Cheryl Sabella、Terry Jan Reedy和其他 bpo-5680bpo-37627

3.7.5中的新功能:

为空闲编辑器窗口添加可选行号。除非在“配置”对话框的“常规”选项卡中另有设置,否则窗口将不带行号打开。现有窗口的行号将显示并隐藏在“选项”菜单中。(Tal Einat和Saimadhav Heblikar在 bpo-17535

importlib

这个 importlib.abc.ResourceReader 引入ABC来支持从包中加载资源。也见 importlib.resources . (巴里·华沙,布雷特·坎农在 bpo-32248

importlib.reload() 现在提出 ModuleNotFoundError 如果模块缺少规格(由Garvit Khatri在 bpo-29851

importlib.find_spec() 现在提出 ModuleNotFoundError 而不是 AttributeError 如果指定的父模块不是包(即缺少 __path__ 属性)。(米兰奥伯基赫在 bpo-30436

新的 importlib.source_hash() 可用于计算传递源的hash。一 hash-based .pyc file 嵌入此函数返回的值。

输入输出

新的 TextIOWrapper.reconfigure() 方法可用于用新设置重新配置文本流。(由Antoine Pitrou在 bpo-30526 和稻田直木在 bpo-15216

IP地址

新的 subnet_of()supernet_of() 方法 ipaddress.IPv6Networkipaddress.IPv4Network 可用于网络包含测试。(Michel Albert和Cheryl Sabella在 bpo-20825

迭代工具

itertools.islice() 现在接受 integer-like objects 作为开始、停止和切片参数。(由威尔·罗伯茨在 bpo-30537

locale

新的 monetary 参数 locale.format_string() 可用于使转换使用货币千位分隔符和分组字符串。(由Garvit在 bpo-10379

这个 locale.getpreferredencoding() 函数现在总是返回 'UTF-8' 在Android上或在 forced UTF-8 mode .

登录

Logger 现在可以酸洗实例。(由Vinay Sajip在 bpo-30520

新的 StreamHandler.setStream() 方法可用于在创建处理程序后替换记录器流。(由Vinay Sajip在 bpo-30522

现在可以在传递给的配置中为处理程序构造函数指定关键字参数。 logging.config.fileConfig() . (由Preston Landers在 bpo-31080

数学

新的 math.remainder() 函数实现IEEE754样式的余数操作。(马克·狄金森在 bpo-29962

拟态

.bmp的mime类型已从更改为 'image/x-ms-bmp''image/bmp' . (由Nitish Chandra在 bpo-22589

msilib

新的 Database.Close() 方法可用于关闭 MSI 数据库。(由Berker Peksag在 bpo-20486

多重处理

新的 Process.close() 方法显式关闭流程对象并释放与其关联的所有资源。 ValueError 如果基础进程仍在运行,则引发。(由Antoine Pitrou在 bpo-30596

新的 Process.kill() 方法可用于使用 SIGKILL Unix上的信号。(由Vitor Pereira在 bpo-30794

由创建的非后台线程 Process 现在在进程退出时加入。(由Antoine Pitrou在 bpo-18966

操作系统

os.fwalk() 现在接受 path 论证为 bytes . (Serhiy Storchaka在 bpo-28682

os.scandir() 获得支持 file descriptors . (Serhiy Storchaka在 bpo-25996

新的 register_at_fork() 函数允许在进程复刻处执行注册python回调。(由Antoine Pitrou在 bpo-16500

补充 os.preadv() (结合 os.readv()os.pread()os.pwritev() 功能(结合 os.writev()os.pwrite() )。(Pablo Galindo在 bpo-31368

模式参数 os.makedirs() 不再影响新创建的中间级目录的文件权限位。(Serhiy Storchaka在 bpo-19930

os.dup2() 现在返回新的文件描述符。以前, None 总是返回。(本杰明·彼得森于 bpo-32441

返回的结构 os.stat() 现在包含 st_fstype Solaris及其派生产品的属性。(由Jes_s Cea Avi_n在 bpo-32659

pathlib

新的 Path.is_mount() 方法现在在POSIX系统上可用,可以用来确定路径是否是装入点。(由Cooper Ry Lees在 bpo-30897

pdb

pdb.set_trace() 现在选择一个选项 *header*仅关键字参数。如果给定,它将在调试开始前打印到控制台。(巴里·华沙在 bpo-31389

pdb 命令行现在接受 -m module_name 作为脚本文件的替代。(马里奥·科切罗在 bpo-32206

py_compile

py_compile.compile() --再进一步说, compileall --现在尊重 SOURCE_DATE_EPOCH 无条件创建的环境变量 .pyc 用于基于hash的验证的文件。这样可以保证 reproducible builds 属于 .pyc 当文件被急切地创建时。(由Bernhard M.Wiedemann于 bpo-29708

pydoc

Pydoc服务器现在可以绑定到由新的 -n 命令行参数。(Feanil Patel在 bpo-31128

队列

新的 SimpleQueue 类是无边界的 FIFO 排队。(由Antoine Pitrou在 bpo-14976

重新

flag re.ASCIIre.LOCALEre.UNICODE 可以在组范围内设置。(Serhiy Storchaka在 bpo-31690

re.split() 现在支持像 r'\b''^$'(?=-) 与空字符串匹配。(Serhiy Storchaka在 bpo-25054

用编译的正则表达式 re.LOCALE 标志在编译时不再依赖于区域设置。仅当使用已编译的正则表达式时才应用区域设置。(Serhiy Storchaka在 bpo-30215

FutureWarning 如果正则表达式包含将来会发生语义变化的字符集构造(如嵌套集和集操作),则现在发出。(Serhiy Storchaka在 bpo-30349

现在可以使用 copy.copy()copy.deepcopy() . (Serhiy Storchaka在 bpo-10076

信号

新的 warn_on_full_buffer 参数 signal.set_wakeup_fd() 函数使指定当唤醒缓冲区溢出时,python是否在stderr上打印警告成为可能。(Nathaniel J.Smith在 bpo-30050

Socket

新的 socket.getblocking() 方法返回 True 如果Socket处于阻塞模式,并且 False 否则。(由Yury Selivanov在 bpo-32373

新的 socket.close() 函数关闭传递的套接字文件描述符。应使用此函数而不是 os.close() 以便在不同平台之间实现更好的兼容性。(由Christian Heimes在 bpo-32454

这个 socket 模块现在显示 socket.TCP_CONGESTION (Linux 2.613) socket.TCP_USER_TIMEOUT (Linux 2.6.37),以及 socket.TCP_NOTSENT_LOWAT (Linux 3.12)常量。(奥马尔·桑多瓦尔在 bpo-26273 纳撒尼尔J史密斯在 bpo-29728

支持 socket.AF_VSOCK 已添加套接字以允许虚拟机与其主机之间进行通信。(由凯西·艾弗里在 bpo-27584

默认情况下,套接字现在从文件描述符自动检测族、类型和协议。(由Christian Heimes在 bpo-28134

socketserver

socketserver.ThreadingMixIn.server_close() 现在等待所有非守护进程线程完成。 socketserver.ForkingMixIn.server_close() 现在等待所有子进程完成。

添加新的 socketserver.ForkingMixIn.block_on_close 类属性到 socketserver.ForkingMixInsocketserver.ThreadingMixIn 类。将class属性设置为 False 以获得3.7之前的行为。

sqlite3

sqlite3.Connection 现在暴露 backup() 方法,当基础sqlite库位于3.6.11或更高版本时。(Lele Gaifax在 bpo-27645

这个 database 的参数 sqlite3.connect() 现在接受任何 path-like object 而不仅仅是一个字符串。(安德斯·洛伦森在 bpo-31843

SSL

这个 ssl 模块现在使用OpenSSL的内置API而不是 match_hostname() 检查主机名或IP地址。在TLS握手期间验证值。任何证书验证错误(包括主机名检查失败)现在都会引发 SSLCertVerificationError 并使用适当的TLS警报消息中止握手。新的异常包含其他信息。可以使用自定义主机名验证 SSLContext.hostname_checks_common_name . (由Christian Heimes在 bpo-31399

注解

改进的主机名检查需要 利比锡 实现与openssl 1.0.2或1.1兼容。因此,不再支持OpenSSL 0.9.8和1.0.1(请参见 平台支架拆除 了解更多详细信息)。SSL模块主要与libressl 2.7.2和更新版本兼容。

这个 ssl 模块不再发送sni tls扩展中的IP地址。(由Christian Heimes在 bpo-32185

match_hostname() 不再支持部分通配符,如 www*.example.org . (曼德普·辛格在 bpo-23033 和基督教海默斯在 bpo-31399

默认的密码套件选择 ssl 模块现在使用黑名单方法,而不是硬编码白名单。python不再重新启用被openssl安全更新阻止的密码。可以在编译时配置默认的密码套件选择。(由Christian Heimes在 bpo-31429

现在支持验证包含国际化域名(IDN)的服务器证书。作为这一变化的一部分, SSLSocket.server_hostname 属性现在以a-label形式存储预期的主机名 ("xn--pythn-mua.org" )而不是U-Label窗体 ("pythön.org" )(由Nathaniel J.Smith和Christian Heimes在 bpo-28414

这个 ssl 模块对tls 1.3和openssl 1.1.1提供了初步和实验支持。在python 3.7.0发布时,openssl 1.1.1仍在开发中,而tls 1.3尚未最终确定。TLS 1.3握手和协议的行为与TLS 1.2及更早版本稍有不同,请参见 TLS 1.3 . (由Christian Heimes在 bpo-32947bpo-20995bpo-29136bpo-30622bpo-33618

SSLSocketSSLObject 不再有公共构造函数。直接实例化从来都不是文档化和支持的功能。必须使用创建实例 SSLContext 方法 wrap_socket()wrap_bio() . (由Christian Heimes在 bpo-32951

用于设置最小和最大TLS协议版本的openssl 1.1 API可用为 SSLContext.minimum_versionSSLContext.maximum_version . 支持的协议由几个新标志表示,例如 HAS_TLSv1_1 . (由Christian Heimes在 bpo-32609

string

string.Template 现在,您可以选择分别修改有支撑的占位符和无支撑的占位符的正则表达式模式。(巴里·华沙在 bpo-1198569

子过程

这个 subprocess.run() 函数接受新的 capture_output 关键字参数。如果为真,则将捕获stdout和stderr。这相当于传球 subprocess.PIPE 作为 stdoutstderr 参数。(由Bo Bayles于 bpo-32102

这个 subprocess.run 函数和 subprocess.Popen 构造函数现在接受 text 作为别名的关键字参数 universal_newlines . (安德鲁克莱格在 bpo-31756

在Windows上 close_fds 已从更改 FalseTrue 重定向标准句柄时。现在可以设置 close_fds 重定向标准句柄时为true。见 subprocess.Popen . 这意味着 close_fds 现在默认为 True 在所有支持的平台上。(由Segev Finer在 bpo-19764

子流程模块现在在处理时更加优雅 KeyboardInterrupt 在期间 subprocess.call()subprocess.run() 或在 Popen 上下文管理器。在继续处理 KeyboardInterrupt 例外。(格雷戈里·史密斯在 bpo-25942

sys

新的 sys.breakpointhook() 钩子函数由内置函数调用 breakpoint() . (巴里·华沙在 bpo-31353

在Android上,新的 sys.getandroidapilevel() 返回生成时Android API版本。(由Victor Stinner在 bpo-28740

新的 sys.get_coroutine_origin_tracking_depth() 函数返回由新的 sys.set_coroutine_origin_tracking_depth() . asyncio 已转换为使用此新API而不是弃用的 sys.set_coroutine_wrapper() . (Nathaniel J.Smith在 bpo-32591

时间

PEP 564 将六个纳秒分辨率的新函数添加到 time 模块:

已添加新的时钟标识符:

新的 time.thread_time()time.thread_time_ns() 函数可用于获取每个线程的CPU时间度量。(由Antoine Pitrou在 bpo-32025

新的 time.pthread_getcpuclockid() 函数返回线程特定的CPU时间时钟的时钟ID。

tkinter

新的 tkinter.ttk.Spinbox 现在可以上课了。(艾伦·摩尔在 bpo-32585

tracemalloc

tracemalloc.Traceback 其行为更像常规的回溯,从最早的帧到最新的帧进行排序。 Traceback.format() 现在接受否定 limit ,将结果截断为 abs(limit) 最旧的帧。要获得旧的行为,使用新的 most_recent_first 参数 Traceback.format() . (由Jesse Bakker在 bpo-32121

类型

新的 WrapperDescriptorTypeMethodWrapperTypeMethodDescriptorTypeClassMethodDescriptorType 现在可以上课了。(由Manuel Krebber和Guido van Rossum在 bpo-29377 和Serhiy Storchaka在 bpo-32265

新的 types.resolve_bases() 函数根据指定动态解析MRO条目 PEP 560 . (Ivan Levkivskyi在 bpo-32717

unicodedata

内部 unicodedata 数据库已升级为使用 Unicode 11 . (本杰明·彼得森供稿)

单元测试

新的 -k 命令行选项允许按名称子字符串或类似于unix shell的模式筛选测试。例如, python -m unittest -k foo 运行 foo_tests.SomeTest.test_somethingbar_tests.SomeTest.test_foo ,但不是 bar_tests.FooTest.test_something . (乔纳斯·哈格在 bpo-32071

unittest.mock

这个 sentinel 属性现在保留它们的身份 copiedpickled . (Serhiy Storchaka在 bpo-20804

新的 seal() 功能允许密封 Mock 实例,这将不允许进一步创建属性模拟。密封将递归地应用于所有本身是模拟的属性。(马里奥·科切罗在 bpo-30541

urllib.parse

urllib.parse.quote() 已从更新 RFC 2396RFC 3986 添加 ~ 默认情况下从不引用的字符集。(由Christian Theune和Ratnadeep Debnath在 bpo-16285

uu

这个 uu.encode() 函数现在接受一个可选的 backtick 关键字参数。当它为真时,零表示为 '`' 而不是空格。(由张翔于 bpo-30103

uuid

新的 UUID.is_safe 属性从平台传递有关生成的UUID是否使用多处理安全方法生成的信息。(巴里·华沙在 bpo-22807

uuid.getnode() 现在更类似于通用管理的MAC地址,而不是本地管理的MAC地址。这可以更好地保证从返回的UUID的全局唯一性。 uuid.uuid1() .如果只有本地管理的MAC地址可用,则返回找到的第一个此类地址。(巴里·华沙在 bpo-32107

警告

默认警告筛选器的初始化已更改如下:

  • 通过命令行选项启用的警告(包括 -b 以及新的特定于cpython的 -X dev 选项)始终通过 sys.warnoptions 属性。

  • 通过命令行或环境启用的警告筛选器现在具有以下优先顺序:

    • 这个 BytesWarning 滤波器 -b (或) -bb

    • 使用指定的任何筛选器 -W 选项

    • 使用指定的任何筛选器 PYTHONWARNINGS 环境变量

    • 任何其他特定的CPython过滤器(例如 default 为新添加的筛选器 -X dev 模式)

    • 任何由警告机制直接定义的隐式过滤器

  • 在cpython调试版本中,现在默认情况下显示所有警告(隐式筛选器列表为空)

(由Nick Coghlan和Victor Stinner在 bpo-20361bpo-32043bpo-32230

默认情况下,在单个文件脚本和交互式提示下,将再次显示拒绝警告。见 PEP 565:显示DeprecationWarning 在``__main__``中 详情。(由Nick Coghlan在 bpo-31975

xml.etree

ElementPath 中的谓词 find() 方法现在可以将当前节点的文本与 [. = "text"] ,不只是子级中的文本。谓词还允许添加空格以提高可读性。(由Stefan Behnel在 bpo-31648

xmlrpc.server

SimpleXMLRPCDispatcher.register_function 现在可以用作装饰。(由张翔于 bpo-7769

zipapp

功能 create_archive() 现在接受一个可选的 滤波器 允许用户选择哪些文件应包含在存档中的参数。(伊曼·德容在 bpo-31072

功能 create_archive() 现在接受一个可选的 压缩的 用于生成压缩存档的参数。命令行选项 --compress 也被添加以支持压缩。(王志明在 bpo-31638

压缩文件

ZipFile 现在接受新的 压缩能级 用于控制压缩级别的参数。(由Bo Bayles于 bpo-21417

由创建的存档中的子目录 ZipFile 现在按字母顺序存储。(由Bernhard M.Wiedemann于 bpo-30693

C API更改

已实现线程本地存储的新API。见 PEP 539:用于线程本地存储的新C API 概述和 线程特定存储(TSS)API 作为完整的参考。(由山本正孝于 bpo-25658

新的 context variables 功能公开了许多 new C APIs .

新的 PyImport_GetModule() 函数返回以前导入的具有给定名称的模块。(埃里克·斯诺在 bpo-28411

新的 Py_RETURN_RICHCOMPARE 宏简化了编写丰富的比较函数。(由彼得维多利亚在 bpo-23699

新的 Py_UNREACHABLE 宏可用于标记无法访问的代码路径。(巴里·华沙在 bpo-31338

这个 tracemalloc 现在通过新的 PyTraceMalloc_Track()PyTraceMalloc_Untrack() 功能。(由Victor Stinner在 bpo-30054

新的 import__find__load__start()import__find__load__done() 静态标记可用于跟踪模块导入。(由Christian Heimes在 bpo-31574

田地 namedoc 结构的 PyMemberDefPyGetSetDefPyStructSequence_FieldPyStructSequence_Descwrapperbase 现在是类型 const char * 而不是 char * . (Serhiy Storchaka在 bpo-28761

结果 PyUnicode_AsUTF8AndSize()PyUnicode_AsUTF8() 现在是类型 const char * 而不是 char * . (Serhiy Storchaka在 bpo-28769

结果 PyMapping_Keys()PyMapping_Values()PyMapping_Items() 现在总是列表,而不是列表或元组。(奥伦·米尔曼在 bpo-28280

附加函数 PySlice_Unpack()PySlice_AdjustIndices() . (Serhiy Storchaka在 bpo-27867

PyOS_AfterFork() 不赞成使用新函数 PyOS_BeforeFork()PyOS_AfterFork_Parent()PyOS_AfterFork_Child() . (由Antoine Pitrou在 bpo-16500

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

添加了对带有时区构造函数的时区的C API支持 PyTimeZone_FromOffset()PyTimeZone_FromOffsetAndName() ,并使用 PyDateTime_TimeZone_UTC .保罗甘斯勒在 bpo-10381 .

结果的类型 PyThread_start_new_thread()PyThread_get_thread_ident()id 参数 PyThreadState_SetAsyncExc() 从改变 longunsigned long . (Serhiy Storchaka在 bpo-6532

PyUnicode_AsWideCharString() 现在提出一个 ValueError 如果第二个参数是 NULL 以及 wchar_t* 字符串包含空字符。(Serhiy Storchaka在 bpo-30708

对启动序列的更改和动态内存分配器的管理意味着需要调用的文档化需求 Py_Initialize() 在调用大多数C API函数之前,现在对它的依赖程度更高,如果不遵守它,可能会导致嵌入应用程序中出现segfaults。见 移植到python 3.7 本文件和 在python初始化之前 有关详细信息,请参阅C API文档中的部分。

新的 PyInterpreterState_GetID() 返回给定解释器的唯一ID。(埃里克·斯诺在 bpo-29102

Py_DecodeLocale()Py_EncodeLocale() 现在使用UTF-8编码 UTF-8 mode 启用。(由Victor Stinner在 bpo-29240

PyUnicode_DecodeLocaleAndSize()PyUnicode_EncodeLocale() 现在使用当前的区域设置编码 surrogateescape 错误处理程序。(由Victor Stinner在 bpo-29240

这个 开始end 参数 PyUnicode_FindChar() 现在调整为类似于字符串切片的行为。(由张翔于 bpo-28822

建立变化

构建支撑 --without-threads 已删除。这个 threading 模块现在始终可用。(由Antoine Pitrou在 bpo-31370 。)

当构建 _ctypes 非OSX UNIX平台上的模块。在构建时,现在需要安装libffi的副本 _ctypes 在这样的平台上。(由Zachary Ware在 bpo-27979

Windows构建过程不再依赖Subversion来拉入外部源,而是使用一个Python脚本从GitHub下载ZipFile。如果在系统上找不到python 3.6(通过 py -3.6 ,nuget用于下载32位python的副本。(由Zachary Ware在 bpo-30450

这个 ssl 模块需要与openssl 1.0.2或1.1兼容的libssl。openssl 1.0.1已于2016-12-31达到生命周期结束,不再受支持。暂时不支持libressl。版本2.6.4之前的libressl版本缺少必需的openssl 1.0.2apis。

优化

通过移植更多的代码来使用 METH_FASTCALL 公约。(由Victor Stinner在 bpo-29300bpo-29507bpo-29452bpo-29286

各种优化在Linux上减少了10%的python启动时间,在MacOS上减少了30%。(由Victor Stinner,Inada Naoki在 bpo-29585 和伊万·莱夫基夫斯基 bpo-31333

由于字节码的更改避免了创建绑定的方法实例,方法调用现在快了20%。(由Yury Selivanov和Inada Naoki在 bpo-26110

这个 asyncio 模块收到了许多常用函数的显著优化:

作为结果 PEP 560 work ,的导入时间 typing 已经减少了7倍,许多打字操作现在更快了。(Ivan Levkivskyi在 bpo-32226

sorted()list.sort() 已针对常见情况进行了优化,速度可提高40-75%。(由Elliot Gorokhovsky在 bpo-28685

dict.copy() 现在快了5.5倍。(由Yury Selivanov在 bpo-31179

hasattr()getattr() 现在快了4倍 name 未找到并且 obj 不重写 object.__getattr__()object.__getattribute__() .(Inada Naoki在 bpo-32544

在字符串中搜索某些Unicode字符(如乌克兰文大写“”)比搜索其他字符慢25倍。在最坏的情况下,现在只慢了3倍。(Serhiy Storchaka在 bpo-24821

这个 collections.namedtuple() 工厂已经重新实现,以使命名元组的创建速度快4到6倍。(由Jelle Zijlstra贡献,Inada Naoki、Serhiy Storchaka和Raymond Hettinger在 bpo-28638

date.fromordinal()date.fromtimestamp() 在普通情况下,现在快了30%。(由Paul Ganssle在 bpo-32403

这个 os.fwalk() 由于使用了 os.scandir() . (Serhiy Storchaka在 bpo-25996

的速度 shutil.rmtree() 由于使用了 os.scandir() 功能。(Serhiy Storchaka在 bpo-28564

优化的不区分大小写匹配和搜索 regular expressions . 搜索一些模式现在可以快20倍。(Serhiy Storchaka在 bpo-30285

re.compile() 现在皈依 flags int对象的参数(如果是) RegexFlag .它现在和python 3.5一样快,并且比python 3.6快大约10%,这取决于模式。(Inada Naoki在 bpo-31671

这个 modify() 分类方法 selectors.EpollSelectorselectors.PollSelectorselectors.DevpollSelector 在重负荷下可能快10%左右。(由Giampaolo Rodola在 bpo-30014

不断折叠已经从窥视孔优化器转移到新的AST优化器,它能够更一致地执行优化。(Eugene Toder和Inada Naoki在 bpo-29469bpo-11549

中的大多数函数和方法 abc 已在C中重写。这将创建抽象基类,并调用 isinstance()issubclass() 它们的速度快了1.5倍。这也将python的启动时间减少了10%。(Ivan Levkivskyi和Inada Naoki在 bpo-31333

显著提高了替代构造器的速度 datetime.datedatetime.datetime 在不构造子类时使用快速路径构造函数。(由Paul Ganssle在 bpo-32403

比较的速度 array.array 在某些情况下,实例得到了很大的改进。当比较保存相同整数类型值的数组时,它的速度现在从10倍提高到70倍。(由Adrian Wielgosik在 bpo-24700

这个 math.erf()math.erfc() 函数现在在大多数平台上使用(更快的)C库实现。(Serhiy Storchaka在 bpo-26121

其他CPython实施变更

  • 跟踪挂钩现在可以选择不接收 line 并选择接收 opcode 通过设置相应的新 f_trace_linesf_trace_opcodes 正在跟踪的帧上的属性。(由Nick Coghlan在 bpo-31344

  • 修复了命名空间包模块属性的某些一致性问题。命名空间模块对象现在具有 __file__ 设置为 None (以前未设置),以及 __spec__.origin 也设置为 None (之前是字符串 "namespace" )见 bpo-32305 . 另外,命名空间模块对象的 __spec__.loader 设置为与相同的值 __loader__ (以前,前者被设置为 None )见 bpo-32303 .

  • 这个 locals() 字典现在按词汇顺序显示变量的定义。之前,订单未定义。(由Raymond Hettinger在 bpo-32690

  • 这个 distutils upload 命令不再尝试将CR行尾字符更改为CRLF。这修复了SDIST的损坏问题,SDIST以相当于cr的字节结尾(由bo bayles在 bpo-32304

已弃用的python行为

产量表达式(两个 yieldyield from 从句)现在在理解和生成器表达式中被弃用(最左边的iterable表达式除外) for 条款)。这确保理解总是立即返回适当类型的容器(而不是可能返回 generator iterator 对象),而生成器表达式不会尝试将其隐式输出与任何显式yield表达式的输出交错。在Python3.7中,这样的表达式会发出 DeprecationWarning 编译时,在python 3.8中,这将是 SyntaxError . (Serhiy Storchaka在 bpo-10544

返回的子类 complexobject.__complex__() 已弃用,在将来的Python版本中将是一个错误。这使得 __complex__() 符合 object.__int__()object.__float__() . (Serhiy Storchaka在 bpo-28894

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

aifc

aifc.openfp() 已弃用,将在python 3.9中删除。使用 aifc.open() 相反。(Brian Curtin在 bpo-31985

asyncio

直接支持 await -的实例 asyncio.Lock 其他异步同步原语已被弃用。必须使用异步上下文管理器才能获取和释放同步资源。(由Andrew Svetlov在 bpo-32253

这个 asyncio.Task.current_task()asyncio.Task.all_tasks() 方法已被弃用。(由Andrew Svetlov在 bpo-32250

收藏

在Python3.8中,在 collections.abc 将不再暴露在常规 collections 模块。这将有助于在具体类和抽象类之间创建更清晰的区别。(Serhiy Storchaka在 bpo-25988

数据库管理

dbm.dumb 现在支持只读文件的读取,并且在索引文件未更改时不再写入索引文件。如果索引文件在 'r''w' 模式(这在将来的Python版本中将是一个错误)。(Serhiy Storchaka在 bpo-28847

枚举

在python 3.8中,尝试在 Enum 课程将提高 TypeError (例如) 1 in Color );同样,尝试检查 Flag 会员将提高 TypeError (例如) 1 in Perm.RW );当前,两个操作都返回 False 相反。(伊桑·弗曼在 bpo-33217

获取文本

使用非整数值选择复数形式 gettext 现已弃用。它从未正确工作过。(Serhiy Storchaka在 bpo-28692

importlib

方法 MetaPathFinder.find_module() (被替换) MetaPathFinder.find_spec()PathEntryFinder.find_loader() (被替换) PathEntryFinder.find_spec() )在python 3.4中都已弃用,现在发出 DeprecationWarning . (由Matthias Bussonnier在 bpo-29576

这个 importlib.abc.ResourceLoader ABC已被否决,赞成 importlib.abc.ResourceReader .

locale

locale.format() 已弃用,请使用 locale.format_string() 相反。(由Garvit在 bpo-10379

macpath

这个 macpath 现在已弃用,将在python 3.8中删除。(由池宣彦于 bpo-9850

线程加工

dummy_threading_dummy_thread 已弃用。在禁用线程的情况下,无法再构建Python。使用 threading 相反。(由Antoine Pitrou在 bpo-31370

Socket

静默参数值截断 socket.htons()socket.ntohs() 已弃用。在将来的Python版本中,如果传递的参数大于16位,则会引发异常。(奥伦·米尔曼在 bpo-28332

SSL

ssl.wrap_socket() 已弃用。使用 ssl.SSLContext.wrap_socket() 相反。(由Christian Heimes在 bpo-28124

sunau

sunau.openfp() 已弃用,将在python 3.9中删除。使用 sunau.open() 相反。(Brian Curtin在 bpo-31985

sys

已弃用 sys.set_coroutine_wrapper()sys.get_coroutine_wrapper() .

无证件者 sys.callstats() 函数已被弃用,将在将来的Python版本中删除。(由Victor Stinner在 bpo-28799

wave

wave.openfp() 已弃用,将在python 3.9中删除。使用 wave.open() 相反。(Brian Curtin在 bpo-31985

C API的函数和类型已弃用

功能 PySlice_GetIndicesEx() 已弃用,并替换为宏if Py_LIMITED_API 未设置或设置为介于 0x030504000x03060000 (不包括在内),或 0x03060100 或更高。(Serhiy Storchaka在 bpo-27867

PyOS_AfterFork() 已弃用。使用 PyOS_BeforeFork()PyOS_AfterFork_Parent()PyOS_AfterFork_Child() 相反。(由Antoine Pitrou在 bpo-16500

平台支架拆除

  • FreeBsd 9及以上版本不再得到官方支持。

  • 对于完整的Unicode支持,包括扩展模块内, * 尼克斯平台现在预计将至少提供 C.UTF-8 (完整区域), C.utf8 (完整区域设置)或 UTF-8 (LC_CTYPE -仅限区域设置)作为传统的替代方案 ASCII 基于 C locale。

  • 不再支持openssl 0.9.8和1.0.1,这意味着在仍在使用这些版本的旧平台上使用ssl/tls支持构建cpython 3.7需要自定义构建选项,这些选项链接到较新版本的openssl。

    值得注意的是,这个问题影响到Debian8(又名“Jessie”)和Ubuntu14.04(又名“Trusty”)LTS Linux发行版,因为它们默认情况下仍然使用OpenSSL1.0.1。

    Debian 9(“Stretch”)和Ubuntu 16.04(“Xenial”),以及其他LTS Linux版本的最新版本(例如,RHEL/CentOS 7.5、SLES 12-SP3),使用OpenSSL 1.0.2或更高版本,并在默认构建配置中保持受支持。

    CPython自己 CI configuration file 提供使用SSL的示例 compatibility testing infrastructure 在CPython的测试套件中,构建并链接到OpenSSL 1.1.0,而不是过时的系统提供的OpenSSL。

API和功能删除

以下特性和API已从Python3.7中删除:

  • 这个 os.stat_float_times() 函数已被删除。它是在Python2.3中引入的,用于与Python2.2向后兼容,自Python3.1以来就被弃用了。

  • 未知的转义符包括 '\' 和替换模板中的ASCII字母 re.sub() 在python 3.5中已弃用,现在将导致错误。

  • 拆下的支架 排除 参数 tarfile.TarFile.add() . 它在python 2.7和3.2中被弃用。使用 滤波器 改为参数。

  • 这个 splitunc() 功能在 ntpath Python3.1中不推荐使用模块,现在已将其删除。使用 splitdrive() 而是函数。

  • collections.namedtuple() 不再支持 verbose 参数或 _source 显示已命名元组类的生成源代码的属性。这是为加速类创建而设计的优化的一部分。(由Jelle Zijlstra贡献,Inada Naoki、Serhiy Storchaka和Raymond Hettinger在 bpo-28638

  • 功能 bool()float()list()tuple() 不再采用关键字参数。第一个参数 int() 现在只能作为位置参数传递。

  • 已移除先前在python 2.4类中弃用的 PlistDict_InternalDictplistlib 模块。函数结果中的dict值 readPlist()readPlistFromBytes() 现在是普通的听写。您不能再使用属性访问来访问这些字典的项。

  • 这个 asyncio.windows_utils.socketpair() 函数已被删除。使用 socket.socketpair() 相反,它在Python3.5之后的所有平台上都可用。 asyncio.windows_utils.socketpair 只是一个别名 socket.socketpair 在python 3.5和更新版本上。

  • asyncio 不再导出 selectors_overlapped 模块AS asyncio.selectorsasyncio._overlapped . 替换 from asyncio import selectors 具有 import selectors .

  • 直接实例化 ssl.SSLSocketssl.SSLObject 现在禁止使用对象。构造器从未被记录、测试或设计为公共构造器。用户应该使用 ssl.wrap_socket()ssl.SSLContext . (由Christian Heimes在 bpo-32951

  • 未使用的 distutils install_misc 命令已被删除。(Eric N.Vander Weele在 bpo-29218

模块移除

这个 fpectl 模块已移除。它在默认情况下从来没有启用过,在x86-64上从来没有正确工作过,它以导致C扩展意外中断的方式更改了python abi。(Nathaniel J.Smith在 bpo-29137

仅限Windows的更改

python启动程序(py.exe)可以接受32位和64位说明符。 没有 还必须指定次要版本。所以 py -3-32py -3-64 同时生效 py -3.7-32 也- m - 64和- m.n -现在可以接受64个表单来强制使用64位python,即使32位本来是可以使用的。如果指定的版本不可用,py.exe将错误退出。(史蒂夫·巴恩斯在 bpo-30291

发射器可以运行为 py -0 要生成已安装的 Python 的列表, 带星号标记的默认值 . 运行 py -0p 将包括路径。如果使用无法匹配的版本说明符运行py,它还将打印 短格式 可用说明符列表。(史蒂夫·巴恩斯在 bpo-30362

移植到python 3.7

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

python行为的变化

  • asyncawait 名称现在是保留关键字。使用这些名称作为标识符的代码现在将引发 SyntaxError . (由Jelle Zijlstra在 bpo-30406

  • PEP 479 为python 3.7中的所有代码启用,这意味着 StopIteration 在协程和生成器中直接或间接引发的异常被转换为 RuntimeError 例外情况。(由Yury Selivanov在 bpo-32670

  • object.__aiter__() 方法不能再声明为异步。(由Yury Selivanov在 bpo-31709

  • 由于疏忽,早期的Python版本错误地接受了以下语法:

    f(1 for x in [1],)
    
    class C(1 for x in [1]):
        pass
    

    python 3.7现在正确地引发了 SyntaxError ,因为生成器表达式总是需要直接位于一组圆括号内,并且不能在两边都有逗号,并且只能在调用时省略圆括号的重复。(Serhiy Storchaka在 bpo-32012bpo-32023

  • 当使用 -m 开关,初始工作目录现在添加到 sys.path ,而不是空字符串(在每次导入时动态表示当前工作目录)。任何正在检查空字符串或依赖于以前行为的程序都需要相应地更新(例如,还需要检查 os.getcwd()os.path.dirname(__main__.__file__) ,这取决于代码最初检查空字符串的原因)。

python api中的更改

C API中的更改

函数 PySlice_GetIndicesEx() 对于可调整大小的序列被认为不安全。如果切片索引不是 int ,但实现 __index__() 方法,将序列的长度传递给 !PySlice_GetIndicesEx . 这可能会导致返回序列长度之外的索引。为了避免可能出现的问题,请使用新函数 PySlice_Unpack()PySlice_AdjustIndices() . (Serhiy Storchaka在 bpo-27867

cpython字节码更改

有两个新的操作码: LOAD_METHODCALL_METHOD . (由Yury Selivanov和Inada Naoki在 bpo-26110

这个 STORE_ANNOTATION 操作码已被删除。(由Mark Shannon在 bpo-32550

仅限Windows的更改

用于重写的文件 sys.path 现在叫做 <python-executable>._pth 而不是 'sys.path' . 见 查找模块 更多信息。(史蒂夫·道尔在 bpo-28137

其他CPython实施变更

为将来对公共CPython运行时初始化API的潜在更改做准备(请参见 PEP 432 对于一个初始的,但有点过时的草案),CPython的内部启动和配置管理逻辑已经被显著地重构了。虽然这些更新对嵌入的应用程序和常规cpython cli的用户都是完全透明的,但是这里提到的它们是由于重构在解释器启动期间更改了各种操作的内部顺序,因此可能会发现嵌入应用程序或cpytho中以前潜在的缺陷。n本身。(最初由Nick Coghlan和Eric Snow作为 bpo-22257 以及尼克、埃里克和维克多·斯廷纳在其他一些问题上的进一步更新)。一些已知细节受到影响:

由于配置默认警告筛选器的方式发生了更改,设置 Py_BytesWarningFlag 大于1的值不再足以同时发射 BytesWarning 并将其转换为异常。相反,必须设置标志(首先导致发出警告),并显式 error::BytesWarning 添加了警告筛选器以将其转换为异常。

由于编译器处理docstring的方式发生了变化,因此 return None 在仅由docstring组成的函数体中,现在标记为与docstring在同一行上发生,而不是在函数的标题行上发生。

当前异常状态已从帧对象移动到协同例程。这简化了解释器,并修复了在进入或退出生成器时由交换异常状态引起的一些不明显的错误。(由Mark Shannon在 bpo-25612

python 3.7.1的显著变化

从3.7.1开始, Py_Initialize() 现在,始终阅读并尊重与 Py_Main() (在早期的Python版本中,它尊重那些环境变量的一个定义不正确的子集,而在Python3.7.0中,由于 bpo-34247 )如果不需要此行为,请设置 Py_IgnoreEnvironmentFlag 调用前为1 Py_Initialize() .

在3.7.1中,上下文变量的C API was updated 使用 PyObject 指针。也见 bpo-34762 .

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

python 3.7.2的显著变化

在3.7.2, venv 在Windows上,不再复制原始二进制文件,而是创建名为 python.exepythonw.exe 相反。这解决了一个长期存在的问题,即所有虚拟环境都必须使用每个Python更新进行升级或重新创建。但是,请注意,这个版本仍然需要重新创建虚拟环境才能获得新的脚本。

Python 3.7.6中的显著变化

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