Python 3.7 的新增Function

本文介绍了 Python 3.7 与 3.6 相比的新Function。 Python 3.7 已于 2018 年 6 月 27 日发布。有关详细信息,请参见changelog

摘要-发行要点

新语法Function:

  • PEP 563,推迟了对类型 Comments 的评估。

向后不兼容的语法更改:

新的库模块:

新的内置Function:

Python 数据模型改进:

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

  • PEP 560,对键入模块和通用类型的核心支持。

  • dict对象已经宣布的插入 Sequences 保留性质成为 Python 语言规范的正式组成部分。

标准库中的重大改进:

CPython 实现的改进:

C API 改进:

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

Documentation improvements:

此版本在许多方面都显着改善了性能。 Optimizations部分详细列出了它们。

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

New Features

PEP 563:Comments 的评估延后

Python 中类型提示的出现揭示了两个明显的可用性问题,它们在 PEP 3107中添加并在 PEP 526中进一步完善了 Comments 的Function:

  • 注解只能使用当前范围内已经可用的名称,换句话说,它们不支持任何形式的正向引用;和

  • Comments 源代码会对 Python 程序的启动时间产生不利影响。

pass推迟对 Comments 的评估,可以解决这两个问题。编译器不编译在 Comments 定义时在 Comments 中执行表达式的代码,而是以等效于所讨论表达式的 AST 的字符串形式存储 Comments。如果需要,可以在运行时使用typing.get_type_hints()解析 Comments。在不需要这样做的常见情况下,Comments 的存储成本较低(因为短字符串由解释器插入),并使启动时间更快。

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

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

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

class B:
    ...

由于此更改破坏了兼容性,因此需要在 Python 3.7 中使用future import 在每个模块上启用新行为:

from __future__ import annotations

它将成为 Python 4.0 中的默认设置。

See also

  • PEP 563 –推迟评估 Comments

  • PEP 由ŁukaszLanga 编写和实施。

PEP 538:旧版 C 语言环境强制

在 Python 3 系列中,一个持续的挑战是确定明智的默认策略,以处理当前在非 Windows 平台上使用默认 C 或 POSIX 语言环境所隐含的“ 7 位 ASCII”文本编码假设。

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

PEP 11中的平台支持定义也已更新,以将全文处理支持限制为适当配置的基于非 ASCII 的语言环境。

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

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

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

See also

  • PEP 538 –将旧版 C 语言环境强制为基于 UTF-8 的语言环境

  • PEP 由 Nick Coghlan 编写和实施。

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

新的-X utf8命令行选项和 PYTHONUTF8环境变量可用于启用 CPython * UTF-8 模式*。

在 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 运行时模式

当语言环境为CPOSIX时,默认情况下会启用 UTF-8 模式,而 PEP 538语言环境强制Function无法将其更改为基于 UTF-8 的替代方法(无论该失败是由于设置了PYTHONCOERCECLOCALE=0还是由于设置了LC_ALL,或缺少合适的目标语言环境)。

See also

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

  • Victor Stinner 编写和实施的 PEP

PEP 553:内置断点()

Python 3.7 包括新的内置breakpoint()函数,可作为进入 Python 调试器的简单且一致的方式。

内置breakpoint()调用sys.breakpointhook()。默认情况下,后者导入pdb然后调用pdb.set_trace(),但是pass将sys.breakpointhook()绑定到您选择的Function,breakpoint()可以 Importing 任何调试器。此外,可以将环境变量 PYTHONBREAKPOINT设置为所选调试器的可调用项。将PYTHONBREAKPOINT=0设置为完全禁用内置breakpoint()

See also

  • PEP 553 –内置断点()

  • PEP 由 Barry Warsaw 编写和实施

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

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

PEP 539pass向 CPython 提供新的线程特定存储(TSS)API来更改此设置,该线程特定存储(TSS)API取代了 CPython 解释器中现有 TLS API 的使用,同时不推荐使用现有 API。 TSS API 使用新的类型Py_tss_t而不是int来表示 TSS 密钥-一种不透明的类型,其定义可能取决于基础 TLS 的实现。因此,这将允许在无法以安全方式强制转换为int的方式定义本机 TLS 密钥的平台上构建 CPython。

请注意,在无法以安全方式强制转换为int的方式定义本机 TLS 密钥的平台上,现有 TLS API 的所有Function均为无操作,并立即返回故障。这清楚地表明,在无法可靠使用旧 API 的平台上不支持该旧 API,并且将不做任何努力来添加此类支持。

See also

  • PEP 539 –用于 CPython 中线程本地存储的新 C-API

  • 由 Erik M. Bray 撰写的 PEP;由山本雅之实现。

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

Python 3.7 允许在模块上定义getattr(),并且在找不到模块属性时将调用它。现在也可以在模块上定义dir()

一个可能有用的典型示例是模块属性弃用和延迟加载。

See also

  • PEP 562 –模块__getattr____dir__

  • 由 Ivan Levkivskyi 编写和实施的 PEP

PEP 564:具有纳秒分辨率的新时间Function

在现代系统中,时钟的分辨率可能会超过time.time()函数及其变体返回的浮点数的有限精度。为了避免精度损失, PEP 564time模块添加了现有计时器函数的六个新的“纳秒”变体:

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

Measurements表明,在 Linux 和 Windows 上,time.time_ns()的分辨率大约是time.time()的 3 倍。

See also

  • PEP 564 –添加具有纳秒分辨率的新时间Function

  • Victor Stinner 编写和实施的 PEP

PEP 565:在__main_中显示弃用警告

更改了默认的DeprecationWarning处理,以便默认情况下再次显示这些警告,但仅在触发它们的代码直接在main模块中运行时才显示。结果,单个文件脚本的开发人员和交互使用 Python 的开发人员应该再次开始看到他们使用的 API 的弃用警告,但是默认情况下,由导入的应用程序,库和框架模块触发的弃用警告将 continue 隐藏。

作为此更改的结果,标准库现在允许开发人员在三种不同的弃用警告行为之间进行选择:

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

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

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

以前DeprecationWarningPendingDeprecationWarning仅在运行测试时可见,这意味着主要破坏单个 API 的更改的开发人员主要是编写单个文件脚本或以交互方式使用 Python。

See also

  • PEP 565 –在__main__中显示弃用警告

  • PEP 由 Nick Coghlan 编写和实施

PEP 560:键入模块和通用类型的核心支持

最初 PEP 484的设计方式是,不会对核心 CPython 解释器进行任何更改。现在,社区广泛使用了类型提示和typing模块,因此消除了此限制。 PEP 引入了两种特殊方法class_getitem()__mro_entries__,这些方法现在被typing中的大多数类和特殊构造所使用。结果,使用类型进行各种操作的速度提高了 7 倍,可以使用通用类型而不会出现元类冲突,并且修复了typing模块中若干个长期存在的错误。

