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 提供,可用于将字节码指令与源代码相关联。可以使用以下方法检索此信息:
在 Python 中
codeobject.co_positions()
方法。在 C-API 中
PyCode_Addr2Location()
函数。
-X
no_debug_ranges
选项和环境变量
PYTHONNODEBUGRANGES
可用于禁用该功能。
去 PEP 657 查看更多细节。 (由 Pablo Galindo, Batuhan Taskaya 和 Ammar Askar 贡献在 bpo-43950.)
其他语言更改¶
现在允许在异步函数中的理解中使用异步理解。外部理解隐式地变为异步。 (由 Serhiy Storchaka 在 bpo-33346 贡献。)
相应地对于不支持 context manager 或 asynchronous context manager 协议的对象, 现在在
contextlib.ExitStack.enter_context()
和contextlib.AsyncExitStack.enter_async_context()
中 引发的是TypeError
而不是AttributeError
。 (由 Serhiy Storchaka 在 bpo-44471 贡献。)相应地对于不支持 context manager 或 asynchronous context manager 协议的对象, 现在在
with
和async with
语句中引发的是TypeError
而不是AttributeError
。(由 Serhiy Storchaka 在 bpo-12022 贡献。)
新模块¶
还没有。
改进的模块¶
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¶
您现在可以通过将
None
传递给set_authorizer()
来禁用授权器。 (由 Erlend E. Aasland 在 bpo-44491 中提供。)排序规则名
create_collation()
现在可以包含任意 Unicode 字符了。 带有无效字符的排序规则名 现在引发UnicodeEncodeError
而不是sqlite3.ProgrammingError
。 (由 Erlend E. Aasland 在 bpo-44688 贡献。)
已移除¶
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¶
Added a new
CALL_METHOD_KW
opcode. Calls a method in a similar fashion asCALL_METHOD
, but also supports keyword arguments. Works in tandem withLOAD_METHOD
.
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. Useasync 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 更改¶
Prohibited passing non-
concurrent.futures.ThreadPoolExecutor
executors toloop.set_default_executor()
following a deprecation in Python 3.8. (Contributed by Illia Volochii in bpo-43234 .)
C API 更改¶
Add a new
PyType_GetName()
function to get type’s short name. (Contributed by Hai Shi in bpo-42035.)
新特征¶
移植到 Python 3.11¶
The
PyType_Ready()
function now raises an error if a type is defined with thePy_TPFLAGS_HAVE_GC
flag set but has no traverse function (PyTypeObject.tp_traverse
). (Contributed by Victor Stinner in bpo-44263.)Heap types with the
Py_TPFLAGS_IMMUTABLETYPE
flag can now inherit the PEP 590 vectorcall protocol. Previously, this was only possible for static types. (Contributed by Erlend E. Aasland in bpo-43908)
已弃用¶
已移除¶
PyFrame_BlockSetup()
和PyFrame_BlockPop()
已经被移除。 (由 Mark Shannon 在 bpo-40222 贡献。)移除以下函数来配置 Python 初始化:
PySys_HasWarnOptions()
_Py_SetProgramFullPath()
使用 Python Initialization Configuration 中的
PyConfig
API 代替 ( PEP 587 )。 (由 Victor Stinner 在 bpo-44113 贡献。)在
gettext
模块中:lgettext()
,ldgettext()
,lngettext()
和ldngettext()
已被弃用的函数移除。
函数
bind_textdomain_codeset()
, 方法output_charset()
和set_output_charset()
, 以及函数install()
的 codeset 参数也被移除, 因为它们仅仅能被使用在l*gettext()
函数上。 (由 Dong-hee Na 和 Serhiy Storchaka 在 bpo-44235 贡献。)