回溯中增强的错误位置
打印回溯时,解释器现在将指向导致错误的确切表达式,而不仅仅是行。例如:
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 提供,可用于将字节码指令与源代码相关联。可以使用以下方法检索此信息:
选项和环境变量 -Xno_debug_rangesPYTHONNODEBUGRANGES可用于禁用此功能。
看PEP 657了解更多详情。(由 Pablo Galindo、Batuhan Taskaya 和 Ammar Askar 在bpo-43950中贡献。)
异常可以用字符串丰富__note__
该__note__字段已添加到BaseException. 默认情况None 下,但可以设置为添加到异常回溯的字符串。(由 Irit Katriel 在bpo-45607中贡献。)
其他语言变化
其他 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
空闲和空闲库
- 对.pyi文件应用语法高亮。(由 Alex Waygood 和 Terry Jan Reedy 在bpo-45447中贡献。)
inspect
math
operator
- 添加了一个新功能operator.call,例如 . (由 Antony Lee 在bpo-44019中贡献。)operator.call(obj, *args, **kwargs) == obj(*args, **kwargs)
os
socket
- 添加对 NetBSD 的 CAN Socket 支持。(由 Thomas Klausner 在bpo-30512中贡献。)
sqlite3
sys
threading
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
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 字节码更改
Deprecated
Removed
移植到 Python 3.11
本节列出了之前描述的更改和其他可能需要更改代码的错误修正。
Python API 的变化
构建更改
- 构建 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
新功能