See also

  • PEP 560 –键入模块和通用类型的核心支持

  • 由 Ivan Levkivskyi 编写和实施的 PEP

PEP 552:基于哈希的.pyc 文件

Python 传统上pass比较源元数据(最新修改的时间戳和大小)与生成时保存在缓存文件头中的源元数据来检查字节码缓存文件(即.pyc个文件)的最新性。这种无效方法虽然有效,但也有其缺点。当文件系统时间戳过于粗糙时,Python 可能会错过源代码更新,从而导致用户混乱。此外,对于build reproducibility和基于内容的构建系统,在高速缓存文件中具有时间戳是有问题的。

PEP 552扩展了 pyc 格式,以允许将源文件的哈希值(而不是源时间戳)用于无效。这样的.pyc文件称为“基于哈希”。默认情况下,Python 仍使用基于时间戳的失效,并且在运行时不生成基于哈希的.pyc文件。基于哈希的.pyc文件可以使用py_compilecompileall生成。

基于哈希的.pyc文件有两种变体:选中和未选中。 Python 会在运行时针对相应的源文件来验证基于哈希的.pyc文件,但对于未经检查的基于哈希的 pycs 则不会。对于 Python 外部的系统(例如,构建系统)负责使.pyc文件保持最新状态的环境,未经检查的基于散列的.pyc文件是有用的性能优化。

有关更多信息,请参见缓存的字节码无效

See also

  • PEP 552 –确定性 pycs

  • PEP 由本杰明·彼得森(Benjamin Peterson)编写和实施

PEP 545:Python 文档翻译

PEP 545介绍了创建和维护 Python 文档翻译的过程。

添加了三个新的翻译:

See also

  • PEP 545 – Python 文档翻译

  • 由 Julien Palard,Inada Naoki 和 Victor Stinner 编写和实施的 PEP。

开发运行时模式:-X dev

新的-X dev命令行选项或新的 PYTHONDEVMODE环境变量可用于启用 CPython 的开发模式。在开发模式下,CPython 将执行其他运行时检查,这些检查过于昂贵而无法默认启用。有关此模式的影响的完整说明,请参见-X dev文档。

其他语言更改

  • 由于实现问题,在格式化的字符串 Literals的表达式中,一个await表达式和包含async for子句的理解是非法的。在 Python 3.7 中,取消了此限制。

  • 现在可以将超过 255 个参数传递给一个函数,并且一个函数现在可以具有超过 255 个参数。 (由 Serhiy Storchaka 在bpo-12844bpo-18896中贡献。)

  • bytes.fromhex()bytearray.fromhex()现在忽略所有 ASCII 空格,而不仅仅是空格。 (由 Robert Xiao 在bpo-28927中贡献。)

  • strbytesbytearray支持新的isascii()方法,该方法可用于测试字符串或字节是否仅包含 ASCII 字符。 (由 INADA Naoki 在bpo-32677中贡献。)

  • from ... import ...失败时,ImportError现在显示模块名称和模块__file__路径。 (由 Matthias Bussonnier 在bpo-29546中贡献。)

  • 现在支持涉及绝对导入并将子模块绑定到名称的循环导入。 (由 Serhiy Storchaka 在bpo-30024中贡献。)

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

  • 为了更好地支持动态创建堆栈跟踪,现在可以从 Python 代码中实例化types.TracebackType,并且现在可以写入tracebackstb_next属性。 (由 Nathaniel J. Smith 在bpo-30579中贡献。)

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

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

New Modules

contextvars

新的contextvars模块和一组新的 C API引入了对上下文变量的支持。上下文变量在概念上类似于线程局部变量。与 TLS 不同,上下文变量正确支持异步代码。

asynciodecimal模块已更新,可以立即使用和支持上下文变量。现在,特别是将活动的十进制上下文存储在上下文变量中,该变量允许十进制操作与异步代码中的正确上下文一起使用。

See also

  • PEP 567 –上下文变量

  • 由 Yury Selivanov 编写和实施的 PEP

dataclasses

新的dataclass()装饰器提供了一种语句* data classes *的方法。数据类使用类变量 Comments 描述其属性。它的构造函数和其他魔术方法(例如repr()eq()hash())是自动生成的。

Example:

@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)"

See also

  • PEP 557 –数据类

  • 由 Eric V. Smith 编写和实施的 PEP

importlib.resources

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

由 Barry Warsaw 和 Brett Cannon 在bpo-32248中贡献。

See also

importlib_resources –适用于早期 Python 版本的 PyPI 反向端口。

Improved Modules

argparse

新的ArgumentParser.parse_intermixed_args()方法允许混合选项和位置参数。 (由bpo-14191中的 paul.j3 贡献。)

asyncio

asyncio模块已获得许多新Function,可用性和performance improvements。显着的变化包括:

srv = await loop.create_server(...)

async with srv:
    # some code

# At this point, srv is closed and no longer accepts new connections.

(由 Yury Selivanov 在bpo-32662中贡献。)

几个asyncio API 已成为deprecated

binascii

b2a_uu()函数现在接受一个可选的* backtick *关键字参数。如果为 true,则零由'`'表示,而不是空格。 (由张翔在bpo-30103中贡献。)

calendar

HTMLCalendar类具有新的类属性,可简化在生成的 HTMLcalendar 中 CSS 类的自定义。 (由 Oz Tiram 在bpo-30095中贡献。)

collections

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

compileall

compileall.compile_dir()学习了新的* invalidation_mode *参数,该参数可用于启用基于散列的.pyc 无效。也可以使用新的--invalidation-mode参数在命令行上指定失效模式。 (由本杰明·彼得森在bpo-31650中贡献。)

concurrent.futures

ProcessPoolExecutorThreadPoolExecutor现在支持新的* initializer initargs *构造函数参数。 (由bpo-21423中的 Antoine Pitrou 提供。)

ProcessPoolExecutor现在可以pass新的* mp_context *参数获取 multiprocessing 上下文。 (由 Thomas Moreau 在bpo-31540中贡献。)

contextlib

新的nullcontext()是比ExitStack更简单,更快速的无操作上下文 Management 器。 (由 Jesse-Bakker 在bpo-10049中贡献。)

添加了新的asynccontextmanager()AbstractAsyncContextManagerAsyncExitStack来补充其同步副本。 (由bpo-29679bpo-30241的 Jelle Zijlstra 以及bpo-29302的 Alexander Mohr 和 Ilya Kulakov 贡献。)

cProfile

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

crypt

crypt模块现在支持 Blowfish 哈希方法。 (由 Serhiy Storchaka 在bpo-31664中贡献。)

mksalt()函数现在允许指定哈希的回合数。 (由 Serhiy Storchaka 在bpo-31702中贡献。)

datetime

新的datetime.fromisoformat()方法从字符串中以datetime.isoformat()输出的格式之一构造datetime对象。 (由 Paul Ganssle 在bpo-15873中贡献。)

