阅读(2034) (15)

Python3.11更新

2022-03-04 11:03:35 更新

回溯中增强的错误位置

打印回溯时,解释器现在将指向导致错误的确切表达式,而不仅仅是行。例如:

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 提供,可用于将字节码指令与源代码相关联。可以使用以下方法检索此信息:

选项和环境变量 -X no_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.SupportsComplextyping.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

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

sys

  • sys.exc_info()现在从(异常实例)派生typeandtraceback字段value,因此当异常在处理过程中被修改时,更改会反映在对 . 的后续调用的结果中exc_info()。(由 Irit Katriel 在bpo-45711中贡献。)
  • 添加sys.exception()返回活动异常实例(相当于sys.exc_info()[1])。(由 Irit Katriel 在bpo-46328中贡献。)

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-21302bpo-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_NULLPRECALLCALL 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_NONEPOP_JUMP_IF_NONE操作码以加速条件跳转。
  • JUMP_IF_NOT_EXC_MATCH不再弹出活动异常。

Deprecated

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 的变化

构建更改

  • 构建 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-45548bpo-45570bpo-45571bpo-43974 中贡献。)
  • configure现在可以检测大多数 stdlib 扩展模块的构建依赖项、编译器标志和链接器标志。libffi、libnsl、libsqlite3、zlib、bzip2、liblzma、libcrypt 和 uuid 标志由 pkg-config(如果可用)检测。(由 Christian Heimes 和 Erlend Egeberg Aasland 在 bpo-bpo-45847bpo-45747bpo-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中贡献。)

新功能