Python 3.11有什么新变化

Release

2021.02.28.beta28

Date

December 13, 2021

This article explains the new features in Python 3.11, compared to 3.10.

For full details, see the changelog.

Note

Prerelease users should be aware that this document is currently in draft form. It will be updated substantially as Python 3.11 moves towards release, so it’s worth checking back even after reading earlier versions.

总结 – 版本亮点

新特征

在回溯中增强错误定位

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

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

PEP 657 寻找更多信息。 (由 Pablo Galindo, Batuhan Taskaya 和 Ammar Askar 贡献在 bpo-43950.)

Note

此功能需要在代码对象中存储列位置,这可能会导致已编译 Python 文件的磁盘使用量或解释器内存使用量的小幅增加。 为了避免存储额外信息和/或停用打印额外回溯信息,可以使用 -X no_debug_ranges 命令行标志 或 PYTHONNODEBUGRANGES 环境变量。

代码对象的列信息

增强回溯功能使用的信息作为通用 API 提供,可用于将字节码指令与源代码相关联。可以使用以下方法检索此信息:

-X no_debug_ranges 选项和环境变量 PYTHONNODEBUGRANGES 可用于禁用该功能。

PEP 657 查看更多细节。 (由 Pablo Galindo, Batuhan Taskaya 和 Ammar Askar 贡献在 bpo-43950.)

其他语言更改

新模块

  • 还没有。

改进的模块

fractions

支持 PEP 515 -样式的 Fraction 从字符串初始化。 (由 Sergey B Kirpichev 在 bpo-44258 贡献。)

math

  • 添加 math.cbrt() : 返回 x 的立方根。 (由 Ajith Ramachandran 在 bpo-44357 贡献。)

  • 为了与 IEEE 754 规范保持一致,更改了两个 math.pow() 极端情况的行为。 操作 math.pow(0.0, -math.inf)math.pow(-0.0, -math.inf) 现在返回 inf。 以前他们报 ValueError。 (由 Mark Dickinson 在 bpo-44339 中贡献。)

os

  • 在 Windows 上, os.urandom() 使用 BCryptGenRandom() 代替 CryptGenRandom() ,后者已被弃用。(由 Dong-hee Na 在 bpo-44611 贡献。)

sqlite3

已移除

  • smtpd.MailmanProxy 现在已被移除,因为它在某一外部模块 mailman 情况下无法使用。 (由 Dong-hee Na 在 bpo-35800 贡献。)

优化

  • Compiler now optimizes simple C-style formatting with literal format containing only format codes %s, %r and %a and makes it as fast as corresponding f-string expression. (Contributed by Serhiy Storchaka in bpo-28307.)

  • “Zero-cost” exceptions are implemented. The cost of try statements is almost eliminated when no exception is raised. (Contributed by Mark Shannon in bpo-40222.)

  • Method calls with keywords are now faster due to bytecode changes which avoid creating bound method instances. Previously, this optimization was applied only to method calls with purely positional arguments. (Contributed by Ken Jin and Mark Shannon in bpo-26110, based on ideas implemented in PyPy.)

  • .pdbrc 现在使用 'utf-8' 编码读取。

CPython bytecode changes

Build Changes

Deprecated

移除

  • The @asyncio.coroutine decorator enabling legacy generator-based coroutines to be compatible with async/await code. The function has been deprecated since Python 3.8 and the removal was initially scheduled for Python 3.10. Use async def instead. (Contributed by Illia Volochii in bpo-43216.)

  • asyncio.coroutines.CoroWrapper used for wrapping legacy generator-based coroutine objects in the debug mode. (Contributed by Illia Volochii in bpo-43216.)

移植到 Python 3.11

This section lists previously described changes and other bugfixes that may require changes to your code.

Python API 更改

C API 更改

新特征

移植到 Python 3.11

已弃用

已移除

函数 bind_textdomain_codeset() , 方法 output_charset()set_output_charset(), 以及函数 install()codeset 参数也被移除, 因为它们仅仅能被使用在 l*gettext() 函数上。 (由 Dong-hee Na 和 Serhiy Storchaka 在 bpo-44235 贡献。)