tzinfo类现在支持分钟的偏移量。 (由 Alexander Belopolsky 在bpo-5288中贡献。)

dbm

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

decimal

decimal模块现在使用context variables来存储小数上下文。 (由 Yury Selivanov 在bpo-32630中贡献。)

dis

dis()函数现在可以反汇编嵌套的代码对象(理解代码,生成器表达式和嵌套函数以及用于构建嵌套类的代码)。拆卸递归的最大深度由新的* depth *参数控制。 (由 Serhiy Storchaka 在bpo-11822中贡献。)

distutils

现在README.rst已包含在 distutils 标准自述文件列表中,因此也包含在源代码发行版中。 (由 Ryan Gonzalez 在bpo-11913中贡献。)

enum

Enum学习了新的_ignore_ class 属性,该属性允许列出不应成为枚举成员的属性的名称。 (由 Ethan Furman 在bpo-31801中贡献。)

在 Python 3.8 中,try检查Enum类中的非 Enum 对象将引发TypeError(例如1 in Color);类似地,try检查Flag成员中的非 Flag 对象将引发TypeError(例如1 in Perm.RW);当前,这两个操作都返回False,并且已弃用。 (由 Ethan Furman 在bpo-33217中贡献。)

functools

functools.singledispatch()现在支持使用类型 Comments 注册实现。 (由ŁukaszLanga 在bpo-32227中贡献。)

gc

新的gc.freeze()Function允许冻结垃圾回收器跟踪的所有对象,并将其从以后的回收中排除。可以在 POSIX fork()调用之前使用此命令,以使 GC 写时友好复制或加快收集速度。新的gc.unfreeze()函数可逆转此操作。此外,gc.get_freeze_count()可用于获取冻结对象的数量。 (由李泽坤在bpo-31558中贡献。)

hmac

hmac模块现在具有经过优化的单发digest()Function,其速度比HMAC()快三倍。 (由 Chris Heimes 在bpo-32433中贡献。)

http.client

HTTPConnectionHTTPSConnection现在支持新的* blocksize *参数,以提高上传吞吐量。 (由 Nir Soffer 在bpo-31945中贡献。)

http.server

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

SimpleHTTPRequestHandler除了新的--directory命令行参数外,还接受新的* directory *参数。使用此参数,服务器将服务于指定目录,默认情况下,它将使用当前工作目录。 (由 StéphaneWirtel 和 Julien Palard 在bpo-28707中贡献。)

新的ThreadingHTTPServer类使用线程使用ThreadingMixin处理请求。 http.server-m一起运行时使用。 (由 Julien Palard 在bpo-31639中贡献。)

idlelib 和 IDLE

自动完成的多种修复。 (由 Luie Lu 在bpo-15786中贡献。)

模块浏览器(在“文件”菜单上,以前称为“类浏览器”),除顶级Function和类外,现在还显示嵌套的Function和类。 (由 Guilherme Polo,Cheryl Sabella 和 Terry Jan Reedy 在bpo-1612262中贡献。)

设置对话框(选项,配置 IDLE)已部分重写,以改善外观和Function。 (由 Cheryl Sabella 和 Terry Jan Reedy 在多个问题中提供.)

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

以前作为扩展实现的 IDLE Function已作为常规Function重新实现。它们的设置已从“扩展”选项卡移至其他对话框选项卡。 (由 Charles Wohlganger 和 Terry Jan Reedy 在bpo-27099中贡献。)

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

在 Windows 上,一个新的 API 调用告诉 Windows tk 可扩展为 DPI。在 Windows 8.1 或 10 上,Python 二进制文件的 DPI 兼容性属性未更改,并且监视器分辨率大于 96 DPI,这将使文本和线条更清晰。否则,它将无效。 (由 Terry Jan Reedy 在bpo-33656中贡献。)

3.7.1 的新Function:

N 行(默认为 50 行)上的输出被压缩为一个按钮。可以在“设置”对话框的“常规”页面的“ PyShell”部分中更改 N。右键单击输出可以减少行,但可能会更长。可以pass双击按钮将压缩的输出扩展到适当位置,或者pass右键单击按钮将其扩展到剪贴板或单独的窗口中。 (由 Tal Einat 在bpo-1529353中贡献。)

上面的更改已反向移植到 3.6 维护版本。

3.7.4 中的新Function:

将“自定义运行”添加到“运行”菜单,以运行具有自定义设置的模块。Importing 的所有命令行参数都将添加到 sys.argv。它们会再次出现在框中,以进行下一次自定义运行。还可以抑制 Shell 主模块正常重启。 (由 Cheryl Sabella,Terry Jan Reedy 和其他人在bpo-5680bpo-37627中贡献。)

3.7.5 中的新Function:

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

importlib

引入了importlib.abc.ResourceReader ABC 以支持从程序包中加载资源。另请参见importlib.resources。 (由bpo-32248的布雷特·坎农(Bret Warnon)的 Barry Warsaw 贡献。)

如果该模块缺少规格,则importlib.reload()现在加ModuleNotFoundError。 (由 Garvit Khatri 在bpo-29851中贡献。)

如果指定的父模块不是软件包(即缺少__path__属性),则importlib.find_spec()现在提高ModuleNotFoundError而不是AttributeError。 (由米兰·奥伯基希在bpo-30436中贡献。)

新的importlib.source_hash()可用于计算所传递源的哈希值。 基于哈希的.pyc 文件嵌入此函数返回的值。

io

新的TextIOWrapper.reconfigure()方法可用于使用新设置重新配置文本流。 (由bpo-30526中的 Antoine Pitrou 和bpo-15216中的 INADA Naoki 贡献。)

ipaddress

ipaddress.IPv6Networkipaddress.IPv4Network的新subnet_of()supernet_of()方法可用于网络容纳测试。 (由bpo-20825由 Michel Albert 和 Cheryl Sabella 贡献。)

itertools

itertools.islice()现在接受integer-like objects作为开始,停止和切片参数。 (由 Will Roberts 在bpo-30537中贡献。)

locale

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

现在,locale.getpreferredencoding()函数始终在 Android 上或在强制 UTF-8 模式中返回'UTF-8'

logging

现在可以腌制Logger个实例。 (由 Vinay Sajip 在bpo-30520中贡献。)

创建处理程序后,可以使用新的StreamHandler.setStream()方法替换 Logger 流。 (由 Vinay Sajip 在bpo-30522中贡献。)

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

math

新的math.remainder()函数实现了 IEEE 754 样式的余数运算。 (由 Mark Dickinson 在bpo-29962中贡献。)

mimetypes

.bmp 的 MIME 类型已从'image/x-ms-bmp'更改为'image/bmp'。 (由 Nitish Chandra 在bpo-22589中贡献。)

msilib

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

multiprocessing

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

在 Unix 上,可以使用SIGKILLsignal 使用新的Process.kill()方法终止进程。 (由 Vitor Pereira 在bpo-30794中贡献。)

