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 616 ,删除前缀和后缀的字符串方法。
标准库中的新功能:
PEP 593 灵活的功能和可变的注释;
os.pidfd_open()
添加了允许过程管理而无需竞争和信号的功能。
解释器改进:
PEP 573 从C扩展类型的方法快速访问模块状态;
PEP 617 ,CPython现在使用了新的基于PEG的解析器;
大量Python内置(range、tuple、set、frozenset、list、dict)现在使用 PEP 590 向量呼叫;
垃圾收集不对复活的对象进行挡路;
一些Python模块 (
_abc
,audioop
,_bz2
,_codecs
,_contextvars
,_crypt
,_functools
,_json
,_locale
,math
,operator
,resource
,time
,_weakref
)现在使用PEP 489定义的多阶段初始化;一些标准库模块 (
audioop
,ast
,grp
,_hashlib
,pwd
,_posixsubprocess
,random
,select
,struct
,termios
,zlib
)现在使用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
要查看的命令行选项 DeprecationWarning
和 PendingDeprecationWarning
,甚至与 -W
error
把它们当作错误来对待。 Warnings Filter 可用于忽略来自第三方代码的警告。
Python3.9是提供Python2向后兼容层的最后一个版本,以便让Python项目维护人员有更多时间组织删除Python2支持并添加对Python3.9的支持。
别名到 Abstract Base Classes 在 collections
模块,比如 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'}
删除前缀和后缀的新字符串方法¶
str.removeprefix(prefix)
和 str.removesuffix(suffix)
已添加以轻松从字符串中删除不需要的前缀或后缀。对应的 bytes
, bytearray
和 collections.UserString
还添加了方法。见 PEP 616 完整的描述。(丹尼斯·斯威尼供稿 bpo-39939 )
在标准集合中键入提示泛型¶
在类型注释中,现在可以使用内置的集合类型,如 list
和 dict
作为泛型类型而不是导入相应的大写类型(例如。 List
或 Dict
)从 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)
. 也有类似的变化bytes
和bytearray
物体。(塞尔希斯托查卡在 bpo-28029 )任何有效的表达式现在都可以用作 decorator . 以前,语法限制要严格得多。见 PEP 614 详细情况。(布兰特·布彻于 bpo-39702 )
改进了对
typing
模块。现在为所有特殊形式和特殊的通用别名(如Union
和List
)使用help()
一般别名如下List[int]
将显示对应混凝土类型的帮助 (list
在这种情况下)。(塞尔希斯托查卡在 bpo-40257 )并行运行
aclose()
/asend()
/athrow()
现在是被禁止的,而且ag_running
现在反映异步生成器的实际运行状态。(Yury Selivanov在 bpo-30773 。)调用
__iter__
方法不再由TypeError
在in
运算符和函数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 )
已从中删除守护进程线程 ThreadPoolExecutor
和 ProcessPoolExecutor
. 这提高了与子解释器的兼容性和它们的关闭过程的可预测性。(作者: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.date
和 isocalendar()
属于 datetime.datetime
方法现在返回 namedtuple()
而不是 tuple
. (董熙娜供稿 bpo-24416 )
迪斯妥尔¶
这个 upload 命令现在创建SHA2-256和Blake2b-256哈希摘要。它在阻止MD5摘要的平台上跳过MD5。(克里斯汀·海姆斯在 bpo-40698 )
文件锁¶
添加的常量 F_OFD_GETLK
, F_OFD_SETLK
和 F_OFD_SETLKW
. (董熙娜供稿 bpo-38602 )
FTPLIB¶
FTP
和 FTP_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_HINTS
, 418 IM_A_TEAPOT
和 425 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¶
IMAP4
和 IMAP4_SSL
现在有一个可选的 超时 其构造函数的参数。而且 open()
方法现在有一个可选的 超时 参数与此更改。的重写方法 IMAP4_SSL
和 IMAP4_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-36350 和 bpo-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-39479 和 bpo-39648 。)
已添加 math.nextafter()
:返回后的下一个浮点值 x 朝向 y 。(Victor Stner在 bpo-39288 。)
已添加 math.ulp()
:返回浮点数的最低有效位的值。(Victor Stner在 bpo-39310 。)
多重处理¶
这个 multiprocessing.SimpleQueue
班有新的 close()
方法显式关闭队列。(作者:Victor Stinner bpo-30966 )
NNTPLIB¶
NNTP
和 NNTP_SSL
现在提出一个 ValueError
如果其构造函数的给定超时为零以阻止创建非阻塞套接字。(董熙娜供稿 bpo-39259 )
操作系统¶
补充 CLD_KILLED
和 CLD_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¶
POP3
和 POP3_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¶
SMTP
和 SMTP_SSL
现在提出一个 ValueError
如果其构造函数的给定超时为零以阻止创建非阻塞套接字。(董熙娜供稿 bpo-39259 )
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内置函数 (
range
,tuple
,set
,frozenset
,list
,dict
)现在使用 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 )这个
parser
和symbol
模块已弃用,并将在将来的Python版本中删除。对于大多数用例,用户可以使用ast
模块。公共C API函数
PyParser_SimpleParseStringFlags()
,PyParser_SimpleParseStringFlagsFilename()
,PyParser_SimpleParseFileFlags()
和PyNode_Compile()
在python3.10中将与旧的解析器一起删除。使用
NotImplemented
在布尔上下文中已被弃用,因为它几乎完全是不正确的富比较器实现的结果。它将成为TypeError
在未来的Python版本中。(作者:Josh Rosenberg bpo-35712 )这个
random
模块当前接受任何哈希类型作为可能的种子值。不幸的是,其中一些类型不能保证具有确定的散列值。在Python3.9之后,模块将把它的种子限制为None
,int
,float
,str
,bytes
和bytearray
.打开
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
班级slice
,Index
和ExtSlice
被认为已弃用,将在未来的Python版本中删除。value
本身应该使用,而不是Index(value)
。Tuple(slices, Load())
应该用来代替ExtSlice(slices)
。(Serhiy Storchaka在 bpo-34822 。)ast
班Suite
,Param
,AugLoad
和AugStore
被视为已弃用,并将在将来的Python版本中删除。它们不是由解析器生成的,也不是由Python 3中的代码生成器接受的。(作者:巴图汉·塔卡亚 bpo-39639 和 bpo-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版本中从标准库中删除。考虑第三方替代方案,如 LibCST 或 parso . (卡尔·迈耶在 bpo-40360 )这个 随机的 参数
random.shuffle()
已弃用。(作者雷蒙德·赫廷格 bpo-40465 )
远离的¶
错误的版本
unittest.mock.__version__
已删除。nntplib.NNTP
:xpath()
和xgtitle()
方法已被删除。自Python3.3以来,这些方法已被弃用。通常,NNTP服务器管理员不支持或不启用这些扩展。为了xgtitle()
请使用nntplib.NNTP.descriptions()
或nntplib.NNTP.description()
相反。(董熙娜供稿 bpo-39366 )array.array
:tostring()
和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_thread
和dummy_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()
阶级ElementTree
和Element
在ElementTree
模块已被移除。它们在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.Condition
和asyncio.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.FTP
和ftplib.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
当传递的对象不是str
或PurePath
。这允许创建不继承上述类型的兼容类。(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
功能
PyEval_CallObject
,PyEval_CallFunction
,PyEval_CallMethod
和PyEval_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-36044 和 bpo-37707 了解更多详细信息。)
C API更改¶
新特点¶
PEP 573 :已添加
PyType_FromModuleAndSpec()
将模块与类关联;PyType_GetModule()
和PyType_GetModuleState()
检索模块及其状态;以及PyCMethod
和METH_METHOD
若要允许方法访问在其中定义它的类,请执行以下操作。(Marcel Plch和Petr Viktorin在 bpo-38787 。)已添加
PyFrame_GetCode()
功能:获取帧码。已添加PyFrame_GetBack()
功能:获取下一个外框。(Victor Stner在 bpo-40421 。)已添加
PyFrame_GetLineNumber()
添加到有限的C API中。(Victor Stner在 bpo-40421 。)已添加
PyThreadState_GetInterpreter()
和PyInterpreterState_Get()
函数来获取解释器。已添加PyThreadState_GetFrame()
函数获取Python线程状态的当前帧。已添加PyThreadState_GetID()
功能:获取Python线程状态的唯一标识符。(Victor Stner在 bpo-39947 。)添加了一个新的公共
PyObject_CallNoArgs()
函数传递给C API,它调用一个不带任何参数的可调用Python对象。这是不带任何参数调用可调用Python对象的最有效方式。(Victor Stner在 bpo-37194 。)有限C API的更改(如果
Py_LIMITED_API
宏已定义):提供
Py_EnterRecursiveCall()
和Py_LeaveRecursiveCall()
作为有限API的常规函数。以前,有定义为宏的宏,但这些宏不是用有限的C API编译的,而C API无法访问PyThreadState.recursion_depth
字段(结构在有限的C API中是不透明的)。PyObject_INIT()
和PyObject_INIT_VAR()
变成常规的“不透明”函数来隐藏实现细节。
这个
PyModule_AddType()
函数用于帮助向模块添加类型。(董熙娜供稿 bpo-40024 )添加了功能
PyObject_GC_IsTracked()
和PyObject_GC_IsFinalized()
设置为公共API,以允许分别查询垃圾收集器当前是否正在跟踪Python对象或是否已经完成了Python对象。(Pablo Galindo Salgado在 bpo-40241 。)已添加
_PyObject_FunctionStr()
若要获取类似函数的对象的用户友好的字符串表示形式,请执行以下操作。(Jeroen Demeyer在 bpo-37645 。)已添加
PyObject_CallOneArg()
用于使用一个位置参数调用对象(Patch由Jeroen Demeyer在 bpo-37483 。)
移植到python 3.9¶
PyInterpreterState.eval_frame
(PEP 523) now requires a new mandatory tstate parameter (PyThreadState*
). (Contributed by Victor Stinner in bpo-38500.)扩展模块:
m_traverse
,m_clear
和m_free
功能PyModuleDef
如果模块状态已请求但尚未分配,则不再调用。这是在模块创建之后和执行之前的情况 (Py_mod_exec
功能)。更准确地说,如果m_size
大于0且模块状态(由返回PyModule_GetState()
是NULL
.无模块状态的扩展模块 (
m_size <= 0
)不受影响。如果
Py_AddPendingCall()
在子解释器中调用,函数现在被安排从子解释器调用,而不是从主解释器调用。每个子解释器现在都有自己的预定调用列表。(作者:Victor Stinner bpo-39984 )Windows注册表不再用于初始化
sys.path
当-E
使用选项(如果PyConfig.use_environment
设置为0
). 在Windows上嵌入Python时,这一点非常重要。(Zackery Spytz在 bpo-8901 )全局变量
PyStructSequence_UnnamedField
现在是常量并引用常量字符串。(塞尔希斯托查卡在 bpo-38650 )这个
PyGC_Head
结构现在是不透明的。它只在内部C API中定义 (pycore_gc.h
)(由Victor Stinner在 bpo-40241 )这个
Py_UNICODE_COPY
,Py_UNICODE_FILL
,PyUnicode_WSTR_LENGTH
,PyUnicode_FromUnicode()
,PyUnicode_AsUnicode()
,_PyUnicode_AsUnicode
和PyUnicode_AsUnicodeAndSize()
在C中标记为已弃用。它们已被 PEP 393 从Python 3.3开始。(作者稻田直树 bpo-36346 )这个
Py_FatalError()
函数替换为自动记录当前函数名称的宏,除非Py_LIMITED_API
定义了宏。(Victor Stner在 bpo-39882 。)向量调用协议现在要求调用者只传递字符串作为关键字名称。(请参阅 bpo-37540 了解更多信息。)
现在隐藏了许多宏和函数的实现详细信息:
PyObject_IS_GC()
宏已转换为函数。这个
PyObject_NEW()
宏将成为PyObject_New()
宏,以及PyObject_NEW_VAR()
宏将成为PyObject_NewVar()
宏命令。他们不再直接访问PyTypeObject.tp_basicsize
会员。PyType_HasFeature()
现在总是打来电话PyType_GetFlags()
。以前,它直接访问PyTypeObject.tp_flags
当未使用受限的C API时,该成员。PyObject_GET_WEAKREFS_LISTPTR()
宏已转换为函数:该宏直接访问PyTypeObject.tp_weaklistoffset
会员。PyObject_CheckBuffer()
宏已转换为函数:该宏直接访问PyTypeObject.tp_as_buffer
会员。PyIndex_Check()
现在始终声明为不透明函数以隐藏实现详细信息:删除PyIndex_Check()
宏命令。宏直接访问PyTypeObject.tp_as_number
会员。
(请参阅 bpo-40170 了解更多详细信息。)
远离的¶
已排除
PyFPE_START_PROTECT()
和PyFPE_END_PROTECT()
宏:pyfpe.h
来自有限的C API。(Victor Stner在 bpo-38835 。)这个
tp_print
槽 PyTypeObject 已删除。它用于将对象打印到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
建造)
已删除
_PyRuntime.getframe
挂钩并移除_PyThreadState_GetFrame
宏,该宏是的别名_PyRuntime.getframe
。它们仅由内部C API公开。还删除了PyThreadFrameGetter
键入。(Victor Stner在 bpo-39946 。)从C API中删除了以下函数。打电话
PyGC_Collect()
显式清除所有空闲列表。(Inada Naoki和Victor Stner在 bpo-37340 , bpo-38896 和 bpo-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_DigitsInit
,PyFrame_ExtendStack
,_PyAIterWrapper_Type
,PyNullImporter_Type
,PyCmpWrapper_Type
,PySortWrapper_Type
,PyNoArgsFunction
。(Pablo Galindo Salgado在 bpo-39372 。)
Python 3.9.1中的显著变化¶
typing¶
的行为 typing.Literal
已更改为符合 PEP 586 并与PEP中指定的静电类型检查器的行为相匹配。
Literal
现在对参数执行重复数据消除。两国之间的平等比较
Literal
对象现在与顺序无关。Literal
比较现在尊重类型。例如,Literal[0] == Literal[False]
之前评估为True
。现在是时候了False
。为了支持此更改,内部使用的类型缓存现在支持区分类型。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
,现在可以本机支持这两个 ARM64
和 Intel 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 。)