首先,Python 3.9 增加了一个新的语法特性:walrus operator(:=)。它允许开发人员在表达式中声明和初始化变量。这使得代码更简洁、易读、易维护。
此外,Python 3.9 还增加了对 Unicode 13 的支持。Unicode 13 添加了 8,018 个字符,包括新的表情符号、国旗、字体样式等。这将有助于开发人员在应用中使用不同的字符集来表达不同的意思。
此外,Python 3.9 还增加了对 type annotations 的支持。Type annotations 允许开发人员在代码中声明函数参数和返回值的数据类型,以帮助 IDE 和工具生成代码补全、静态分析以及测试代码覆盖度信息。
此外,Python 3.9 还对标准库进行了大量优化和修复:asyncio 改进了性能、ssl 添加了 TLS 1.3 的实验性实现、os 添加了文件 system call 等等。所有这些都将有助于 Python 应用的性能优化和安全性保障。
回溯中增强的错误位置
打印回溯时,解释器现在将指向导致错误的确切表达式,而不仅仅是行。例如:
Traceback (most recent call last):
File "distance.py", line 11, in <module>
print(manhattan_distance(p1, p2))
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "distance.py", line 6, in manhattan_distance
return abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
^^^^^^^^^
AttributeError: "NoneType" object has no attribute "x"
以前版本的解释器只会指向使对象不明确的那一行None。在处理深度嵌套的字典对象和多个函数调用时,这些增强的错误也很有帮助,
Traceback (most recent call last):
File "query.py", line 37, in <module>
magic_arithmetic("foo")
^^^^^^^^^^^^^^^^^^^^^^^
File "query.py", line 18, in magic_arithmetic
return add_counts(x) / 25
^^^^^^^^^^^^^
File "query.py", line 24, in add_counts
return 25 + query_user(user1) + query_user(user2)
^^^^^^^^^^^^^^^^^
File "query.py", line 32, in query_user
return 1 + query_count(db, response["a"]["b"]["c"]["user"], retry=True)
~~~~~~~~~~~~~~~~~~^^^^^
TypeError: "NoneType" object is not subscriptable
以及复杂的算术表达式:
Traceback (most recent call last):
File "calculation.py", line 54, in <module>
result = (x / y / z) * (a / b / c)
~~~~~~^~~
ZeroDivisionError: division by zero
此功能需要将列位置存储在代码对象中,这可能会导致编译 Python 文件的磁盘使用量或解释器内存使用量略有增加。为了避免存储额外信息和/或停用打印额外回溯信息, 命令行标志或-X no_debug_rangesPYTHONNODEBUGRANGES 可以使用环境变量。
代码对象的列信息
增强回溯功能使用的信息作为通用 API 提供,可用于将字节码指令与源代码相关联。可以使用以下方法检索此信息:
- Python中的codeobject.co_positions()方法。
- C-API 中的PyCode_Addr2Location()函数。
选项和环境变量 -X no_debug_rangesPYTHONNODEBUGRANGES可用于禁用此功能。
看PEP 657了解更多详情。(由 Pablo Galindo、Batuhan Taskaya 和 Ammar Askar 在bpo-43950中贡献。)
异常可以用字符串丰富__note__
该__note__字段已添加到BaseException. 默认情况None 下,但可以设置为添加到异常回溯的字符串。(由 Irit Katriel 在bpo-45607中贡献。)
其他语言变化
- 带星号的表达式可用于for 语句。(有关更多详细信息,请参阅 bpo-46725。)
- 现在允许在异步函数的推导中使用异步推导。外部理解隐含地变为异步的。(由 Serhiy Storchaka 在bpo-33346中贡献。)
- TypeError现在引发了A而不是AttributeErrorin contextlib.ExitStack.enter_context()和
contextlib.AsyncExitStack.enter_async_context()for 相应的不支持上下文管理器或异步上下文管理器 协议的对象。(由
Serhiy Storchaka 在bpo-44471中贡献。)
- 对于不支持上下文管理器或异步上下文管理器 协议的对象,现在提出了ATypeError而不是
AttributeErrorin with和语句。(由 Serhiy Storchaka 在bpo-12022中贡献。)async with
其他 CPython 实现更改
- 特殊方法complex.__complex__()和bytes.__bytes__()实现支持typing.SupportsComplex和typing.SupportsBytes协议。(由
Mark Dickinson 和 Dong-hee Na 在bpo-24234中贡献。)
- siphash13被添加为新的内部散列算法。它具有类似的安全属性,siphash24但对于长输入来说它稍快一些。str,bytes和其他一些类型现在使用它作为hash().PEP 552 基于散列的 pyc 文件现在siphash13也使用 . (由 Inada Naoki 在bpo-29410中贡献。)
- 当不带参数的语句重新引发活动异常时raise,附加到此异常的回溯现在始终为sys.exc_info()[1].__traceback__. 这意味着对当前except子句中的回溯所做的更改会反映在重新引发的异常中。(由
Irit Katriel 在bpo-45711中贡献。)
- 解释器状态表示的已处理异常(又名 exc_info 或 _PyErr_StackItem)现在只有该exc_value字段,exc_type并且exc_traceback 已被删除,因为它们的值可以从exc_value. (由 Irit Katriel 在bpo-45711中贡献。)
- 为 Windows 安装程序AppendPath添加了一个新的命令行选项。它的行为类似于PrependPath但附加了 install 和 scripts 目录,而不是前面。(由 Bastian Neuburger 在bpo-44934中贡献。)
新模块
改进的模块
fractions
- 支持PEP 515Fraction -从字符串初始化(由 Sergey B Kirpichev 在bpo-44258中贡献。)
- Fraction现在实现一个__int__方法,以便检查通过。(由 Mark Dickinson 在bpo-44547中贡献。)isinstance(some_fraction, typing.SupportsInt)
空闲和空闲库
- 对.pyi文件应用语法高亮。(由 Alex Waygood 和 Terry Jan Reedy 在bpo-45447中贡献。)
inspect
- 添加inspect.getmembers_static():返回所有成员,而不通过描述符协议触发动态查找。(由洪伟鹏在bpo-30533中贡献。)
- 添加inspect.ismethodwrapper()用于检查对象的类型是否为 MethodWrapperType. (由 Hakan
Çelik 在bpo-29418中贡献。)
math
- 加math.exp2():返回 2 的 x 次方。(由 Gideon Mitchell 在bpo-45917中贡献。)
- 添加math.cbrt():返回 x 的立方根。(由 Ajith Ramachandran 在bpo-44357中贡献。)
- math.pow()为了与 IEEE 754 规范保持一致,更改了两个极端情况的行为。操作 ,现在返回 。以前他们提出了. (由 Mark Dickinson 在bpo-44339中贡献。)math.pow(0.0, -math.inf)``math.pow(-0.0,
-math.inf)``inf ValueError
operator
- 添加了一个新功能operator.call,例如 . (由 Antony Lee 在bpo-44019中贡献。)operator.call(obj, *args, **kwargs) == obj(*args, **kwargs)
os
- 在 Windows 上,os.urandom()现在使用BCryptGenRandom(),而不是CryptGenRandom()已弃用。(由 Dong-hee Na 在bpo-44611中提供。)
socket
- 添加对 NetBSD 的 CAN Socket 支持。(由 Thomas Klausner 在bpo-30512中贡献。)
sqlite3
- 您现在可以通过传递None给 来 禁用授权者set_authorizer()。(由 Erlend E. Aasland 在bpo-44491中贡献。)
- 排序规则名称create_collation()现在可以包含任何 Unicode 字符。带有无效字符的排序规则名称现在提升UnicodeEncodeError而不是
sqlite3.ProgrammingError. (由 Erlend E. Aasland 在bpo-44688中贡献。)
- sqlite3例外现在包括 SQLite 扩展错误代码 as sqlite_errorcode和 SQLite 错误名称 as
sqlite_errorname。(由 Aviv Palivoda、Daniel Shahaf 和 Erlend E. Aasland 在 bpo-16379和 bpo-24139 中贡献。)
- 添加setlimit()和 getlimit()用于 sqlite3.Connection 按连接基础设置和获取
SQLite 限制。(由 Erlend E. Aasland 在bpo-45243中贡献。)
- sqlite3现在sqlite3.threadsafety基于编译底层 SQLite 库的默认线程模式设置。(由 Erlend E. Aasland
在bpo-45613中贡献。)
- sqlite3如果启用了回调回溯,C 回调现在使用不可引发的异常。用户现在可以注册一个 来改善他们的调试体验。(由 Erlend E. Aasland 在bpo-45828中贡献。)unraisable hook handler
- 跨回滚获取不再引发InterfaceError。相反,我们将其留给 SQLite 库来处理这些情况。(由 Erlend E. Aasland 在bpo-44092中贡献。)
sys
- sys.exc_info()现在从(异常实例)派生typeandtraceback字段value,因此当异常在处理过程中被修改时,更改会反映在对 . 的后续调用的结果中exc_info()。(由 Irit Katriel 在bpo-45711中贡献。)
- 添加sys.exception()返回活动异常实例(相当于sys.exc_info()[1])。(由 Irit Katriel 在bpo-46328中贡献。)
threading
- 在 Unix 上,如果该sem_clockwait()函数在 C 库(glibc 2.30 和更新版本)中可用,则该threading.Lock.acquire()方法现在使用单调时钟 ( time.CLOCK_MONOTONIC)
进行超时,而不是使用系统时钟 ( time.CLOCK_REALTIME),以不受系统时钟更改的影响。(由 Victor Stinner 在bpo-41710中贡献。)
time
- 在 Unix 上,time.sleep()现在使用clock_nanosleep()or nanosleep()函数(如果可用),其分辨率为 1 纳秒(10 -9秒),而不是使用select()其分辨率为 1 微秒(10 -6秒)。(由 Benjamin Szőke 和 Victor Stinner 在bpo-21302中贡献。)
- 在 Windows 8.1 和更新版本上,time.sleep()现在使用基于高分辨率计时器的可等待计时器 ,其分辨率为 100 纳秒(10
-7秒)。以前,它的分辨率为 1 毫秒(10 -3秒)。(由 Benjamin Szőke、Dong-hee Na、Eryk Sun 和 Victor Stinner 在bpo-21302和bpo-45429 中贡献。)
unicodedata
- Unicode 数据库已更新至版本 14.0.0。( bpo-45190 )。
fcntl
- 在 FreeBSD 上,F_DUP2FD和F_DUP2FD_CLOEXECflags 分别被支持,前者相当于dup2使用,后者FD_CLOEXEC额外设置了 flag。
Optimizations
- 编译器现在使用仅包含格式代码的文字格式优化简单的 C 样式格式%s,%r并%a使其与相应的 f 字符串表达式一样快。(由 Serhiy Storchaka 在bpo-28307中贡献。)
- 实施“零成本”例外。try当不引发异常时,语句的成本几乎可以消除。(由 Mark Shannon 在bpo-40222中贡献。)
- 由于避免创建绑定方法实例的字节码更改,现在使用关键字的方法调用更快。以前,此优化仅适用于具有纯位置参数的方法调用。(由 Ken Jin 和 Mark Shannon 在bpo-26110中贡献,基于 PyPy 中实现的想法。)
- 纯 ASCII 字符串现在在常数时间内通过unicodedata.normalize(). (由 Dong-hee Na 在bpo-44987中提供。)
- math函数comb(),perm()现在对于大参数来说速度提高了
10 倍或更多(对于较大的k速度更快)。(由 Serhiy Storchaka 在bpo-37295中贡献。)
- 当所有插入的键都是 Unicode 对象时,字典不存储哈希值。这减少了字典大小。例如,sys.getsizeof(dict.fromkeys("abcdefg")) 在 64 位平台上从 352 字节变为 272 字节。(由 Inada Naoki 在bpo-46845中贡献。)
CPython 字节码更改
- 用单个 实现替换了所有数字BINARY_*和指令。INPLACE_*BINARY_OP
- 将三个调用指令:CALL_FUNCTION和 CALL_FUNCTION_KW替换CALL_METHOD为 PUSH_NULL、PRECALL、 CALL 和
KW_NAMES。这将方法的参数转移与关键字参数的处理分离,并允许更好地专门化调用。
- 删除COPY_DICT_WITHOUT_KEYS和GEN_START。
- MATCH_CLASS并且MATCH_KEYS不再推送一个额外的布尔值来指示匹配是成功还是失败。相反,它们指示失败 None (否则提取值的元组会出现)。
- 用 new 和指令替换几个堆栈操作指令(DUP_TOP、DUP_TOP_TWO、 ROT_TWO、ROT_THREE、ROT_FOUR和) 。ROT_NCOPY SWAP
- 添加POP_JUMP_IF_NOT_NONE和POP_JUMP_IF_NONE操作码以加速条件跳转。
- JUMP_IF_NOT_EXC_MATCH不再弹出活动异常。
Deprecated
- 该lib2to3包和2to3工具现已弃用,可能无法解析 Python 3.10 或更高版本。见PEP 617(CPython 的新 PEG 解析器)。(由 Victor Stinner 在bpo-40360中贡献。)
- webbrowser.MacOSX已弃用并将在 Python 3.13 中删除。它未经测试和未记录,也没有被 webbrowser 本身使用。(由 Dong-hee Na 在bpo-42255中提供。)
- 从 aTestCase和 IsolatedAsyncioTestCasetest 方法返回值的行为(默认None值除外)现在已弃用。
- 已弃用以下unittest函数,计划在 Python 3.13 中删除:unittest.findTestCases()unittest.makeSuite()unittest.getTestCaseNames()改用TestLoader方法:
unittest.TestLoader.loadTestsFromModule()unittest.TestLoader.loadTestsFromTestCase()unittest.TestLoader.getTestCaseNames()(由
Erlend E. Aasland 在bpo-5846中贡献。)
- 自turtle.RawTurtle.settiltangle()Python 3.1 起已弃用,现在它会发出弃用警告,并将在 Python 3.13 中删除。改为使用 turtle.RawTurtle.tiltangle()(它之前被错误地标记为已弃用,现在更正了它的文档字符串)。(由 Hugo van Kemenade 在bpo-45837中贡献。)
- int()to的委托__trunc__()现在已被弃用。调用 int(a)何时type(a)实现__trunc__()但未 实现__int__()或__index__()现在会引发 DeprecationWarning .
(由 Zackery Spytz 在bpo-44977中贡献。)
- configparser自 Python 3.2 起,以下内容已被弃用。他们的弃用警告现在已经更新,注意他们将在 Python 3.12 中删除:configparser.SafeConfigParser班级_configparser.ParsingError.filename财产_configparser.ParsingError.readfp()方法_(由
Hugo van Kemenade 在bpo-45173中贡献。)
- 该locale.getdefaultlocale()函数已弃用,将在 Python 3.13 中删除。改用locale.setlocale(),
locale.getpreferredencoding(False)和 locale.getlocale()函数。(由 Victor Stinner 在bpo-46659中贡献。)
Removed
- smtpd.MailmanProxy现在已删除,因为没有外部模块就无法使用mailman. (由 Dong-hee Na 在bpo-35800中提供。)
- 该binhex模块在 Python 3.9 中已弃用,现在已删除。在 Python 3.9 中不推荐使用的以下binascii函数现在也被删除:a2b_hqx(), b2a_hqx();rlecode_hqx(), rledecode_hqx().该binascii.crc_hqx()功能仍然可用。(由
Victor Stinner 在bpo-45085中贡献。)
- bdist_msi在 Python 3.9 中不推荐使用的 distutils命令现在已被删除。改用bdist_wheel(车轮包)。(由 Hugo van Kemenade 在bpo-45124中贡献。)
- 由于重大的安全问题, Python 3.9 中禁用的 的reuse_address参数 asyncio.loop.create_datagram_endpoint()现在已完全删除。这是因为 SO_REUSEADDRUDP 中套接字选项的行为。(由 Hugo van
Kemenade 在bpo-45129中贡献。)
- 自Python 3.9 起已不推荐使用和 的__getitem__()方法 。(由 Hugo van Kemenade 在bpo-45132中贡献。)xml.dom.pulldom.DOMEventStream
wsgiref.util.FileWrapperfileinput.FileInput
- gettext 模块中删除了以下不推荐使用的函数和方法:lgettext()、ldgettext()和 。lngettext()``ldngettext()Function bind_textdomain_codeset()、 methods output_charset()和 set_output_charset()以及函数的codeset
参数translation()and install() 也被删除,因为它们仅用于l*gettext()函数。(由 Dong-hee Na 和 Serhiy
Storchaka 在bpo-44235中贡献。)
- 使基于生成器的旧协程与 async/await 代码兼容的@asyncio.coroutine 装饰器。该函数自 Python 3.8 起已被弃用,最初计划在 Python 3.10 中删除。改为使用。(由 Illia Volochii 在bpo-43216中贡献。)
async def
- asyncio.coroutines.CoroWrapper用于在调试模式下包装遗留的基于生成器的协程对象。(由 Illia Volochii 在bpo-43216中贡献。)
- 删除了已弃用split()的_tkinter.TkappType. (由 Erlend E. Aasland 在bpo-38371中贡献。)
- 从inspect模块中删除:该getargspec函数,自 Python 3.0 起已弃用;使用inspect.signature()orinspect.getfullargspec()代替。该formatargspec函数,自
Python 3.5 起已弃用;直接使用inspect.signature()函数和Signature对象。自 Python 3.5 起已弃用的未记录Signature.from_builtin和Signature.from_function 函数;改用该 Signature.from_callable()方法。(由
Hugo van Kemenade 在bpo-45320中贡献。)
- 从 unittest 发现中删除命名空间包支持。它是在 Python 3.4 中引入的,但自 Python 3.7 以来已被破坏。(由 Inada Naoki 在bpo-23882中贡献。)
- 从 中删除__class_getitem__方法pathlib.PurePath,因为在以前的版本中没有使用和错误添加。(由 Nikita Sobolev 在bpo-46483中贡献。)
- 删除未记录的私有方法,以前在 Python 3.7 中float.__set_format__()称为。float.__setformat__()它的文档字符串说:“你可能不想使用这个函数。它的存在主要是为了在 Python 的测试套件中使用。” (由 Victor Stinner 在bpo-46852中贡献。)
移植到 Python 3.11
本节列出了之前描述的更改和其他可能需要更改代码的错误修正。
Python API 的变化
- 禁止传递非concurrent.futures.ThreadPoolExecutor 执行者loop.set_default_executor()遵循 Python 3.8 中的弃用。(由 Illia Volochii 在bpo- 43234
中贡献。)
- open(), io.open(),codecs.open()并且
在文件模式下fileinput.FileInput不再接受"U"(“通用换行符”)。此标志自 Python 3.3 起已弃用。在 Python 3 中,当文件以文本模式打开时,默认使用“通用换行符”。的 换行参数
open()控制通用换行的工作方式。(由 Victor Stinner 在bpo-37330中贡献。)
- 该pdb模块现在读取带有编码的.pdbrc配置文件。"utf-8"(由Srinivas Reddy oparthy(銇銈銈銈銈銈銈銈銈銈銈銈銈銈銈銈銈銈銈銈銈銈銈銈銈銈......)
- 使用元组作为键进行排序时,如果元组元素未定义总排序,则结果的顺序可能与早期版本不同(有关总排序的信息,请参阅值比较值)。在没有对列表元素进行总排序的情况下,排序结果并没有很好地定义,这通常是正确的。
- calendar:如果未指定语言环境,则calendar.LocaleTextCalendarand calendar.LocaleHTMLCalendar 类现在使用
locale.getlocale(),而不是 using 。locale.getdefaultlocale()(由 Victor Stinner 在bpo-46659中贡献。)
构建更改
- 构建 Python 现在需要一个没有可选 C11 功能的 C11 编译器。(由 Victor Stinner 在bpo-46656中贡献。)
- 现在可以使用 ThinLTO 选项通过--with-lto=thin. (由 Dong-hee Na 和 Brett Holman 在bpo-44340中贡献。)
- libpython 不再与 libcrypt 链接。(由 Mike Gilbert 在bpo-45433中贡献。)
- 构建 Python 现在需要一个<math.h>提供以下函数的 C99 头文件:copysign(), hypot(), isfinite(), isinf(), isnan(), round(). (由 Victor Stinner 在bpo-45440中贡献。)
- 构建 Python 现在需要一个<math.h>提供NAN常量或__builtin_nan()内置函数的 C99 头文件。(由 Victor Stinner 在bpo-46640中贡献。)
- 构建 Python 现在需要支持浮点非数字 (NaN):删除Py_NO_NAN宏。(由 Victor Stinner 在bpo-46656中贡献。)
- 现在可以禁用对象结构的空闲列表。一个新的配置 选项--without-freelists可用于禁用除空元组单例之外的所有空闲列表。(由 Christian Heimes 在bpo-45522中贡献)
- Modules/Setup并Modules/makesetup进行了改进和捆绑。扩展模块现在可以通过makesetup. 除了一些测试模块之外的所有模块都可以静态链接到主二进制文件或库中。(由 Brett Cannon 和 Christian Heimes 在bpo-45548、 bpo-45570、
bpo-45571和bpo-43974 中贡献。)
- configure现在可以检测大多数 stdlib 扩展模块的构建依赖项、编译器标志和链接器标志。libffi、libnsl、libsqlite3、zlib、bzip2、liblzma、libcrypt 和 uuid 标志由 pkg-config(如果可用)检测。(由 Christian Heimes 和 Erlend Egeberg Aasland 在 bpo-bpo-45847、 bpo-45747和
bpo-45763 中贡献。)
- CPython 现在有对交叉编译到 WebAssembly 平台的实验性支持wasm32-emscripten。这项工作受到了 Pyodide 等先前工作的启发。(由 Christian Heimes 和 Ethan Smith 在bpo-40280中贡献。)
- CPython 现在将默认使用 30 位数字来int 实现 Python。以前,默认是在带有 的平台上使用 30 位数字,否则使用 15 位数字。仍然可以通过配置脚本的选项或(对于 Windows)中的 变量显式请求使用 15 位数字 ,但将来可能会删除此选项。(由 Mark Dickinson 在 bpo-45569中贡献。)SIZEOF_VOID_P
>= 8``--enable-big-digits``PYLONG_BITS_IN_DIGIT``PC/pyconfig.h
C API
- PyErr_SetExcInfo()不再使用typeand参数,解释器现在从异常实例(参数)traceback 派生这些值。value该函数仍然窃取所有三个参数的引用。(由 Irit Katriel 在 bpo-45711中贡献。)
- PyErr_GetExcInfo()现在 从异常实例(字段)派生结果的type和字段。(由 Irit Katriel 在bpo-45711中贡献。)traceback``value
- _frozen有一个新is_package字段来指示冻结的模块是否是一个包。以前,该字段中的负值size是指标。现在只有非负值用于size. (由 Kumar Aditya 在bpo-46608中贡献。)
新功能
- 添加一个新PyType_GetName()函数来获取类型的短名称。(由 Hai Shi 在bpo-42035中贡献。)
- 添加一个新PyType_GetQualName()函数来获取类型的限定名称。(由 Hai Shi 在bpo-42035中贡献。)
- 向有限的 C API添加新函数PyThreadState_EnterTracing()和 PyThreadState_LeaveTracing()函数以暂停和恢复跟踪和分析。(由
Victor Stinner 在bpo-43760中贡献。)
- 添加了Py_Version与 具有相同值的常数 PY_VERSION_HEX。(由 Gabriele N. Tornetta 在bpo-43931中贡献。)
- Py_bufferAPI 现在是受限 API 和稳定 ABI 的一部分:PyObject_CheckBuffer()PyObject_GetBuffer()
PyBuffer_GetPointer()PyBuffer_SizeFromFormat()PyBuffer_ToContiguous()
PyBuffer_FromContiguous()PyBuffer_CopyData()PyBuffer_IsContiguous()PyBuffer_FillContiguousStrides()
PyBuffer_FillInfo()PyBuffer_Release()PyMemoryView_FromBuffer()
bf_getbuffer并 bf_releasebuffer输入插槽(由 Christian Heimes 在bpo-45459中贡献。)
- 添加了PyType_GetModuleByDef函数,用于获取定义方法的模块,以防无法直接获得此信息(通过PyCMethod)。(由 Petr Viktorin
在bpo-46613中贡献。)