现在,在进程退出时加入了由Process创建的非守护线程。 (由bpo-18966中的 Antoine Pitrou 提供。)

os

os.fwalk()现在接受* path *参数为bytes。 (由 Serhiy Storchaka 在bpo-28682中贡献。)

os.scandir()获得了对file descriptors的支持。 (由 Serhiy Storchaka 在bpo-25996中贡献。)

新的register_at_fork()函数允许注册 Python 回调,以便在流程派生时执行。 (由bpo-16500中的 Antoine Pitrou 提供。)

添加了os.preadv()(结合os.readv()os.pread()的Function)和os.pwritev()Function(结合os.writev()os.pwrite()的Function)。 (由 Pablo Galindo 在bpo-31368中贡献。)

os.makedirs()的 mode 参数不再影响新创建的中间级目录的文件许可权位。 (由 Serhiy Storchaka 在bpo-19930中贡献。)

os.dup2()现在返回新文件 Descriptors。以前,总是返回None。 (由本杰明·彼得森在bpo-32441中贡献。)

os.stat()返回的结构现在在 Solaris 及其派生版本中包含st_fstype属性。 (由bpo-32659的 JesúsCeaAvión 贡献。)

pathlib

现在,新的Path.is_mount()方法在 POSIX 系统上可用,可用于确定路径是否为安装点。 (由 Cooper Ry Lees 在bpo-30897中贡献。)

pdb

pdb.set_trace()现在接受一个可选的* header * -only 关键字参数。如果给定,它将在调试开始之前打印到控制台。 (由 Barry Warsaw 在bpo-31389中贡献。)

pdb命令行现在接受-m module_name作为脚本文件的替代。 (由 Mario Corchero 在bpo-32206中贡献。)

py_compile

py_compile.compile()以及 extensionscompileall现在pass无条件创建.pyc文件以进行基于散列的验证来尊重 SOURCE_DATE_EPOCH环境变量。这样可以保证.pyc个文件中的reproducible builds个被迅速创建。 (由 Bernhard M. Wiedemann 在bpo-29708中贡献。)

pydoc

pydoc 服务器现在可以绑定到新的-n命令行参数指定的任意主机名。 (由 Feanil Patel 在bpo-31128中贡献。)

queue

新的SimpleQueue类是无限的 FIFO 队列。 (由bpo-14976中的 Antoine Pitrou 提供。)

re

标记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中贡献。)

signal

signal.set_wakeup_fd()函数的新* warn_on_full_buffer *参数使得可以指定当唤醒缓冲区溢出时,Python 是否在 stderr 上打印警告。 (由 Nathaniel J. Smith 在bpo-30050中贡献。)

socket

如果套接字处于阻塞模式,则新的socket.getblocking()方法返回True,否则返回False。 (由 Yury Selivanov 在bpo-32373中贡献。)

新的socket.close()函数关闭传递的套接字文件 Descriptors。应该使用此函数而不是os.close(),以实现跨平台更好的兼容性。 (由 Chris Heimes 在bpo-32454中贡献。)

socket模块现在公开了socket.TCP_CONGESTION(Linux 2.6.13),socket.TCP_USER_TIMEOUT(Linux 2.6.37)和socket.TCP_NOTSENT_LOWAT(Linux 3.12)常量。 (由bpo-26273中的 Omar Sandoval 和bpo-29728中的 Nathaniel J. Smith 贡献。)

添加了对socket.AF_VSOCK套接字的支持,以允许虚拟机与其主机之间进行通信。 (由 Cathy Avery 在bpo-27584中贡献。)

现在,套接字默认情况下会自动从文件 Descriptors 中检测家族,类型和协议。 (由 Christian Heimes 在bpo-28134中贡献。)

socketserver

socketserver.ThreadingMixIn.server_close()现在 await,直到所有非守护程序线程完成。现在socketserver.ForkingMixIn.server_close()await 所有子进程完成。

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

sqlite3

当基础 SQLite 库的版本为 3.6.11 或更高版本时,sqlite3.Connection现在公开backup()方法。 (由 Lele Gaifax 在bpo-27645中贡献。)

sqlite3.connect()的* database *参数现在可以接受任何path-like object,而不仅仅是一个字符串。 (由bpo-31843中的 Anders Lorentsen 提供。)

ssl

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

Note

改进的主机名检查要求* libssl *实现与 OpenSSL 1.0.2 或 1.1 兼容。因此,不再支持 OpenSSL 0.9.8 和 1.0.1(有关更多详细信息,请参见平台支持删除)。 ssl 模块主要与 LibreSSL 2.7.2 及更高版本兼容。

ssl模块不再以 SNI TLSextensions 发送 IP 地址。 (由 Christian Heimes 在bpo-32185中贡献。)

match_hostname()不再支持www*.example.org之类的部分通配符。 (由bpo-23033中的 Mandeep Singh 和bpo-31399中的 Christian Heimes 贡献。)

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

现在支持验证包含国际化域名(IDN)的服务器证书。作为此更改的一部分,SSLSocket.server_hostname属性现在以 A 标签形式("xn--pythn-mua.org")而不是 U 标签形式("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不再具有公共构造函数。直接实例化从未成为文档和受支持的Function。必须使用SSLContext方法wrap_socket()wrap_bio()创建实例。 (由 Chris Heimes 在bpo-32951中贡献)

用于设置最小和最大 TLS 协议版本的 OpenSSL 1.1 API 分别为SSLContext.minimum_versionSSLContext.maximum_version。几个新标志(例如HAS_TLSv1_1)指示了受支持的协议。 (由 Chris Heimes 在bpo-32609中贡献。)

string

string.Template现在允许您有选择地分别修改大括号占位符和非大括号占位符的正则表达式模式。 (由 Barry Warsaw 在bpo-1198569中贡献。)

subprocess

subprocess.run()函数接受新的* capture_output 关键字参数。设置为 true 时,将捕获 stdout 和 stderr。这等效于将subprocess.PIPE作为 stdout stderr *参数传递。 (由 Bo Bayles 在bpo-32102中贡献。)

subprocess.run函数和subprocess.Popen构造函数现在接受* text 关键字参数作为 universal_newlines *的别名。 (由 Andrew Clegg 在bpo-31756中贡献。)

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

现在,在subprocess.call()subprocess.run()Popen上下文 Management 器中处理KeyboardInterrupt时,子流程模块更加优雅。现在,在 continue 处理KeyboardInterrupt异常之前,它会 await 一小段时间让孩子退出。 (由 Gregory P. Smith 在bpo-25942中贡献。)

sys

新的sys.breakpointhook()钩子函数由内置breakpoint()调用。 (由bpo-31353中的 Barry Warsaw 贡献。)

在 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中贡献。)

time

PEP 564time模块添加了六个具有纳秒分辨率的新Function:

