python 3.9的新功能

释放

3.10.0a4

日期

十月 23, 2021

编辑

Łukasz Langa

本文解释了Python3.9与3.8相比的新特性。Python3.9于2020年10月5日发布。

有关详细信息,请参阅 changelog .

参见

PEP 596 -Python 3.9发布时间表

总结——发布亮点

新的语法功能:

  • PEP 584 ,并集运算符添加到 dict

  • PEP 585 ,在标准集合中键入提示泛型;

  • PEP 614 ,放宽了对装饰者的语法限制。

新的内置功能:

  • PEP 616 ,删除前缀和后缀的字符串方法。

标准库中的新功能:

  • PEP 593 灵活的功能和可变的注释;

  • os.pidfd_open() 添加了允许过程管理而无需竞争和信号的功能。

解释器改进:

  • PEP 573 从C扩展类型的方法快速访问模块状态;

  • PEP 617 ,CPython现在使用了新的基于PEG的解析器;

  • 大量Python内置(range、tuple、set、frozenset、list、dict)现在使用 PEP 590 向量呼叫;

  • 垃圾收集不对复活的对象进行挡路;

  • 一些Python模块 (_abcaudioop_bz2_codecs_contextvars_crypt_functools_json_localemathoperatorresourcetime_weakref )现在使用PEP 489定义的多阶段初始化;

  • 一些标准库模块 (audioopastgrp_hashlibpwd_posixsubprocessrandomselectstructtermioszlib )现在使用PEP 384定义的稳定ABI。

新的存储库模块:

发布流程更改:

  • PEP 602 ,CPython采用年度发布周期。

您应该检查代码中的DeprecationWarning

当Python2.7仍然被支持时,为了向后兼容Python2.7,Python3中保留了很多功能。随着Python2支持的结束,这些向后兼容层已经或即将被删除。他们中的大多数都会排放一种 DeprecationWarning 警告了好几年。例如,使用 collections.Mapping 而不是 collections.abc.Mapping 发出一种 DeprecationWarning 从2012年发布的Python3.3开始。

使用测试应用程序 -W default 要查看的命令行选项 DeprecationWarningPendingDeprecationWarning ,甚至与 -W error 把它们当作错误来对待。 Warnings Filter 可用于忽略来自第三方代码的警告。

Python3.9是提供Python2向后兼容层的最后一个版本,以便让Python项目维护人员有更多时间组织删除Python2支持并添加对Python3.9的支持。

别名到 Abstract Base Classescollections 模块,比如 collections.Mapping 别名 collections.abc.Mapping ,保留为最后一个版本,以便向后兼容。它们将从Python3.10中删除。

一般来说,试着在 Python Development Mode 这有助于准备代码,使其与下一个Python版本兼容。

注意:此版本的Python中也删除了许多先前存在的弃用功能。请查阅 远离的 部分。

新特点

词典合并和更新运算符

合并 (| )和更新 (|= )运算符已添加到内置的 dict 班级。这些是对现有的 dict.update{{**d1, **d2}} 合并词典的方法。

例子::