新的时钟标识符已添加:

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

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

tkinter

新的tkinter.ttk.Spinbox类现在可用。 (由 Alan Moore 在bpo-32585中贡献。)

tracemalloc

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

types

新的WrapperDescriptorTypeMethodWrapperTypeMethodDescriptorTypeClassMethodDescriptorType类现在可用。 (由bpo-29377的 Manuel Krebber 和 Guido van Rossum 以及bpo-32265的 Serhiy Storchaka 贡献。)

新的types.resolve_bases()函数按照 PEP 560的指定动态地解析 MRO 条目。 (由 Ivan Levkivskyi 在bpo-32717中贡献。)

unicodedata

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

unittest

新的-k命令行选项允许按名称子字符串或类似 Unix Shell 的模式过滤测试。例如,python -m unittest -k foo运行foo_tests.SomeTest.test_somethingbar_tests.SomeTest.test_foo,而不是bar_tests.FooTest.test_something。 (由 Jonas Haag 在bpo-32071中贡献。)

unittest.mock

现在,当sentinel属性为copiedpickled时,将保留其标识。 (由 Serhiy Storchaka 在bpo-20804中贡献。)

新的seal()函数允许密封Mock实例,这将不允许进一步创建属性模拟。该密封以递归方式应用于所有本身是模拟的属性。 (由 Mario Corchero 在bpo-30541中贡献。)

urllib.parse

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

uu

uu.encode()函数现在接受一个可选的* backtick *关键字参数。如果为 true,则零由'`'表示,而不是空格。 (由张翔在bpo-30103中贡献。)

uuid

新的UUID.is_safe属性从平台中继有关是否使用 multiprocessing 安全方法生成的 UUID 的信息。 (由 Barry Warsaw 在bpo-22807中贡献。)

uuid.getnode()现在比本地 Management 的 MAC 地址更喜欢通用 Management 的 MAC 地址。这为从uuid.uuid1()返回的 UUID 的全局唯一性提供了更好的保证。如果只有本地 Management 的 MAC 地址可用,则返回找到的第一个此类 MAC 地址。 (由bpo-32107中的 Barry Warsaw 贡献。)

warnings

默认警告过滤器的初始化已更改如下:

  • pass命令行选项(包括-b和新的 CPython 特定的-X dev选项)启用的警告始终passsys.warnoptions属性传递给警告机制。

  • 现在,pass命令行或环境启用的警告过滤器具有以下优先 Sequences:

Note

  • -b(或-bb)的BytesWarning过滤器

  • 使用-W选项指定的所有过滤器

  • 使用 PYTHONWARNINGS环境变量指定的所有过滤器

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

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

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

(由 Nick Coghlan 和 Victor Stinner 在bpo-20361bpo-32043bpo-32230中贡献。)

默认情况下,弃用警告会在单文件脚本和交互式提示下再次显示。有关详情,请参见PEP 565:在__main_中显示弃用警告。 (由 Nick Coghlan 在bpo-31975中贡献。)

xml.etree

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

xmlrpc.server

SimpleXMLRPCDispatcher.register_function现在可以用作装饰器。 (由张翔在bpo-7769中贡献。)

zipapp

现在,函数create_archive()接受一个可选的* filter *参数,以允许用户选择应将哪些文件包括在存档中。 (由 Irmen de Jong 在bpo-31072中贡献。)

现在,函数create_archive()接受一个可选的* compressed *参数来生成压缩存档。还添加了命令行选项--compress以支持压缩。 (由王志明在bpo-31638中贡献。)

zipfile

ZipFile现在接受新的* compresslevel *参数来控制压缩级别。 (由 Bo Bayles 在bpo-21417中贡献。)

现在,以ZipFile创建的 Files 中的子目录按字母 Sequences 存储。 (由 Bernhard M. Wiedemann 在bpo-30693中贡献。)

C API 更改

已实现用于线程本地存储的新 API。概述请参见PEP 539:用于线程本地存储的新 C API,完整参考请参见线程特定存储(TSS)API。 (由山本昌幸在bpo-25658中贡献。)

新的context variablesFunction公开了新的 C API

新的PyImport_GetModule()函数返回以前导入的具有给定名称的模块。 (由 Eric Snow 在bpo-28411中贡献。)

新的Py_RETURN_RICHCOMPARE宏使编写丰富的比较Function变得容易。 (由 Petr Victorin 在bpo-23699中贡献。)

新的Py_UNREACHABLE宏可用于标记无法访问的代码路径。 (由 Barry Warsaw 在bpo-31338中贡献。)

tracemalloc现在pass新的PyTraceMalloc_Track()PyTraceMalloc_Untrack()函数公开了 C API。 (由 Victor Stinner 在bpo-30054中贡献。)

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

结构PyMemberDefPyGetSetDefPyStructSequence_FieldPyStructSequence_Descwrapperbase的字段namedoc现在为const char *类型,而不是char *类型。 (由 Serhiy Storchaka 在bpo-28761中贡献。)

PyUnicode_AsUTF8AndSize()PyUnicode_AsUTF8()的结果现在为const char *类型,而不是char *类型。 (由 Serhiy Storchaka 在bpo-28769中贡献。)

PyMapping_Keys()PyMapping_Values()PyMapping_Items()的结果现在始终是列表,而不是列表或 Tuples。 (由 Oren Milman 在bpo-28280中贡献。)

添加了FunctionPySlice_Unpack()PySlice_AdjustIndices()。 (由 Serhiy Storchaka 在bpo-27867中贡献。)

不推荐使用PyOS_AfterFork(),而推荐使用新FunctionPyOS_BeforeFork()PyOS_AfterFork_Parent()PyOS_AfterFork_Child()。 (由bpo-16500中的 Antoine Pitrou 提供。)

属于公共 API 的PyExc_RecursionErrorInst单例已被删除,因为从未清除其成员可能会在解释器完成期间导致段错误。由 Xavier de Gaye 在bpo-22898bpo-30697中贡献。

添加了对时区构造函数PyTimeZone_FromOffset()PyTimeZone_FromOffsetAndName()的时区的 C API 支持,并passPyDateTime_TimeZone_UTC访问 UTC 单例。由 Paul Ganssle 在bpo-10381中贡献。

PyThread_start_new_thread()PyThread_get_thread_ident()的结果类型以及PyThreadState_SetAsyncExc()的* id *参数从long更改为unsigned long。 (由 Serhiy Storchaka 在bpo-6532中贡献。)

如果第二个参数是NULL并且wchar_t*字符串包含空字符,则PyUnicode_AsWideCharString()现在引发ValueError。 (由 Serhiy Storchaka 在bpo-30708中贡献。)

启动 Sequences 的更改和动态内存分配器的 Management 意味着,长期以来,在调用大多数 C API 函数之前先调用Py_Initialize()的要求已得到越来越多的记录,如果不遵守它,可能会导致嵌入应用程序出现段错误。有关更多详细信息,请参见本文档的移植到 Python 3.7部分和 C API 文档的在 Python 初始化之前部分。

新的PyInterpreterState_GetID()返回给定解释器的唯一 ID。 (由 Eric Snow 在bpo-29102中贡献。)

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

PyUnicode_DecodeLocaleAndSize()PyUnicode_EncodeLocale()现在将当前的语言环境编码用于surrogateescape错误处理程序。 (由 Victor Stinner 在bpo-29240中贡献。)

现在已将PyUnicode_FindChar()的* start end *参数调整为类似于字符串片段。 (由张翔在bpo-28822中贡献。)

Build Changes

对构建--without-threads的支持已删除。 threading模块现在始终可用。 (由bpo-31370中的 Antoine Pitrou 提供。)。

在非 OSX UNIX 平台上构建_ctypes模块时,不再 Binding 使用 libffi 的完整副本。在此类平台上构建_ctypes时,现在需要 libffi 的已安装副本。 (由 Zachary Ware 在bpo-27979中贡献。)

Windows 的构建过程不再依赖 Subversion 来获取外部资源,而是使用 Python 脚本从 GitHub 下载 zip 文件。如果在系统上(passpy -3.6)未找到 Python 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。 LibreSSL 2.6.4 之前的版本缺少必需的 OpenSSL 1.0.2 API。

Optimizations

pass移植更多代码以使用METH_FASTCALL约定,已大大降低了调用用 C 实现的各种标准库类的许多方法的开销。 (由 Victor Stinner 在bpo-29300bpo-29507bpo-29452bpo-29286中贡献。)

各种优化使 Linux 上的 Python 启动时间减少了 10%,而在 macOS 上减少了 30%。 (由 Victor Stinner,bpo-29585中的 INADA Naoki 和bpo-31333中的 Ivan Levkivskyi 贡献。)

由于字节码的更改(避免创建绑定的方法实例),现在方法调用的速度提高了 20%。 (由 Yury Selivanov 和 INADA Naoki 在bpo-26110中贡献。)

asyncio模块对常用Function进行了许多值得注意的优化:

由于PEP 560 工作,因此typing的导入时间减少了 7 倍,许多键入操作现在都更快了。 (由 Ivan Levkivskyi 在bpo-32226中贡献。)

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

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

现在,如果未找到* name obj *不覆盖object.getattr()object.getattribute(),则hasattr()getattr()的速度大约提高了 4 倍。 (由 INADA Naoki 在bpo-32544中贡献。)

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

重新实现了collections.namedtuple()工厂,以使命名 Tuples 的创建速度提高了 4 到 6 倍。 (由 Jelle Zijlstra 贡献,而 INADA Naoki,Serhiy Storchaka 和 Raymond Hettinger 在bpo-28638中进行了进一步的改进。)

在常见情况下,date.fromordinal()date.fromtimestamp()现在快了 30%。 (由 Paul Ganssle 在bpo-32403中贡献。)

由于使用了os.scandir(),现在os.fwalk()函数的速度提高了 2 倍。 (由 Serhiy Storchaka 在bpo-25996中贡献。)

由于使用了os.scandir()函数,shutil.rmtree()函数的速度已提高了 20–40%。 (由 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中贡献。)