>>> x = {"key1": "value1 from x", "key2": "value2 from x"}
>>> y = {"key2": "value2 from y", "key3": "value3 from y"}
>>> x | y
{'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}
>>> y | x
{'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}

看见 PEP 584 获取完整的描述。(Brandt Bucher在 bpo-36144 。)

删除前缀和后缀的新字符串方法

str.removeprefix(prefix)str.removesuffix(suffix) 已添加以轻松从字符串中删除不需要的前缀或后缀。对应的 bytesbytearraycollections.UserString 还添加了方法。见 PEP 616 完整的描述。(丹尼斯·斯威尼供稿 bpo-39939

在标准集合中键入提示泛型

在类型注释中,现在可以使用内置的集合类型,如 listdict 作为泛型类型而不是导入相应的大写类型(例如。 ListDict )从 typing . 标准库中的其他一些类型现在也是泛型的,例如 queue.Queue .

例子:

def greet_all(names: list[str]) -> None:
    for name in names:
        print("Hello", name)

PEP 585 更多细节。(由Guido van Rossum、Ethan Smith和Batuhan Taşkaya在 bpo-39481

新解析器

Python 3.9使用了一个新的解析器,基于 PEG 而不是 LL(1) . 新的解析器的性能与旧的解析器大致相当,但是PEG形式主义在设计新的语言特性时比LL(1)更灵活。我们将在Python3.10和更高版本中开始使用这种灵活性。

这个 ast 模块使用新的解析器并生成与旧解析器相同的AST。

在Python3.10中,旧的解析器将被删除,依赖它的所有功能(主要是 parser 模块,它早就被弃用了)。在Python3.9中 only ,可以使用命令行开关切换回LL(1)解析器 (-X oldparser )或环境变量 (PYTHONOLDPARSER=1

PEP 617 更多细节。(由Guido van Rossum、Pablo Galindo和Lysandos Nikolaou在 bpo-40334

其他语言更改

  • __import__() 现在提出 ImportError 而不是 ValueError ,这通常发生在相对导入经过其顶级包时。(作者:Ngalim Siregar in) bpo-37444

  • python现在获取命令行上指定的脚本文件名的绝对路径(例如: python3 script.py ): __file__ 的属性 __main__ 模块变成了一条绝对路径,而不是相对路径。在当前目录更改为 os.chdir() . 作为副作用,回溯还显示 __main__ 本例中的模块框架。(由Victor Stinner在 bpo-20443

  • Python Development Mode 在调试版本中 编码错误 现在检查参数是否有字符串编码和解码操作。示例: open()str.encode()bytes.decode() .

    默认情况下,为了获得最佳性能 错误 参数只在第一个编码/解码错误和 编码 对于空字符串,有时忽略参数。(由Victor Stinner在 bpo-37388

  • "".replace("", s, n) 现在回报 s 而不是所有非零的空字符串 n . 现在与 "".replace("", s) . 也有类似的变化 bytesbytearray 物体。(塞尔希斯托查卡在 bpo-28029

  • 任何有效的表达式现在都可以用作 decorator . 以前,语法限制要严格得多。见 PEP 614 详细情况。(布兰特·布彻于 bpo-39702

  • 改进了对 typing 模块。现在为所有特殊形式和特殊的通用别名(如 UnionList )使用 help() 一般别名如下 List[int] 将显示对应混凝土类型的帮助 (list 在这种情况下)。(塞尔希斯托查卡在 bpo-40257

  • 并行运行 aclose() / asend() / athrow() 现在是被禁止的,而且 ag_running 现在反映异步生成器的实际运行状态。(Yury Selivanov在 bpo-30773 。)

  • 调用 __iter__ 方法不再由 TypeErrorin 运算符和函数 contains()indexOf()countOf()operator 模块。(Serhiy Storchaka在 bpo-40824 。)

新模块

区域信息

这个 zoneinfo 模块为标准库提供了对IANA时区数据库的支持。它补充道 zoneinfo.ZoneInfo ,混凝土 datetime.tzinfo 由系统时区数据支持的实现。

例子::

>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta

>>> # Daylight saving time
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(dt)
2020-10-31 12:00:00-07:00
>>> dt.tzname()
'PDT'

>>> # Standard time
>>> dt += timedelta(days=7)
>>> print(dt)
2020-11-07 12:00:00-08:00
>>> print(dt.tzname())
PST

作为不提供IANA数据库的平台的数据回退源 tzdata 模块是作为第一方包发布的——通过PyPI分发,由CPython核心团队维护。

参见

PEP 615 --在标准库中支持IANA时区数据库

Paul Ganssle编写并实现的PEP

格拉夫利布

一个新的模块, graphlib ,已添加,其中包含 graphlib.TopologicalSorter 类提供执行图形拓扑排序的功能。(由Pablo Galindo,Tim Peters和Larry Hastings在 bpo-17005 。)

改进的模块

AST

增加了 缩进 选择权 dump() 它允许生成多行缩进输出。(塞尔希斯托查卡在 bpo-37995

补充 ast.unparse() 作为 ast 可用于断开 ast.AST 对象并生成一个字符串,该字符串的代码将生成等效的 ast.AST 对象解析时。(Pablo Galindo和Batuhan Taskaya在 bpo-38870

向包含用于构造该节点的ASDL签名的AST节点添加docstring。(作者:巴图汉·塔卡亚 bpo-39638

asyncio

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

增加了一个新的 coroutine shutdown_default_executor() 为等待 ThreadPoolExecutor 完成收尾。也, asyncio.run() 已更新为使用新的 coroutine . (作者:Kyle Stanley in) bpo-34037

补充 asyncio.PidfdChildWatcher ,一个特定于Linux的子观察程序实现,用于轮询进程文件描述符。 (bpo-38692

增加了一个新的 coroutine asyncio.to_thread() . 它主要用于在单独的线程中运行IO绑定函数,以避免阻塞事件循环,并且基本上作为 run_in_executor() 它可以直接接受关键字参数。(作者凯尔·斯坦利和尤里·塞利万诺夫 bpo-32309

当由于超时而取消任务时, asyncio.wait_for() 现在将等待,直到取消完成,在以下情况下也是如此 超时 <=0,就像它对正超时所做的那样。(Elvis Pranskevichus在 bpo-32751 。)

asyncio 现在提高 TyperError 方法调用不兼容的方法时 ssl.SSLSocket 插座。(Ido Michael在 bpo-37404 。)

编译所有

增加了使用硬链接复制的新可能性 .pyc 文件夹: hardlink_dupes 参数和--hardlink dupes命令行选项。(由鲁米尔巴尔哈尔在 bpo-40495

在结果中添加了路径操作的新选项 .pyc 文件夹: stripdir公司前置器limit_sl_dest 参数和-s、-p、-e命令行选项。添加了多次为优化级别指定选项的可能性。(由鲁米尔巴尔哈尔在 bpo-38112

concurrent.futures

增加了一个新的 cancel_futures 参数到 concurrent.futures.Executor.shutdown() 这将取消所有尚未开始运行的挂起期货,而不是在关闭执行器之前等待它们完成。(作者:Kyle Stanley in) bpo-39349

已从中删除守护进程线程 ThreadPoolExecutorProcessPoolExecutor . 这提高了与子解释器的兼容性和它们的关闭过程的可预测性。(作者:Kyle Stanley in) bpo-39812

工人 ProcessPoolExecutor 现在是按需生成的,只有当没有可用的空闲工人可重用时。这优化了启动开销,减少了空闲工人丢失的CPU时间。(作者:Kyle Stanley in) bpo-39207

curses

已添加 curses.get_escdelay()curses.set_escdelay()curses.get_tabsize() ,以及 curses.set_tabsize() 功能。(安东尼·索蒂尔在 bpo-38312 。)

日期时间

这个 isocalendar() 属于 datetime.dateisocalendar() 属于 datetime.datetime 方法现在返回 namedtuple() 而不是 tuple . (董熙娜供稿 bpo-24416

迪斯妥尔

这个 upload 命令现在创建SHA2-256和Blake2b-256哈希摘要。它在阻止MD5摘要的平台上跳过MD5。(克里斯汀·海姆斯在 bpo-40698

文件锁

添加的常量 F_OFD_GETLKF_OFD_SETLKF_OFD_SETLKW . (董熙娜供稿 bpo-38602

FTPLIB

FTPFTP_TLS 现在提出一个 ValueError 如果其构造函数的给定超时为零以阻止创建非阻塞套接字。(董熙娜供稿 bpo-39259

GC

当垃圾收集器生成一个集合时,其中某些对象会复活(在执行终结器之后,它们可以从独立的循环外部访问),不要阻止仍然无法访问的所有对象的集合。(Pablo Galindo和Tim Peters在 bpo-38379

添加了一个新函数 gc.is_finalized() 检查垃圾收集器是否已完成对象。(Pablo Galindo于 bpo-39322

hashlib

这个 hashlib 模块现在可以使用SHA3散列并在可用的情况下从OpenSSL抖动XOF。(Christian Heimes在 bpo-37630 。)

内置哈希模块现在可以用 ./configure --without-builtin-hashlib-hashes 或有选择地启用,例如。 ./configure --with-builtin-hashlib-hashes=sha3,blake2 强制使用基于OpenSSL的实现。(克里斯汀·海姆斯在 bpo-40479

HTTP协议

状态代码 103 EARLY_HINTS418 IM_A_TEAPOT425 TOO_EARLY 被添加到 http.HTTPStatus . (董熙娜供稿 bpo-39509 罗斯·罗德斯在 bpo-39507

空闲和空闲

增加了关闭光标闪烁的选项。(Zackery Spytz在 bpo-4603 。)

Escape键现在关闭空闲完成窗口。(作者:Johnny Najera bpo-38944

将关键字添加到模块名称完成列表。(Terry J.Redy在 bpo-37765 。)

以上更改已后传到3.8维护版本中。

IMAPLIB

IMAP4IMAP4_SSL 现在有一个可选的 超时 其构造函数的参数。而且 open() 方法现在有一个可选的 超时 参数与此更改。的重写方法 IMAP4_SSLIMAP4_stream 已应用于此更改。(董熙娜供稿 bpo-38615

imaplib.IMAP4.unselect() 添加。 imaplib.IMAP4.unselect() 释放与选定邮箱关联的服务器资源,并将服务器返回到已验证状态。此命令执行的操作与 imaplib.IMAP4.close() ,但不会从当前选定的邮箱中永久删除任何邮件。(董熙娜供稿 bpo-40375

importlib

为了提高与import语句的一致性, importlib.util.resolve_name() 现在提出 ImportError 而不是 ValueError 对于无效的相对导入尝试。(作者:Ngalim Siregar in) bpo-37444

发布不可变模块对象的导入加载器现在除了可以发布单个模块之外,还可以发布不可变包。(Dino Viehland在 bpo-39336 。)

已添加 importlib.resources.files() 支持包数据中的子目录的函数,与 importlib_resources 版本1.5。(Jason R.Coombs在 bpo-39791 。)

已刷新 importlib.metadata 从… importlib_metadata 版本1.6.1。

检查

inspect.BoundArguments.arguments 从变 OrderedDict 致定期听写(由稻田直树于 bpo-36350bpo-39775

IP地址

ipaddress 现在支持IPv6范围的地址(带后缀的IPv6地址 %<scope_id>

作用域IPv6地址可以使用 ipaddress.IPv6Address . 如果存在,作用域区域ID可通过 scope_id 属性。(作者Oleksandr Pavliuk in) bpo-34788

数学

扩大了 math.gcd() 函数来处理多个参数。以前,它只支持两个参数。(塞尔希斯托查卡在 bpo-39648

已添加 math.lcm() :返回指定参数的最小公倍数。(由Mark Dickinson,Ananthakrishnan和Serhiy Storchaka在 bpo-39479bpo-39648 。)

已添加 math.nextafter() :返回后的下一个浮点值 x 朝向 y 。(Victor Stner在 bpo-39288 。)

已添加 math.ulp() :返回浮点数的最低有效位的值。(Victor Stner在 bpo-39310 。)

多重处理

这个 multiprocessing.SimpleQueue 班有新的 close() 方法显式关闭队列。(作者:Victor Stinner bpo-30966

NNTPLIB

NNTPNNTP_SSL 现在提出一个 ValueError 如果其构造函数的给定超时为零以阻止创建非阻塞套接字。(董熙娜供稿 bpo-39259

操作系统

补充 CLD_KILLEDCLD_STOPPED 对于 si_code . (董熙娜供稿 bpo-38493

Exposed the Linux-specific os.pidfd_open() (bpo-38692) and os.P_PIDFD (bpo-38713) for process management with file descriptors.

这个 os.unsetenv() 函数现在也可以在Windows上使用。(作者:Victor Stinner in) bpo-39413

这个 os.putenv()os.unsetenv() 功能现在总是可用的。(作者:Victor Stinner in) bpo-39395

已添加 os.waitstatus_to_exitcode() 功能:将等待状态转换为退出代码。(Victor Stner在 bpo-40094 。)

pathlib

补充 pathlib.Path.readlink() 其作用类似于 os.readlink() . (Girts Folkmanis在 bpo-30618

PDB

现在在Windows上运行 Pdb 支架 ~/.pdbrc 。(Tim Hopper和Dan Lidral-Porter在 bpo-20523 。)

poplib

POP3POP3_SSL 现在提出一个 ValueError 如果其构造函数的给定超时为零以阻止创建非阻塞套接字。(董熙娜供稿 bpo-39259

印记

pprint 现在可以打印了 types.SimpleNamespace . (由Carl Bordum Hansen于 bpo-37376

pydoc

文档字符串现在不仅为类、函数、方法等显示,而且为任何有自己的对象显示 __doc__ 属性。(塞尔希斯托查卡在 bpo-40257

随机的

添加了一个新的 random.Random.randbytes 方法:生成随机字节。(Victor Stner在 bpo-40286 。)

信号

公开了特定于Linux的 signal.pidfd_send_signal() 用于使用文件描述符而不是pid向进程发送信号。 (bpo-38712

SMTPLIB

SMTPSMTP_SSL 现在提出一个 ValueError 如果其构造函数的给定超时为零以阻止创建非阻塞套接字。(董熙娜供稿 bpo-39259

LMTP 构造函数现在有一个可选的 超时 参数。(董熙娜供稿 bpo-39329

Socket

这个 socket 模块现在导出 CAN_RAW_JOIN_FILTERS Linux 4.1及更高版本上的常量。(由斯特凡·塔施纳和扎克里·斯皮茨在 bpo-25780

插座模块现在支持 CAN_J1939 在支持它的平台上的协议。(作者:Karl Ding in) bpo-40291

套接字模块现在具有 socket.send_fds()socket.recv.fds() 方法。(由Joannah Nanjekye,Shinya Okano和Victor Stner在 bpo-28724 。)

时间

在AIX上, thread_time() 现在使用 thread_cputime() 它有纳秒的分辨率,而不是 clock_gettime(CLOCK_THREAD_CPUTIME_ID) 分辨率为10 ms(由Batuhan Taskaya在年提供 bpo-40192

系统

添加了一个新的 sys.platlibdir 属性:特定于平台的库目录的名称。用于构建标准库路径和安装扩展模块路径。它等于 "lib" 在大多数平台上。在Fedora和SuSE上,它等于 "lib64" 在64位平台上。(由Jan MatěJek,Matěj Cepl,Charalampos Stratakis和Victor Stner在 bpo-1294959 。)

以前, sys.stderr 非交互时被块缓冲。现在 stderr 默认为总是行缓冲。(作者:Jendrik Seipp in) bpo-13601

tracemalloc

补充 tracemalloc.reset_peak() 将跟踪内存块的峰值大小设置为当前大小,测量特定代码段的峰值。(胡恩威尔逊在 bpo-40630

typing

PEP 593 介绍了 typing.Annotated 使用上下文特定的元数据和新的 include_extras 参数到 typing.get_type_hints() 在运行时访问元数据。(由Till Varoquaux和Konstantin Kashin提供。)

unicodedata

Unicode数据库已更新到版本13.0.0。 (bpo-39926

静脉注射

提供的激活脚本 venv 现在,通过始终使用 __VENV_PROMPT__ . 以前有些脚本是无条件使用的 __VENV_PROMPT__ ,只有在碰巧设置了(这是默认情况)并且使用了 __VENV_NAME__ 相反。(作者:Brett Cannon bpo-37663

XML

属性中的空白字符现在在序列化时保留 xml.etree.ElementTree 到XML文件。下线不再标准化为“n”。这是关于如何解释XML规范第2.11节的讨论的结果(由 bpo-39011

优化

  • 优化了习语,以便在理解中分配一个临时变量。现在 for y in [expr] 理解和简单的作业一样快 y = expr . 例如:

    总和= [s代表[0]中的s] 对于x in数据对于s in [s+x] ]

    不像 := 运算符此习惯用法不会将变量泄漏到外部作用域。

    (Serhiy Storchaka在 bpo-32856

  • 优化了多线程应用程序中的信号处理。如果与主线程不同的线程收到信号,则字节码求值循环不再在每个字节码指令处中断,以检查无法处理的挂起信号。只有主解释器的主线程可以处理信号。

    以前,字节码求值循环在每条指令处中断,直到主线程处理信号为止。(作者:Victor Stinner bpo-40010

  • 优化了 subprocess FreeBSD上的模块使用 closefrom() 。(由Ed Maste,Conrad Meyer,Kyle Evans,Kubilay Kocak和Victor Stner在 bpo-38061 。)

  • PyLong_FromDouble() 现在,对于符合以下条件的值,速度最高可提高1.87倍 long 。(Sergey Fedoseev在 bpo-37986 。)

  • 一些Python内置函数 (rangetuplesetfrozensetlistdict )现在使用 PEP 590 向量调用协议。(作者:董希娜、马克·香农、杰伦·德迈尔和彼得维克托林 bpo-37207

  • 已优化 difference_update() 用于另一个集合比基本集合大得多的情况。(由Evgeny Kapun建议,代码由Michele Orrüin贡献 bpo-8425 。)

  • Python的小对象分配器 (obmalloc.c )现在允许(不超过)一个空竞技场保持可用状态以立即重复使用,而无需将其返回到操作系统。这可以防止简单循环中的抖动,在这种循环中,可以在每次迭代中重新创建和销毁竞技场。(Tim Peters在 bpo-37257 。)

  • floor division 的浮点操作现在有了更好的性能。同时也传达了这样的信息: ZeroDivisionError 将更新此操作的。(由纳东熙在 bpo-39434 。)

  • 现在,使用UTF-8和ASCII编解码器解码ASCII短字符串的速度提高了约15%。(稻田直木在 bpo-37348 。)

以下是从Python3.4到Python3.9的性能改进摘要:

Python version                       3.4     3.5     3.6     3.7     3.8    3.9
--------------                       ---     ---     ---     ---     ---    ---

Variable and attribute read access:
    read_local                       7.1     7.1     5.4     5.1     3.9    3.9
    read_nonlocal                    7.1     8.1     5.8     5.4     4.4    4.5
    read_global                     15.5    19.0    14.3    13.6     7.6    7.8
    read_builtin                    21.1    21.6    18.5    19.0     7.5    7.8
    read_classvar_from_class        25.6    26.5    20.7    19.5    18.4   17.9
    read_classvar_from_instance     22.8    23.5    18.8    17.1    16.4   16.9
    read_instancevar                32.4    33.1    28.0    26.3    25.4   25.3
    read_instancevar_slots          27.8    31.3    20.8    20.8    20.2   20.5
    read_namedtuple                 73.8    57.5    45.0    46.8    18.4   18.7
    read_boundmethod                37.6    37.9    29.6    26.9    27.7   41.1

Variable and attribute write access:
    write_local                      8.7     9.3     5.5     5.3     4.3    4.3
    write_nonlocal                  10.5    11.1     5.6     5.5     4.7    4.8
    write_global                    19.7    21.2    18.0    18.0    15.8   16.7
    write_classvar                  92.9    96.0   104.6   102.1    39.2   39.8
    write_instancevar               44.6    45.8    40.0    38.9    35.5   37.4
    write_instancevar_slots         35.6    36.1    27.3    26.6    25.7   25.8

Data structure read access:
    read_list                       24.2    24.5    20.8    20.8    19.0   19.5
    read_deque                      24.7    25.5    20.2    20.6    19.8   20.2
    read_dict                       24.3    25.7    22.3    23.0    21.0   22.4
    read_strdict                    22.6    24.3    19.5    21.2    18.9   21.5

Data structure write access:
    write_list                      27.1    28.5    22.5    21.6    20.0   20.0
    write_deque                     28.7    30.1    22.7    21.8    23.5   21.7
    write_dict                      31.4    33.3    29.3    29.2    24.7   25.4
    write_strdict                   28.4    29.9    27.5    25.2    23.1   24.5

Stack (or queue) operations:
    list_append_pop                 93.4   112.7    75.4    74.2    50.8   50.6
    deque_append_pop                43.5    57.0    49.4    49.2    42.5   44.2
    deque_append_popleft            43.7    57.3    49.7    49.7    42.8   46.4

Timing loop:
    loop_overhead                    0.5     0.6     0.4     0.3     0.3    0.3

这些结果是从变量访问基准脚本生成的,位于: Tools/scripts/var_access_benchmark.py . 基准脚本以纳秒为单位显示计时。基准是在 Intel® Core™ i7-4960HQ processor 运行在 python.org .

已弃用

  • distutils bdist_msi 命令现在已弃用,请使用 bdist_wheel (车轮套件)代替。(胡戈·范·凯梅纳德供稿 bpo-39586

  • 目前 math.factorial() 接受 float 具有非负整数值的实例(如 5.0 )它提高了 ValueError 对于非整数和负浮点数。现在已弃用。在未来的Python版本中,它将引发 TypeError 所有浮球。(Serhiy Storchaka在 bpo-37315

  • 这个 parsersymbol 模块已弃用,并将在将来的Python版本中删除。对于大多数用例,用户可以使用 ast 模块。

  • 公共C API函数 PyParser_SimpleParseStringFlags()PyParser_SimpleParseStringFlagsFilename()PyParser_SimpleParseFileFlags()PyNode_Compile() 在python3.10中将与旧的解析器一起删除。

  • 使用 NotImplemented 在布尔上下文中已被弃用,因为它几乎完全是不正确的富比较器实现的结果。它将成为 TypeError 在未来的Python版本中。(作者:Josh Rosenberg bpo-35712

  • 这个 random 模块当前接受任何哈希类型作为可能的种子值。不幸的是,其中一些类型不能保证具有确定的散列值。在Python3.9之后,模块将把它的种子限制为 Noneintfloatstrbytesbytearray .

  • 打开 GzipFile 不指定 mode 参数已弃用。在将来的Python版本中,默认情况下,它将始终打开以供阅读。指定 mode 为写作而打开它并使警告静音的论点。(塞尔希斯托查卡在 bpo-28286

  • 贬低 split() 方法 _tkinter.TkappType 赞成 splitlist() 具有更一致性和可预测性的方法。(塞尔希斯托查卡在 bpo-38371

  • 协程对象的显式传递 asyncio.wait() 已弃用,并将在版本3.11中删除。(Yury Selivanov和Kyle Stanley in供稿) bpo-34790

  • binhex4和hexbin4标准现在已被弃用。这个 binhex 模块及以下 binascii 现在不推荐使用函数:

    (由Victor Stinner在 bpo-39353

  • ast 班级 sliceIndexExtSlice 被认为已弃用,将在未来的Python版本中删除。 value 本身应该使用,而不是 Index(value)Tuple(slices, Load()) 应该用来代替 ExtSlice(slices) 。(Serhiy Storchaka在 bpo-34822 。)

  • astSuiteParamAugLoadAugStore 被视为已弃用,并将在将来的Python版本中删除。它们不是由解析器生成的,也不是由Python 3中的代码生成器接受的。(作者:巴图汉·塔卡亚 bpo-39639bpo-39969 和Serhiy Storchaka在 bpo-39988

  • 这个 PyEval_InitThreads()PyEval_ThreadsInitialized() 函数现在已弃用,并将在Python3.11中删除。打电话 PyEval_InitThreads() 现在什么都不做。这个 GIL 由初始化 Py_Initialize() 从Python3.7开始。(作者:Victor Stinner bpo-39877

  • 经过 None 作为 shlex.split() 函数已被弃用。(Zackery Spytz在 bpo-33262

  • smtpd.MailmanProxy() 现在已弃用,因为如果没有外部模块,它将无法使用, mailman 。(Samuel Colvin在 bpo-35800 。)

  • 这个 lib2to3 模块现在发出 PendingDeprecationWarning . Python3.9切换到PEG解析器(请参见 PEP 617 ),Python 3.10可能包含lib2to3的LL(1)解析器无法解析的新语言语法。这个 lib2to3 模块可能会在将来的Python版本中从标准库中删除。考虑第三方替代方案,如 LibCSTparso . (卡尔·迈耶在 bpo-40360

  • 这个 随机的 参数 random.shuffle() 已弃用。(作者雷蒙德·赫廷格 bpo-40465

远离的

  • 错误的版本 unittest.mock.__version__ 已删除。

  • nntplib.NNTPxpath()xgtitle() 方法已被删除。自Python3.3以来,这些方法已被弃用。通常,NNTP服务器管理员不支持或不启用这些扩展。为了 xgtitle() 请使用 nntplib.NNTP.descriptions()nntplib.NNTP.description() 相反。(董熙娜供稿 bpo-39366

  • array.arraytostring()fromstring() 方法已被删除。他们是 tobytes()frombytes() ,自Python3.2以来已弃用。(作者:Victor Stinner in) bpo-38916

  • 无证件者 sys.callstats() 函数已被删除。自python 3.7以来,它一直被弃用并返回 None . 它需要一个特殊的构建选项 CALL_PROFILE 它已经在python 3.7中被删除。(由Victor Stinner在 bpo-37414

  • 这个 sys.getcheckinterval()sys.setcheckinterval() 功能已删除。它们自python 3.2以来就被弃用了。使用 sys.getswitchinterval()sys.setswitchinterval() 相反。(由Victor Stinner在 bpo-37392

  • C函数 PyImport_Cleanup() 已删除。记录为:“清空模块表。仅供内部使用。 bpo-36710

  • _dummy_threaddummy_threading 模块已被移除。自需要线程支持的python 3.7以来,这些模块已被弃用。(由Victor Stinner在 bpo-37312

  • aifc.openfp() 别名 aifc.open()sunau.openfp() 别名 sunau.open()wave.openfp() 别名 wave.open() 已被删除。自Python3.7以来,它们就被弃用了。(由Victor Stinner在 bpo-37320

  • 这个 isAlive() 方法 threading.Thread 已删除。自Python 3.8以来,它就被弃用了。使用 is_alive() 相反。(董熙娜供稿 bpo-37804

  • 方法 getchildren()getiterator() 阶级 ElementTreeElementElementTree 模块已被移除。它们在Python3.2中被弃用。使用 iter(x)list(x) 而不是 x.getchildren()x.iter()list(x.iter()) 而不是 x.getiterator() . (Serhiy Storchaka在 bpo-36543

  • 老年人 plistlib API已经被删除,自Python 3.4以来就一直被弃用。使用 load()loads()dump()dumps() 功能。另外 use_builtin_types 参数已删除,标准 bytes 总是使用对象。(作者:Jon Janzen in bpo-36409

  • C函数 PyGen_NeedsFinalizing 已删除。在 PEP 442 . Joannah Nanjekye的补丁。(作者:Joannah Nanjekye in) bpo-15088

  • base64.encodestring()base64.decodestring() ,自Python 3.1以来已弃用的别名已被删除:使用 base64.encodebytes()base64.decodebytes() 相反。(由Victor Stinner在 bpo-39351

  • fractions.gcd() 函数已被删除,自Python3.5以来已被弃用 (bpo-22486 ):使用 math.gcd() 相反。(由Victor Stinner在 bpo-39350

  • 这个 缓冲 参数 bz2.BZ2File 已删除。自Python 3.0以来,它被忽略,并使用它发出 DeprecationWarning . 传递一个open file对象来控制文件的打开方式。(作者:Victor Stinner in) bpo-39357

  • 这个 编码 参数 json.loads() 已删除。从Python3.1开始,它被弃用并被忽略;使用它已经发出 DeprecationWarning 从Python3.8开始。(作者稻田直树 bpo-39377

  • with (await asyncio.lock):with (yield from asyncio.lock): 语句不再受支持,请使用 async with lock 相反。同样适用于 asyncio.Conditionasyncio.Semaphore . (由Andrew Svetlov在 bpo-34793

  • 这个 sys.getcounts() 函数 -X showalloccount 命令行选项和 show_alloc_count C结构域 PyConfig 已被移除。他们需要通过定义 COUNT_ALLOCS 宏。(作者:Victor Stinner in) bpo-39489

  • 这个 _field_types 的属性 typing.NamedTuple 类已被移除。自Python 3.8以来,它就被弃用了。使用 __annotations__ 而是属性。(塞尔希斯托查卡在 bpo-40182

  • 这个 symtable.SymbolTable.has_exec() 方法已被删除。从2006年开始就被弃用了,只回来了 False 当它被召唤的时候。(作者:巴图汉·塔卡亚 bpo-40208

  • 这个 asyncio.Task.current_task()asyncio.Task.all_tasks() 已被删除。它们在python3.7之后就被弃用了,您可以使用 asyncio.current_task()asyncio.all_tasks() 相反。(Rémi Lapeyre在 bpo-40967

  • 这个 unescape() 方法在 html.parser.HTMLParser 类已被删除(自Python3.4以来已被弃用)。 html.unescape() 应用于将字符引用转换为相应的unicode字符。

移植到python 3.9

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

python api中的更改

  • __import__()importlib.util.resolve_name() 现在提高 ImportError 在它之前提出的地方 ValueError . 捕捉特定异常类型并同时支持Python3.9和更早版本的调用方需要使用 except (ImportError, ValueError): .

  • 这个 venv 激活脚本不再是特殊情况 __VENV_PROMPT__ 设置为 "" .

  • 这个 select.epoll.unregister() 方法不再忽略 EBADF 错误。(作者:Victor Stinner in) bpo-39239

  • 这个 压缩能级 参数 bz2.BZ2File 只成为关键字,因为 缓冲 参数已被删除。(作者:Victor Stinner in) bpo-39357

  • 订阅的简化AST。简单索引将由其值表示,扩展切片将表示为元组。 Index(value) 将返回 value 本身, ExtSlice(slices) 将返回 Tuple(slices, Load()) . (Serhiy Storchaka在 bpo-34822

  • 这个 importlib 模块现在忽略 PYTHONCASEOK-E-I 正在使用命令行选项。

  • 这个 编码 参数已添加到类中 ftplib.FTPftplib.FTP_TLS 作为仅限关键字的参数,默认编码从拉丁语-1更改为UTF-8,如下所示 RFC 2640 .

  • asyncio.loop.shutdown_default_executor() 已添加到 AbstractEventLoop ,这意味着从它继承的可选事件循环应该定义此方法。(作者:Kyle Stanley in) bpo-34037

  • 中未来标志的常量值 __future__ 更新模块以防止与编译器标志冲突。以前 PyCF_ALLOW_TOP_LEVEL_AWAIT 与…发生冲突 CO_FUTURE_DIVISION . (作者:巴图汉·塔卡亚 bpo-39562

  • array('u') 现在使用 wchar_t 作为C类型而不是 Py_UNICODE . 此更改不会影响其行为,因为 Py_UNICODE 是的别名 wchar_t 从Python 3.3开始。(作者稻田直树 bpo-34538

  • 这个 logging.getLogger() API现在在传递名称时返回根记录器 'root' ,而之前它返回一个名为的非根记录器 'root' 。这可能会影响用户代码显式需要名为的非根记录器的情况 'root' ,或使用以下命令实例化记录器 logging.getLogger(__name__) 在某个顶级模块中称为 'root.py' 。(Vinay Sajip在 bpo-37742 。)

  • 分部处理 PurePath 现在返回 NotImplemented 而不是引发 TypeError 当传递的对象不是 strPurePath 。这允许创建不继承上述类型的兼容类。(Roger Aiudi在 bpo-34775 )。

C API中的更改

  • 堆分配类型的实例(例如使用 PyType_FromSpec() 以及类似的api)保存对Python 3.8之后的type对象的引用。如Python3.8的“C API中的更改”所示,对于绝大多数情况,除了具有自定义 tp_traverse 功能,确保所有自定义 tp_traverse 堆分配类型的函数访问对象的类型。

    例子:

    int
    foo_traverse(foo_struct *self, visitproc visit, void *arg) {
    // Rest of the traverse function
    #if PY_VERSION_HEX >= 0x03090000
        // This was not needed before Python 3.9 (Python issue 35810 and 40217)
        Py_VISIT(Py_TYPE(self));
    #endif
    }
    

    如果你的遍历函数委托给 tp_traverse 它的基类(或其他类型),确保 Py_TYPE(self) 只访问过一次。注意,只有堆类型才需要访问 tp_traverse .

    例如,如果 tp_traverse 功能包括:

    base->tp_traverse(self, visit, arg)
    

    然后添加:

    #if PY_VERSION_HEX >= 0x03090000
        // This was not needed before Python 3.9 (Python issue 35810 and 40217)
        if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) {
            // a heap type's tp_traverse already visited Py_TYPE(self)
        } else {
            Py_VISIT(Py_TYPE(self));
        }
    #else
    

    (见 bpo-35810bpo-40217 更多信息。)

  • 功能 PyEval_CallObjectPyEval_CallFunctionPyEval_CallMethodPyEval_CallObjectWithKeywords 都已弃用。使用 PyObject_Call() 和它的变种取而代之。(有关更多详细信息,请参阅 bpo-29548 。)

cpython字节码更改

  • 这个 LOAD_ASSERTION_ERROR 已添加操作码以处理 assert 陈述。以前,如果 AssertionError 正在跟踪异常。(Zackery Spytz在 bpo-34880

  • 这个 COMPARE_OP 操作码被分成四条不同的指令:

    • COMPARE_OP 进行丰富的比较

    • IS_OP 用于“is”和“is not”测试

    • CONTAINS_OP 用于“In”和“Not In”测试

    • JUMP_IF_NOT_EXC_MATCH 用于检查“try-Except”语句中的异常。

    (Mark Shannon在 bpo-39156 。)

建立变化

  • 已添加 --with-platlibdir 选项添加到 configure 脚本:特定于平台的库目录的名称,存储在新的 sys.platlibdir 属性。看见 sys.platlibdir 属性获取更多信息。(由Jan MatěJek,Matěj Cepl,Charalampos Stratakis和Victor Stner在 bpo-1294959 。)

  • 这个 COUNT_ALLOCS 已删除特殊生成宏。(作者:Victor Stinner in) bpo-39489

  • 在非Windows平台上 setenv()unsetenv() 现在需要函数来构建Python。(作者:Victor Stinner in) bpo-39395

  • 在非Windows平台上,创建 bdist_wininst 安装程序现在正式不受支持。(请参阅 bpo-10945 了解更多详细信息。)

  • 从源代码在MacOS上构建Python时, _tkinter 现在可以与非系统Tcl和Tk框架链接(如果它们安装在 /Library/Frameworks ,就像在旧版本的MacOS上一样。如果MacOS SDK是显式配置的,请使用 --enable-universalsdk=-isysroot ,则只搜索SDK本身。默认行为仍然可以用来覆盖 --with-tcltk-includes--with-tcltk-libs 。(Ned Deely在 bpo-34956 。)

  • Python现在可以为Windows10ARM64构建。(Steve Dower在 bpo-33125 。)

  • 在以下情况下,某些单独的测试现在会被跳过 --pgo 是使用的。有问题的测试显着增加了PGO任务时间,并且可能无助于改进最终可执行文件的优化。这样可以将任务速度提高约15倍。运行完整的单元测试套件很慢。此更改可能会导致优化程度稍低的构建,因为不会执行那么多的代码分支。如果您愿意等待速度慢得多的构建,可以使用以下命令恢复旧的行为 ./configure [..] PROFILE_TASK="-m test --pgo-extended" 。我们不能保证哪个PGO任务集可以产生更快的构建。关心的用户应该运行他们自己的相关基准测试,因为结果可能取决于环境、工作负载和编译器工具链。(请参阅 bpo-36044bpo-37707 了解更多详细信息。)

C API更改

新特点

移植到python 3.9

远离的

  • 已排除 PyFPE_START_PROTECT()PyFPE_END_PROTECT() 宏: pyfpe.h 来自有限的C API。(Victor Stner在 bpo-38835 。)

  • 这个 tp_printPyTypeObject 已删除。它用于将对象打印到Python2.7及以前版本的文件中。自Python 3.0以来,它一直被忽略和未使用。(Jeroen Demeyer在 bpo-36974

  • 有限C API的更改(如果 Py_LIMITED_API 宏已定义):

    • 从受限的C API中排除了以下函数:

      • PyThreadState_DeleteCurrent() (作者:Joannah Nanjekye in) bpo-37878

      • _Py_CheckRecursionLimit

      • _Py_NewReference()

      • _Py_ForgetReference()

      • _PyTraceMalloc_NewReference()

      • _Py_GetRefTotal()

      • 在有限的C API中从未工作过的垃圾桶机制。

      • PyTrash_UNWIND_LEVEL

      • Py_TRASHCAN_BEGIN_CONDITION

      • Py_TRASHCAN_BEGIN

      • Py_TRASHCAN_END

      • Py_TRASHCAN_SAFE_BEGIN

      • Py_TRASHCAN_SAFE_END

    • 已将以下函数和定义移至内部C API:

      • _PyDebug_PrintTotalRefs()

      • _Py_PrintReferences()

      • _Py_PrintReferenceAddresses()

      • _Py_tracemalloc_config

      • _Py_AddToAllObjects() (特定于 Py_TRACE_REFS 建造)

    (由Victor Stinner在 bpo-38644bpo-39542

  • 已删除 _PyRuntime.getframe 挂钩并移除 _PyThreadState_GetFrame 宏,该宏是的别名 _PyRuntime.getframe 。它们仅由内部C API公开。还删除了 PyThreadFrameGetter 键入。(Victor Stner在 bpo-39946 。)

  • 从C API中删除了以下函数。打电话 PyGC_Collect() 显式清除所有空闲列表。(Inada Naoki和Victor Stner在 bpo-37340bpo-38896bpo-40428 。)

    • PyAsyncGen_ClearFreeLists()

    • PyContext_ClearFreeList()

    • PyDict_ClearFreeList()

    • PyFloat_ClearFreeList()

    • PyFrame_ClearFreeList()

    • PyList_ClearFreeList()

    • PyMethod_ClearFreeList()PyCFunction_ClearFreeList() :已删除绑定方法对象的可用列表。

    • PySet_ClearFreeList() :在Python3.4中已删除“自由设置”列表。

    • PyTuple_ClearFreeList()

    • PyUnicode_ClearFreeList() :在Python3.3中已删除Unicode可用列表。

  • 已删除 _PyUnicode_ClearStaticStrings() 功能。(Victor Stner在 bpo-39465 。)

  • 已删除 Py_UNICODE_MATCH 。它已被以下机构弃用 PEP 393 ,并且从Python3.3开始就被破坏了。这个 PyUnicode_Tailmatch() 可以改为使用函数。(稻田直木在 bpo-36346 。)

  • 已清除已定义但未实现的接口的头文件。要删除的公共API符号包括: _PyBytes_InsertThousandsGroupingLocale_PyBytes_InsertThousandsGrouping_Py_InitializeFromArgs_Py_InitializeFromWideArgs_PyFloat_Repr_PyFloat_Digits_PyFloat_DigitsInitPyFrame_ExtendStack_PyAIterWrapper_TypePyNullImporter_TypePyCmpWrapper_TypePySortWrapper_TypePyNoArgsFunction 。(Pablo Galindo Salgado在 bpo-39372 。)

Python 3.9.1中的显著变化

typing

的行为 typing.Literal 已更改为符合 PEP 586 并与PEP中指定的静电类型检查器的行为相匹配。

  1. Literal 现在对参数执行重复数据消除。

  2. 两国之间的平等比较 Literal 对象现在与顺序无关。

  3. Literal 比较现在尊重类型。例如, Literal[0] == Literal[False] 之前评估为 True 。现在是时候了 False 。为了支持此更改,内部使用的类型缓存现在支持区分类型。

  4. Literal 对象现在将引发 TypeError 如果它们的一个参数不是 immutable 。请注意,声明 Literal 使用可变参数不会引发错误::

    >>> from typing import Literal
    >>> Literal[{0}]
    >>> Literal[{0}] == Literal[{False}]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'set'
    

(Yurii Karabas在 bpo-42345 。)

MacOS 11.0(Big Sur)和Apple Silicon Mac支持

从3.9.1开始,Python现在完全支持在MacOS 11.0(Big Sur)和Apple Silicon Mac(基于 ARM64 架构)。一种新的通用版本变体, universal2 ,现在可以本机支持这两个 ARM64Intel 64 在一组可执行文件中。二进制文件现在还可以构建在当前版本的MacOS上,以部署在一系列较旧的MacOS版本(测试到10.9)上,同时根据运行时使用的操作系统版本有条件地提供一些较新的操作系统功能和选项(“弱链接”)。

(Ronald Oussoren和Lawrence D‘Anna在 bpo-41100 。)

Python 3.9.2中的显著变化

collections.abc

collections.abc.Callable 泛型现在展平类型参数,类似于 typing.Callable 目前是这样的。这意味着 collections.abc.Callable[[int, str], str] 将会有 __args__(int, str, str) ;以前这是 ([int, str], str) 。要允许此更改, types.GenericAlias 现在可以子类化,并且在对 collections.abc.Callable 键入。通过以下方式访问参数的代码 typing.get_args()__args__ 需要考虑到这一变化。一个 DeprecationWarning 对于无效的参数化形式,可能会发出 collections.abc.Callable 它可能已经在Python 3.9.1中静默通过。这 DeprecationWarning 将会成为一个 TypeError 在Python3.10中。(金肯在 bpo-42195 。)