在重负载下,类selectors.EpollSelectorselectors.PollSelectorselectors.DevpollSelectormodify()方法可能快 10%左右。 (由 Giampaolo Rodola'在bpo-30014中贡献)

恒定折叠已从窥孔优化器移到了新的 AST 优化器,该优化器可以更一致地执行优化。 (由 Eugene Toder 和 INADA Naoki 在bpo-29469bpo-11549中贡献。)

abc中的大多数函数和方法都已用 C 重写。这使得创建抽象 Base Class 的速度提高了 1.5 倍,从而使抽象 Base Class 的调用速度更快。这也将 Python 启动时间减少了多达 10%。 (由 Ivan Levkivskyi 和 INADA Naoki 在bpo-31333中贡献)

当不构造子类时,pass使用快速路径构造器,可以极大地提高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 实现的更改

  • 跟踪钩子现在可以pass在要跟踪的帧上设置相应的新f_trace_linesf_trace_opcodes属性来选择不接收line并选择接受来自解释器的opcode事件。 (由 Nick Coghlan 在bpo-31344中贡献。)

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

  • 现在,locals()词典按词汇 Sequences 显示已定义变量。以前,Sequences 是不确定的。 (由 Raymond Hettinger 在bpo-32690中贡献。)

  • distutils upload命令不再try将 CR 行尾字符更改为 CRLF。这可以解决 sdists 以一个等于 CR 的字节结尾的损坏问题。 (由 Bo Bayles 在bpo-32304中贡献。)

不推荐使用的 Python 行为

现在,在理解和生成器表达式(除了最左边的for子句中的可迭代表达式)中,不赞成使用 yield 表达式(yieldyield from子句)。这样可以确保 Comprehensions 总是立即返回适当类型的容器(而不是可能返回generator iterator对象),而生成器表达式不会try将其隐式输出与任何显式 yield 表达式的输出进行交织。在 Python 3.7 中,此类表达式在编译时会发出DeprecationWarning,在 Python 3.8 中则为SyntaxError。 (由 Serhiy Storchaka 在bpo-10544中贡献。)

object.complex()返回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

不建议直接支持asyncio.Lock awaiting 个实例和其他异步同步 Primitives。必须使用异步上下文 Management 器才能获取和释放同步资源。 (由 Andrew Svetlov 在bpo-32253中贡献。)

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

collections

在 Python 3.8 中,collections.abc中的抽象 Base Class 将不再在常规collections模块中公开。这将有助于在具体类和抽象 Base Class 之间构建更清晰的区分。 (由 Serhiy Storchaka 在bpo-25988中贡献。)

dbm

dbm.dumb现在支持读取只读文件,并且在不更改索引文件的情况下不再写入索引文件。现在,如果缺少索引文件并以'r''w'模式重新创建索引文件,则会发出弃用警告(这在将来的 Python 版本中将是一个错误)。 (由 Serhiy Storchaka 在bpo-28847中贡献。)

enum

在 Python 3.8 中,try检查Enum类中的非 Enum 对象将引发TypeError(例如1 in Color);类似地,try检查Flag成员中的非 Flag 对象将引发TypeError(例如1 in Perm.RW);当前,这两个操作都返回False。 (由 Ethan Furman 在bpo-33217中贡献。)

gettext

现在不建议使用非整数值在gettext中选择复数形式。它永远无法正常工作。 (由 Serhiy Storchaka 在bpo-28692中贡献。)

importlib

在 Python 3.4 中不推荐使用的方法MetaPathFinder.find_module()(由MetaPathFinder.find_spec()替换)和PathEntryFinder.find_loader()(由PathEntryFinder.find_spec()替换)现在发出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 中删除。 (由 Chi Hsuan Yen 在bpo-9850中贡献。)

threading

dummy_threading_dummy_thread已弃用。不再可能在禁用线程的情况下构建 Python。改用threading。 (由bpo-31370中的 Antoine Pitrou 提供。)

socket

socket.htons()socket.ntohs()中的无提示参数值截断已被弃用。在将来的 Python 版本中,如果传递的参数大于 16 位,则会引发异常。 (由 Oren Milman 在bpo-28332中贡献。)

ssl

ssl.wrap_socket()已弃用。请改用ssl.SSLContext.wrap_socket()。 (由 Chris 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 弃用的Function和类型

如果未设置Py_LIMITED_API或将其设置为0x030504000x03060000之间(不包括在内)或0x03060100或更高的值,则不建议使用函数PySlice_GetIndicesEx()并用宏替换。 (由 Serhiy Storchaka 在bpo-27867中贡献。)

PyOS_AfterFork()已弃用。请改用PyOS_BeforeFork()PyOS_AfterFork_Parent()PyOS_AfterFork_Child()。 (由bpo-16500中的 Antoine Pitrou 提供。)

平台支持删除

  • 不再正式支持 FreeBSD 9 和更早的版本。

  • 为了全面支持 Unicode,包括在扩展模块中,* nix 平台现在有望提供C.UTF-8(完整语言环境),C.utf8(完整语言环境)或UTF-8(仅LC_CTYPE-仅语言环境)中的至少一种,以替代基于ASCII的传统语言C语言环境。

  • 不再支持 OpenSSL 0.9.8 和 1.0.1,这意味着在仍使用这些版本的旧平台上使用 SSL/TLS 支持构建 CPython 3.7 时,需要自定义生成选项,这些选项链接到 OpenSSL 的最新版本。

值得注意的是,此问题影响 Debian 8(又名“ jessie”)和 Ubuntu 14.04(又名“ Trusty”)LTS Linux 发行版,因为它们默认仍使用 OpenSSL 1.0.1.

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

CPython 自己的CI 配置文件提供了一个示例,该示例使用 CPython 测试套件中的 SSL 兼容性测试基础架构来针对 OpenSSL 1.1.0 构建和链接,而不是使用过时的系统提供的 OpenSSL。

API 和Function删除

以下Function和 API 已从 Python 3.7 中删除:

  • os.stat_float_times()Function已被删除。它是在 Python 2.3 中引入的,目的是与 Python 2.2 向后兼容,从 Python 3.1 开始不推荐使用。

  • 在 Python 3.5 中已弃用由'\'re.sub()的替换模板中的 ASCII 字母组成的未知转义,在 Python 3.5 中已弃用,现在将导致错误。

  • 删除了tarfile.TarFile.add()中对* exclude 参数的支持。在 Python 2.7 和 3.2 中已弃用。请改用 filter *参数。

  • ntpath模块中的splitunc()函数在 Python 3.1 中已弃用,现已删除。请使用splitdrive()函数。

  • collections.namedtuple()不再支持* verbose *参数或_source属性,该参数显示了为命名 Tuples 类生成的源代码。这是旨在加速类创建的优化的一部分。 (由 Jelle Zijlstra 贡献,而 INADA Naoki,Serhiy Storchaka 和 Raymond Hettinger 在bpo-28638中进行了进一步的改进。)

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

  • plistlib模块中的 Python 2.4 类PlistDict_InternalDict中不推荐使用。函数readPlist()readPlistFromBytes()的结果中的 Dict 值现在是正常 dict。您不再可以使用属性访问来访问这些词典的项目。

  • asyncio.windows_utils.socketpair()函数已被删除。请使用socket.socketpair()函数,该函数自 Python 3.5 起在所有平台上都可用。 asyncio.windows_utils.socketpair只是 Python 3.5 和更高版本上socket.socketpair的别名。

  • asyncio不再将selectors_overlapped模块导出为asyncio.selectorsasyncio._overlapped。将from asyncio import selectors替换为import selectors

  • 现在禁止直接实例化ssl.SSLSocketssl.SSLObject对象。从未对构造函数进行文档记录,测试或将其设计为公共构造函数。用户应该使用ssl.wrap_socket()ssl.SSLContext。 (由 Chris Heimes 在bpo-32951中贡献。)

  • 未使用的distutils install_misc命令已被删除。 (由bpo-29218中的 Eric N. Vander Weele 贡献。)

Module Removals

fpectl模块已被删除。默认情况下,它从未启用,在 x86-64 上也无法正常工作,并且它以导致意外扩展 C 扩展的方式更改了 Python ABI。 (由 Nathaniel J. Smith 在bpo-29137中贡献。)

Windows-only Changes

python 启动器(py.exe)可以接受 32 位和 64 位说明符,而无需指定次要版本。因此,py -3-32py -3-64以及py -3.7-32都变得有效,现在也接受-* m * -64 和-* m.n * -64 格式来强制使用 64 位 python,即使原本会使用 32 位也是如此。如果指定的版本不可用,py.exe 将错误退出。 (由 Steve Barnes 在bpo-30291中贡献。)

启动器可以py -0运行,以生成已安装的 python 列表,默认情况下标有星号*。运行py -0p将包括路径。如果 py 使用无法匹配的版本说明符运行,它还将打印可用说明符的* short *列表。 (由 Steve Barnes 在bpo-30362中贡献。)

移植到 Python 3.7

本节列出了先前描述的更改以及可能需要对代码进行更改的其他错误修正。

Python 行为的变化

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

  • 在 python 3.7 中为所有代码启用 PEP 479,这意味着在协程和生成器中直接或间接引发的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,因为生成器表达式始终必须直接位于一组括号内,并且任一侧都不能有逗号,并且仅在调用时可以Ellipsis括号的重复。 (由 Serhiy Storchaka 在bpo-32012bpo-32023中贡献。)

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

Python API 中的更改

  • socketserver.ThreadingMixIn.server_close()现在 await,直到所有非守护程序线程完成。将新的socketserver.ThreadingMixIn.block_on_close类属性设置为False以获得 3.7 之前的性能。 (由 Victor Stinner 在bpo-31233bpo-33540中贡献。)

  • socketserver.ForkingMixIn.server_close()现在 await,直到所有子进程完成。将新的socketserver.ForkingMixIn.block_on_close类属性设置为False以获得 3.7 之前的性能。 (由 Victor Stinner 在bpo-31151bpo-33540中贡献。)

  • 现在,在某些情况下,locale.localeconv()函数将LC_CTYPE语言环境临时设置为LC_NUMERIC的值。 (由 Victor Stinner 在bpo-31900中贡献。)

  • 如果* path *是字符串,则pkgutil.walk_packages()现在引发ValueError。以前返回了一个空列表。 (由 Sanyam Khurana 在bpo-24744中贡献。)

  • string.Formatter.format()的格式字符串参数现在为positional-only。在 Python 3.5 中不建议将其作为关键字参数传递。 (由 Serhiy Storchaka 在bpo-29193中贡献。)

  • 类别http.cookies.Morsel的属性keyvaluecoded_value现在是只读的。在 Python 3.5 中不推荐使用它们。使用set()方法进行设置。 (由 Serhiy Storchaka 在bpo-29192中贡献。)

  • os.makedirs()的* mode *参数不再影响新创建的中间级目录的文件许可权位。要设置其文件权限位,可以在调用makedirs()之前设置 umask。 (由 Serhiy Storchaka 在bpo-19930中贡献。)

  • struct.Struct.format类型现在是str而不是bytes。 (由 Victor Stinner 在bpo-21071中贡献。)

  • parse_multipart()现在接受* encoding errors *参数,并返回与FieldStorage相同的结果:对于非文件字段,与键关联的值是字符串列表,而不是字节列表。 (由 Pierre Quentel 在bpo-29979中贡献。)

  • 由于socket的内部更改,因此不支持在较旧的 Python 版本中在socket.share创建的套接字上调用socket.fromshare()

  • BaseExceptionrepr已更改为不包含结尾逗号。大多数 exception 都受此更改的影响。 (由 Serhiy Storchaka 在bpo-30399中贡献。)

  • datetime.timedeltarepr已更改为在输出中包含关键字参数。 (由 Utkarsh Upadhyay 在bpo-30302中贡献。)

  • 由于现在使用os.scandir()函数实现shutil.rmtree(),因此在列出目录失败时,现在使用第一个参数os.scandir而不是os.listdir调用用户指定的处理程序* onerror *。

  • 将来可能会添加对Unicode 技术标准#18中的正则表达式中的嵌套集和集合操作的支持。这将更改语法。为了便于将来进行更改,目前暂时在模棱两可的情况下会提出FutureWarning。其中包括以 Literals'['开头或包含 Literals 字符序列'--''&&''~~''||'的集合。为避免警告,请使用反斜杠将其转义。 (由 Serhiy Storchaka 在bpo-30349中贡献。)

  • regular expression上拆分一个可能与空字符串匹配的字符串的结果已更改。例如,在r'\s*'上进行拆分现在不仅会像以前那样在空白上进行拆分,而且还会在所有非空白字符之前和字符串结尾之前的空字符串上进行拆分。pass将模式更改为r'\s+'可以恢复以前的行为。从 Python 3.5 开始,针对此类模式发出了FutureWarning

对于同时匹配空字符串和非空字符串的模式,在其他情况下,搜索所有匹配项的结果也可能会更改。例如,在字符串'a\n\n'中,模式r'(?m)^\s*?$'不仅将匹配位置 2 和 3 处的空字符串,而且还将匹配位置 2-3 处的字符串'\n'。为了仅匹配空白行,应将模式重写为r'(?m)^[^\S\n]*$'

re.sub()现在替换先前的非空匹配项旁边的空匹配项。例如re.sub('x*', '-', 'abxd')现在返回'-a-b--d-'而不是'-a-b-d-'(“ b”和“ d”之间的第一个减号替换“ x”,第二个负号替换“ x”和“ d”之间的空字符串)。

(由 Serhiy Storchaka 在bpo-25054bpo-32308中贡献。)

C API 的更改

对于可调整大小的序列,FunctionPySlice_GetIndicesEx()被认为是不安全的。如果切片索引不是int的实例,而是实现__index__()方法的对象,则可以在将序列的长度传递给PySlice_GetIndicesEx()之后调整序列的大小。这可能导致返回的索引超出序列的长度。为了避免可能的问题,请使用新FunctionPySlice_Unpack()PySlice_AdjustIndices()。 (由 Serhiy Storchaka 在bpo-27867中贡献。)

CPython 字节码更改

有两个新的操作码:LOAD_METHODCALL_METHOD。 (由 Yury Selivanov 和 INADA Naoki 在bpo-26110中贡献。)

STORE_ANNOTATION操作码已被删除。 (由 Mark Shannon 在bpo-32550中贡献。)

Windows-only Changes

现在,用于覆盖sys.path的文件称为<python-executable>._pth而不是'sys.path'。有关更多信息,请参见Finding modules。 (由 Steve Dower 在bpo-28137中贡献。)

其他 CPython 实现的更改

为了为将来可能对公共 CPython 运行时初始化 API 的更改做准备(请参阅 PEP 432以获取初始但有些过时的草案),CPython 的内部启动和配置 Management 逻辑已进行了重大重构。尽管这些更新对于嵌入式应用程序和常规 CPython CLI 的用户都是完全透明的,但在此提及它们是因为重构会在解释器启动期间更改各种操作的内部 Sequences,因此可能会发现以前潜在的缺陷,或者嵌入应用程序或 CPython 本身。 (最初由 Nick Coghlan 和 Eric Snow 作为bpo-22257的一部分提供,并由 Nick,Eric 和 Victor Stinner 在许多其他问题上进行了进一步更新)。一些已知的细节受到影响:

由于默认警告过滤器的配置方式发生了变化,将Py_BytesWarningFlag设置为大于 1 的值不再足以发出BytesWarning消息并将其转换为异常。相反,必须设置该标志(首先使警告发出),并添加一个显式的error::BytesWarning警告过滤器以将其转换为异常。

由于编译器处理文档字符串的方式发生了变化,现在仅由文档字符串组成的函数主体中的隐式return None被标记为与文档字符串在同一行上,而不是在函数的标题行上。

当前的异常状态已从框架对象移至协同例程。这简化了解释器,并修复了由于在进入或退出生成器时具有交换异常状态而导致的一些晦涩的错误。 (由 Mark Shannon 在bpo-25612中贡献。)

Python 3.7.1 中的重大更改

从 3.7.1 开始,现在Py_Initialize()始终读取并遵守与Py_Main()相同的所有环境设置(在早期的 Python 版本中,它遵循这些环境变量的定义不正确的子集,而在 Python 3.7.0 中则不读取任何环境设置)由于bpo-34247)。如果不需要此行为,请在调用Py_Initialize()之前将Py_IgnoreEnvironmentFlag设置为 1.

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

在 3.7.1 中,当提供了没有尾随新行的 Importing 时,tokenize模块现在隐式发出NEWLINE令牌。现在,此行为与 C 标记程序内部执行的操作匹配。 (由 Ammar Askar 在bpo-33899中贡献。)

Python 3.7.2 的重大更改

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

Python 3.7.6 的重大更改

由于重大安全问题,不再支持asyncio.loop.create_datagram_endpoint()的* reuse_address *参数。这是因为 UDP 中套接字选项SO_REUSEADDR的行为。有关更多详细信息,请参见loop.create_datagram_endpoint()的文档。 (由bpo-37228中的 Kyle Stanley,Antoine Pitrou 和 Yury Selivanov 贡献。)