What’s New In Python 3.12
¶
-
编者
:
-
Adam Turner
This article explains the new features in Python 3.12, compared to 3.11. Python 3.12 was released on October 2, 2023. For full details, see the
changelog
.
另请参阅
PEP 693
– Python 3.12 Release Schedule
摘要 – 发行亮点
¶
Python 3.12 is a stable release of the Python programming language, with a mix of changes to the language and the standard library. The library changes focus on cleaning up deprecated APIs, usability, and correctness. Of note, the
distutils
package has been removed from the standard library. Filesystem support in
os
and
pathlib
has seen a number of improvements, and several modules have better performance.
The language changes focus on usability, as
f-strings
have had many limitations removed and ‘Did you mean …’ suggestions continue to improve. The new
type parameter syntax
and
type
statement improve ergonomics for using
一般类型
and
type aliases
with static type checkers.
This article doesn’t attempt to provide a complete specification of all new features, but instead gives a convenient overview. For full details, you should refer to the documentation, such as the
库参考
and
语言参考
. If you want to understand the complete implementation and design rationale for a change, refer to the PEP for a particular new feature; but note that PEPs usually are not kept up-to-date once a feature has been fully implemented.
新句法特征:
New grammar features:
解释器改进:
Python data model improvements:
Significant improvements in the standard library:
Security improvements:
-
Replace the builtin
hashlib
implementations of SHA1, SHA3, SHA2-384, SHA2-512, and MD5 with formally verified code from the
HACL*
project. These builtin implementations remain as fallbacks that are only used when OpenSSL does not provide them.
C API 改进:
CPython 实现改进:
-
PEP 709
, comprehension inlining
-
CPython support
for the Linux
perf
profiler
-
Implement stack overflow protection on supported platforms
新类型特征:
Important deprecations, removals or restrictions:
-
PEP 623
:移除
wstr
from Unicode objects in Python’s C API, reducing the size of every
str
object by at least 8 bytes.
-
PEP 632
: Remove the
distutils
package. See
the migration guide
for advice replacing the APIs it provided. The third-party
Setuptools
package continues to provide
distutils
, if you still require it in Python 3.12 and beyond.
-
gh-95299
: Do not pre-install
setuptools
in virtual environments created with
venv
。这意味着
distutils
,
setuptools
,
pkg_resources
,和
easy_install
will no longer available by default; to access these run
pip install setuptools
在
activated
virtual environment.
-
The
asynchat
,
asyncore
,和
imp
modules have been removed, along with several
unittest.TestCase
method aliases
.
新特征
¶
PEP 695: Type Parameter Syntax
¶
Generic classes and functions under
PEP 484
were declared using a verbose syntax that left the scope of type parameters unclear and required explicit declarations of variance.
PEP 695
introduces a new, more compact and explicit way to create
generic classes
and
函数
:
def max[T](args: Iterable[T]) -> T:
...
class list[T]:
def __getitem__(self, index: int, /) -> T:
...
def append(self, element: T) -> None:
...
In addition, the PEP introduces a new way to declare
type aliases
使用
type
statement, which creates an instance of
TypeAliasType
:
type Point = tuple[float, float]
Type aliases can also be
generic
:
type Point[T] = tuple[T, T]
The new syntax allows declaring
TypeVarTuple
and
ParamSpec
parameters, as well as
TypeVar
parameters with bounds or constraints:
type IntFunc[**P] = Callable[P, int] # ParamSpec
type LabeledTuple[*Ts] = tuple[str, *Ts] # TypeVarTuple
type HashableSequence[T: Hashable] = Sequence[T] # TypeVar with bound
type IntOrStrSequence[T: (int, str)] = Sequence[T] # TypeVar with constraints
The value of type aliases and the bound and constraints of type variables created through this syntax are evaluated only on demand (see
lazy evaluation
). This means type aliases are able to refer to other types defined later in the file.
Type parameters declared through a type parameter list are visible within the scope of the declaration and any nested scopes, but not in the outer scope. For example, they can be used in the type annotations for the methods of a generic class or in the class body. However, they cannot be used in the module scope after the class is defined. See
Type parameter lists
for a detailed description of the runtime semantics of type parameters.
In order to support these scoping semantics, a new kind of scope is introduced, the
annotation scope
. Annotation scopes behave for the most part like function scopes, but interact differently with enclosing class scopes. In Python 3.13,
annotations
will also be evaluated in annotation scopes.
见
PEP 695
了解更多细节。
(PEP written by Eric Traut. Implementation by Jelle Zijlstra, Eric Traut, and others in
gh-103764
)。
PEP 684: A Per-Interpreter GIL
¶
PEP 684
introduces a per-interpreter
GIL
, so that sub-interpreters may now be created with a unique GIL per interpreter. This allows Python programs to take full advantage of multiple CPU cores. This is currently only available through the C-API, though a Python API is
anticipated for 3.13
.
Use the new
Py_NewInterpreterFromConfig()
function to create an interpreter with its own GIL:
PyInterpreterConfig config = {
.check_multi_interp_extensions = 1,
.gil = PyInterpreterConfig_OWN_GIL,
};
PyThreadState *tstate = NULL;
PyStatus status = Py_NewInterpreterFromConfig(&tstate, &config);
if (PyStatus_Exception(status)) {
return -1;
}
/* The new interpreter is now active in the current thread. */
For further examples how to use the C-API for sub-interpreters with a per-interpreter GIL, see
Modules/_xxsubinterpretersmodule.c
.
(Contributed by Eric Snow in
gh-104210
,等)
PEP 669: Low impact monitoring for CPython
¶
PEP 669
defines a new
API
for profilers, debuggers, and other tools to monitor events in CPython. It covers a wide range of events, including calls, returns, lines, exceptions, jumps, and more. This means that you only pay for what you use, providing support for near-zero overhead debuggers and coverage tools. See
sys.monitoring
了解细节。
(Contributed by Mark Shannon in
gh-103082
)。
PEP 688: Making the buffer protocol accessible in Python
¶
PEP 688
introduces a way to use the
缓冲协议
from Python code. Classes that implement the
__buffer__()
method are now usable as buffer types.
新的
collections.abc.Buffer
ABC provides a standard way to represent buffer objects, for example in type annotations. The new
inspect.BufferFlags
enum represents the flags that can be used to customize buffer creation. (Contributed by Jelle Zijlstra in
gh-102500
)。
PEP 709: Comprehension inlining
¶
Dictionary, list, and set comprehensions are now inlined, rather than creating a new single-use function object for each execution of the comprehension. This speeds up execution of a comprehension by up to two times. See
PEP 709
进一步了解细节。
Comprehension iteration variables remain isolated and don’t overwrite a variable of the same name in the outer scope, nor are they visible after the comprehension. Inlining does result in a few visible behavior changes:
-
There is no longer a separate frame for the comprehension in tracebacks, and tracing/profiling no longer shows the comprehension as a function call.
-
The
symtable
module will no longer produce child symbol tables for each comprehension; instead, the comprehension’s locals will be included in the parent function’s symbol table.
-
调用
locals()
inside a comprehension now includes variables from outside the comprehension, and no longer includes the synthetic
.0
variable for the comprehension “argument”.
-
A comprehension iterating directly over
locals()
(如
[k for k in
locals()]
) may see “RuntimeError: dictionary changed size during iteration” when run under tracing (e.g. code coverage measurement). This is the same behavior already seen in e.g.
for k in locals():
. To avoid the error, first create a list of keys to iterate over:
keys = list(locals()); [k for k in
keys]
.
(Contributed by Carl Meyer and Vladimir Matveev in
PEP 709
)。
Improved Error Messages
¶
-
Modules from the standard library are now potentially suggested as part of the error messages displayed by the interpreter when a
NameError
is raised to the top level. (Contributed by Pablo Galindo in
gh-98254
)。
>>> sys.version_info
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'sys' is not defined. Did you forget to import 'sys'?
-
Improve the error suggestion for
NameError
exceptions for instances. Now if a
NameError
is raised in a method and the instance has an attribute that’s exactly equal to the name in the exception, the suggestion will include
self.<NAME>
instead of the closest match in the method scope. (Contributed by Pablo Galindo in
gh-99139
)。
>>> class A:
... def __init__(self):
... self.blech = 1
...
... def foo(self):
... somethin = blech
...
>>> A().foo()
Traceback (most recent call last):
File "<stdin>", line 1
somethin = blech
^^^^^
NameError: name 'blech' is not defined. Did you mean: 'self.blech'?
-
Improve the
SyntaxError
error message when the user types
import x
from
y
而不是
from y import x
. (Contributed by Pablo Galindo in
gh-98931
)。
>>> import a.y.z from b.y.z
Traceback (most recent call last):
File "<stdin>", line 1
import a.y.z from b.y.z
^^^^^^^^^^^^^^^^^^^^^^^
SyntaxError: Did you mean to use 'from ... import ...' instead?
-
ImportError
exceptions raised from failed
from <module> import
<name>
statements now include suggestions for the value of
<name>
based on the available names in
<module>
. (Contributed by Pablo Galindo in
gh-91058
)。
>>> from collections import chainmap
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name 'chainmap' from 'collections'. Did you mean: 'ChainMap'?
其它语言变化
¶
-
The parser now raises
SyntaxError
when parsing source code containing null bytes. (Contributed by Pablo Galindo in
gh-96670
)。
-
A backslash-character pair that is not a valid escape sequence now generates a
SyntaxWarning
,而不是
DeprecationWarning
。例如,
re.compile("\d+\.\d+")
now emits a
SyntaxWarning
(
"\d"
is an invalid escape sequence, use raw strings for regular expression:
re.compile(r"\d+\.\d+")
). In a future Python version,
SyntaxError
will eventually be raised, instead of
SyntaxWarning
. (Contributed by Victor Stinner in
gh-98401
)。
-
Octal escapes with value larger than
0o377
(ex:
"\477"
), deprecated in Python 3.11, now produce a
SyntaxWarning
,而不是
DeprecationWarning
. In a future Python version they will be eventually a
SyntaxError
. (Contributed by Victor Stinner in
gh-98401
)。
-
Variables used in the target part of comprehensions that are not stored to can now be used in assignment expressions (
:=
). For example, in
[(b := 1) for a, b.prop in some_iter]
, the assignment to
b
is now allowed. Note that assigning to variables stored to in the target part of comprehensions (like
a
) is still disallowed, as per
PEP 572
. (Contributed by Nikita Sobolev in
gh-100581
)。
-
Exceptions raised in a class or type’s
__set_name__
method are no longer wrapped by a
RuntimeError
. Context information is added to the exception as a
PEP 678
note. (Contributed by Irit Katriel in
gh-77757
)。
-
当
try-except*
construct handles the entire
ExceptionGroup
and raises one other exception, that exception is no longer wrapped in an
ExceptionGroup
. Also changed in version 3.11.4. (Contributed by Irit Katriel in
gh-103590
)。
-
The Garbage Collector now runs only on the eval breaker mechanism of the Python bytecode evaluation loop instead of object allocations. The GC can also run when
PyErr_CheckSignals()
is called so C extensions that need to run for a long time without executing any Python code also have a chance to execute the GC periodically. (Contributed by Pablo Galindo in
gh-97922
)。
-
All builtin and extension callables expecting boolean parameters now accept arguments of any type instead of just
bool
and
int
. (Contributed by Serhiy Storchaka in
gh-60203
)。
-
memoryview
now supports the half-float type (the “e” format code). (Contributed by Donghee Na and Antoine Pitrou in
gh-90751
)。
-
slice
objects are now hashable, allowing them to be used as dict keys and set items. (Contributed by Will Bradshaw, Furkan Onder, and Raymond Hettinger in
gh-101264
)。
-
sum()
now uses Neumaier summation to improve accuracy and commutativity when summing floats or mixed ints and floats. (Contributed by Raymond Hettinger in
gh-100425
)。
-
ast.parse()
现在引发
SyntaxError
而不是
ValueError
when parsing source code containing null bytes. (Contributed by Pablo Galindo in
gh-96670
)。
-
The extraction methods in
tarfile
,和
shutil.unpack_archive()
, have a new a
filter
argument that allows limiting tar features than may be surprising or dangerous, such as creating files outside the destination directory. See
tarfile extraction filters
for details. In Python 3.14, the default will switch to
'data'
. (Contributed by Petr Viktorin in
PEP 706
)。
-
types.MappingProxyType
instances are now hashable if the underlying mapping is hashable. (Contributed by Serhiy Storchaka in
gh-87995
)。
-
添加
support for the perf profiler
through the new environment variable
PYTHONPERFSUPPORT
and command-line option
-X perf
, as well as the new
sys.activate_stack_trampoline()
,
sys.deactivate_stack_trampoline()
,和
sys.is_stack_trampoline_active()
functions. (Design by Pablo Galindo. Contributed by Pablo Galindo and Christian Heimes with contributions from Gregory P. Smith [Google] and Mark Shannon in
gh-96123
)。
改进模块
¶
dis
¶
-
Pseudo instruction opcodes (which are used by the compiler but do not appear in executable bytecode) are now exposed in the
dis
模块。
HAVE_ARGUMENT
is still relevant to real opcodes, but it is not useful for pseudo instructions. Use the new
dis.hasarg
collection instead. (Contributed by Irit Katriel in
gh-94216
)。
-
添加
dis.hasexc
collection to signify instructions that set an exception handler. (Contributed by Irit Katriel in
gh-94216
)。
math
¶
-
添加
math.sumprod()
for computing a sum of products. (Contributed by Raymond Hettinger in
gh-100485
)。
-
Extend
math.nextafter()
to include a
steps
argument for moving up or down multiple steps at a time. (Contributed by Matthias Goergens, Mark Dickinson, and Raymond Hettinger in
gh-94906
)。
os
¶
-
添加
os.PIDFD_NONBLOCK
to open a file descriptor for a process with
os.pidfd_open()
in non-blocking mode. (Contributed by Kumar Aditya in
gh-93312
)。
-
os.DirEntry
now includes an
os.DirEntry.is_junction()
method to check if the entry is a junction. (Contributed by Charles Machalow in
gh-99547
)。
-
添加
os.listdrives()
,
os.listvolumes()
and
os.listmounts()
functions on Windows for enumerating drives, volumes and mount points. (Contributed by Steve Dower in
gh-102519
)。
-
os.stat()
and
os.lstat()
are now more accurate on Windows. The
st_birthtime
field will now be filled with the creation time of the file, and
st_ctime
is deprecated but still contains the creation time (but in the future will return the last metadata change, for consistency with other platforms).
st_dev
may be up to 64 bits and
st_ino
up to 128 bits depending on your file system, and
st_rdev
is always set to zero rather than incorrect values. Both functions may be significantly faster on newer releases of Windows. (Contributed by Steve Dower in
gh-99726
)。
shutil
¶
-
shutil.make_archive()
now passes the
root_dir
argument to custom archivers which support it. In this case it no longer temporarily changes the current working directory of the process to
root_dir
to perform archiving. (Contributed by Serhiy Storchaka in
gh-74696
)。
-
shutil.rmtree()
now accepts a new argument
onexc
which is an error handler like
onerror
but which expects an exception instance rather than a
(typ, val, tb)
triplet.
onerror
is deprecated. (Contributed by Irit Katriel in
gh-102828
)。
-
shutil.which()
now consults the
PATHEXT
environment variable to find matches within
PATH
on Windows even when the given
cmd
includes a directory component. (Contributed by Charles Machalow in
gh-103179
)。
shutil.which()
将调用
NeedCurrentDirectoryForExePathW
when querying for executables on Windows to determine if the current working directory should be prepended to the search path. (Contributed by Charles Machalow in
gh-103179
)。
shutil.which()
will return a path matching the
cmd
with a component from
PATHEXT
prior to a direct match elsewhere in the search path on Windows. (Contributed by Charles Machalow in
gh-103179
)。
tkinter
¶
-
tkinter.Canvas.coords()
now flattens its arguments. It now accepts not only coordinates as separate arguments (
x1, y1, x2, y2, ...
) and a sequence of coordinates (
[x1, y1, x2, y2, ...]
), but also coordinates grouped in pairs (
(x1, y1), (x2, y2), ...
and
[(x1, y1), (x2, y2), ...]
), like
create_*()
methods. (Contributed by Serhiy Storchaka in
gh-94473
)。
typing
¶
-
isinstance()
checks against
runtime-checkable protocols
now use
inspect.getattr_static()
而不是
hasattr()
to lookup whether attributes exist. This means that descriptors and
__getattr__()
methods are no longer unexpectedly evaluated during
isinstance()
checks against runtime-checkable protocols. However, it may also mean that some objects which used to be considered instances of a runtime-checkable protocol may no longer be considered instances of that protocol on Python 3.12+, and vice versa. Most users are unlikely to be affected by this change. (Contributed by Alex Waygood in
gh-102433
)。
-
The members of a runtime-checkable protocol are now considered “frozen” at runtime as soon as the class has been created. Monkey-patching attributes onto a runtime-checkable protocol will still work, but will have no impact on
isinstance()
checks comparing objects to the protocol. For example:
>>> from typing import Protocol, runtime_checkable
>>> @runtime_checkable
... class HasX(Protocol):
... x = 1
...
>>> class Foo: ...
...
>>> f = Foo()
>>> isinstance(f, HasX)
False
>>> f.x = 1
>>> isinstance(f, HasX)
True
>>> HasX.y = 2
>>> isinstance(f, HasX) # unchanged, even though HasX now also has a "y" attribute
True
This change was made in order to speed up
isinstance()
checks against runtime-checkable protocols.
-
The performance profile of
isinstance()
checks against
runtime-checkable protocols
has changed significantly. Most
isinstance()
checks against protocols with only a few members should be at least 2x faster than in 3.11, and some may be 20x faster or more. However,
isinstance()
checks against protocols with many members may be slower than in Python 3.11. (Contributed by Alex Waygood in
gh-74690
and
gh-103193
)。
-
所有
typing.TypedDict
and
typing.NamedTuple
classes now have the
__orig_bases__
attribute. (Contributed by Adrian Garcia Badaracco in
gh-103699
)。
-
添加
frozen_default
参数用于
typing.dataclass_transform()
. (Contributed by Erik De Bonte in
gh-99957
)。
unittest
¶
添加
--durations
command line option, showing the N slowest test cases:
python3 -m unittest --durations=3 lib.tests.test_threading
.....
Slowest test durations
----------------------------------------------------------------------
1.210s test_timeout (Lib.test.test_threading.BarrierTests)
1.003s test_default_timeout (Lib.test.test_threading.BarrierTests)
0.518s test_timeout (Lib.test.test_threading.EventTests)
(0.000 durations hidden. Use -v to show these durations.)
----------------------------------------------------------------------
Ran 158 tests in 9.869s
OK (skipped=3)
(Contributed by Giampaolo Rodola in
gh-48330
)
优化
¶
-
移除
wstr
and
wstr_length
members from Unicode objects. It reduces object size by 8 or 16 bytes on 64bit platform. (
PEP 623
) (Contributed by Inada Naoki in
gh-92536
)。
-
Add experimental support for using the BOLT binary optimizer in the build process, which improves performance by 1-5%. (Contributed by Kevin Modzelewski in
gh-90536
and tuned by Donghee Na in
gh-101525
)
-
Speed up the regular expression substitution (functions
re.sub()
and
re.subn()
and corresponding
re.Pattern
methods) for replacement strings containing group references by 2–3 times. (Contributed by Serhiy Storchaka in
gh-91524
)。
-
Speed up
asyncio.Task
creation by deferring expensive string formatting. (Contributed by Itamar Oren in
gh-103793
)。
-
The
tokenize.tokenize()
and
tokenize.generate_tokens()
functions are up to 64% faster as a side effect of the changes required to cover
PEP 701
在
tokenize
module. (Contributed by Marta Gómez Macías and Pablo Galindo in
gh-102856
)。
-
Speed up
super()
method calls and attribute loads via the new
LOAD_SUPER_ATTR
instruction. (Contributed by Carl Meyer and Vladimir Matveev in
gh-103497
)。
弃用
¶
-
argparse
:
type
,
choices
,和
metavar
parameters of
argparse.BooleanOptionalAction
are deprecated and will be removed in 3.14. (Contributed by Nikita Sobolev in
gh-92248
)。
-
ast
: The following
ast
features have been deprecated in documentation since Python 3.8, now cause a
DeprecationWarning
to be emitted at runtime when they are accessed or used, and will be removed in Python 3.14:
-
ast.Num
-
ast.Str
-
ast.Bytes
-
ast.NameConstant
-
ast.Ellipsis
使用
ast.Constant
instead. (Contributed by Serhiy Storchaka in
gh-90953
)。
-
asyncio
:
-
calendar
:
calendar.January
and
calendar.February
constants are deprecated and replaced by
calendar.JANUARY
and
calendar.FEBRUARY
. (Contributed by Prince Roshan in
gh-103636
)。
-
collections.abc
: Deprecated
collections.abc.ByteString
. Prefer
Sequence
or
collections.abc.Buffer
. For use in typing, prefer a union, like
bytes | bytearray
,或
collections.abc.Buffer
. (Contributed by Shantanu Jain in
gh-91896
)。
-
datetime
:
datetime.datetime
’s
utcnow()
and
utcfromtimestamp()
are deprecated and will be removed in a future version. Instead, use timezone-aware objects to represent datetimes in UTC: respectively, call
now()
and
fromtimestamp()
采用
tz
parameter set to
datetime.UTC
. (Contributed by Paul Ganssle in
gh-103857
)。
-
email
: Deprecate the
isdst
parameter in
email.utils.localtime()
. (Contributed by Alan Williams in
gh-72346
)。
-
importlib.abc
: Deprecated the following classes, scheduled for removal in Python 3.14:
-
importlib.abc.ResourceReader
-
importlib.abc.Traversable
-
importlib.abc.TraversableResources
使用
importlib.resources.abc
classes instead:
(Contributed by Jason R. Coombs and Hugo van Kemenade in
gh-93963
)。
-
itertools
: Deprecate the support for copy, deepcopy, and pickle operations, which is undocumented, inefficient, historically buggy, and inconsistent. This will be removed in 3.14 for a significant reduction in code volume and maintenance burden. (Contributed by Raymond Hettinger in
gh-101588
)。
-
multiprocessing
: In Python 3.14, the default
multiprocessing
start method will change to a safer one on Linux, BSDs, and other non-macOS POSIX platforms where
'fork'
is currently the default (
gh-84559
). Adding a runtime warning about this was deemed too disruptive as the majority of code is not expected to care. Use the
get_context()
or
set_start_method()
APIs to explicitly specify when your code
requires
'fork'
。见
contexts and start methods
.
-
pkgutil
:
pkgutil.find_loader()
and
pkgutil.get_loader()
are deprecated and will be removed in Python 3.14; use
importlib.util.find_spec()
instead. (Contributed by Nikita Sobolev in
gh-97850
)。
-
pty
: The module has two undocumented
master_open()
and
slave_open()
functions that have been deprecated since Python 2 but only gained a proper
DeprecationWarning
in 3.12. Remove them in 3.14. (Contributed by Soumendra Ganguly and Gregory P. Smith in
gh-85984
)。
-
os
:
-
The
st_ctime
fields return by
os.stat()
and
os.lstat()
on Windows are deprecated. In a future release, they will contain the last metadata change time, consistent with other platforms. For now, they still contain the creation time, which is also available in the new
st_birthtime
field. (Contributed by Steve Dower in
gh-99726
)。
-
On POSIX platforms,
os.fork()
can now raise a
DeprecationWarning
when it can detect being called from a multithreaded process. There has always been a fundamental incompatibility with the POSIX platform when doing so. Even if such code
appeared
to work. We added the warning to raise awareness as issues encountered by code doing this are becoming more frequent. See the
os.fork()
documentation for more details along with
this discussion on fork being incompatible with threads
for
why
we’re now surfacing this longstanding platform compatibility problem to developers.
When this warning appears due to usage of
multiprocessing
or
concurrent.futures
the fix is to use a different
multiprocessing
start method such as
"spawn"
or
"forkserver"
.
-
shutil
:
onerror
自变量
shutil.rmtree()
is deprecated; use
onexc
instead. (Contributed by Irit Katriel in
gh-102828
)。
-
sqlite3
:
-
sys
:
sys.last_type
,
sys.last_value
and
sys.last_traceback
fields are deprecated. Use
sys.last_exc
instead. (Contributed by Irit Katriel in
gh-102778
)。
-
tarfile
: Extracting tar archives without specifying
filter
is deprecated until Python 3.14, when
'data'
filter will become the default. See
Extraction filters
了解细节。
-
typing
:
-
xml.etree.ElementTree
: The module now emits
DeprecationWarning
when testing the truth value of an
xml.etree.ElementTree.Element
. Before, the Python implementation emitted
FutureWarning
, and the C implementation emitted nothing. (Contributed by Jacob Walls in
gh-83122
)。
-
The 3-arg signatures (type, value, traceback) of
coroutine throw()
,
generator throw()
and
async generator throw()
are deprecated and may be removed in a future version of Python. Use the single-arg versions of these functions instead. (Contributed by Ofey Chan in
gh-89874
)。
-
DeprecationWarning
is now raised when
__package__
on a module differs from
__spec__.parent
(previously it was
ImportWarning
). (Contributed by Brett Cannon in
gh-65961
)。
-
设置
__package__
or
__cached__
on a module is deprecated, and will cease to be set or taken into consideration by the import system in Python 3.14. (Contributed by Brett Cannon in
gh-65961
)。
-
The bitwise inversion operator (
~
) on bool is deprecated. It will throw an error in Python 3.16. Use
not
for logical negation of bools instead. In the rare case that you really need the bitwise inversion of the underlying
int
, convert to int explicitly:
~int(x)
. (Contributed by Tim Hoffmann in
gh-103487
)。
-
访问
co_lnotab
on code objects was deprecated in Python 3.10 via
PEP 626
, but it only got a proper
DeprecationWarning
in 3.12. May be removed in 3.15. (Contributed by Nikita Sobolev in
gh-101866
)。
Pending Removal in Python 3.13
¶
Modules (see
PEP 594
):
-
aifc
-
audioop
-
cgi
-
cgitb
-
chunk
-
crypt
-
imghdr
-
mailcap
-
msilib
-
nis
-
nntplib
-
ossaudiodev
-
pipes
-
sndhdr
-
spwd
-
sunau
-
telnetlib
-
uu
-
xdrlib
Other modules:
API:
Pending Removal in Python 3.14
¶
-
argparse
:
type
,
choices
,和
metavar
parameters of
argparse.BooleanOptionalAction
are deprecated and will be removed in 3.14. (Contributed by Nikita Sobolev in
gh-92248
)。
-
ast
: The following features have been deprecated in documentation since Python 3.8, now cause a
DeprecationWarning
to be emitted at runtime when they are accessed or used, and will be removed in Python 3.14:
-
ast.Num
-
ast.Str
-
ast.Bytes
-
ast.NameConstant
-
ast.Ellipsis
使用
ast.Constant
instead. (Contributed by Serhiy Storchaka in
gh-90953
)。
-
asyncio
:
-
collections.abc
: Deprecated
ByteString
. Prefer
Sequence
or
Buffer
. For use in typing, prefer a union, like
bytes | bytearray
,或
collections.abc.Buffer
. (Contributed by Shantanu Jain in
gh-91896
)。
-
email
: Deprecated the
isdst
parameter in
email.utils.localtime()
. (Contributed by Alan Williams in
gh-72346
)。
-
importlib.abc
deprecated classes:
-
importlib.abc.ResourceReader
-
importlib.abc.Traversable
-
importlib.abc.TraversableResources
使用
importlib.resources.abc
classes instead:
(Contributed by Jason R. Coombs and Hugo van Kemenade in
gh-93963
)。
-
itertools
had undocumented, inefficient, historically buggy, and inconsistent support for copy, deepcopy, and pickle operations. This will be removed in 3.14 for a significant reduction in code volume and maintenance burden. (Contributed by Raymond Hettinger in
gh-101588
)。
-
multiprocessing
: The default start method will change to a safer one on Linux, BSDs, and other non-macOS POSIX platforms where
'fork'
is currently the default (
gh-84559
). Adding a runtime warning about this was deemed too disruptive as the majority of code is not expected to care. Use the
get_context()
or
set_start_method()
APIs to explicitly specify when your code
requires
'fork'
。见
上下文和启动方法
.
-
pathlib
:
is_relative_to()
and
relative_to()
: passing additional arguments is deprecated.
-
pkgutil
:
find_loader()
and
get_loader()
现在引发
DeprecationWarning
;使用
importlib.util.find_spec()
instead. (Contributed by Nikita Sobolev in
gh-97850
)。
-
pty
:
-
sqlite3
:
-
typing
:
ByteString
, deprecated since Python 3.9, now causes a
DeprecationWarning
to be emitted when it is used.
-
urllib
:
urllib.parse.Quoter
is deprecated: it was not intended to be a public API. (Contributed by Gregory P. Smith in
gh-88168
)。
Pending Removal in Python 3.15
¶
-
The import system:
-
设置
__cached__
on a module while failing to set
__spec__.cached
is deprecated. In Python 3.15,
__cached__
will cease to be set or take into consideration by the import system or standard library. (
gh-97879
)
-
设置
__package__
on a module while failing to set
__spec__.parent
is deprecated. In Python 3.15,
__package__
will cease to be set or take into consideration by the import system or standard library. (
gh-97879
)
-
ctypes
:
-
http.server
:
-
The obsolete and rarely used
CGIHTTPRequestHandler
has been deprecated since Python 3.13. No direct replacement exists.
Anything
is better than CGI to interface a web server with a request handler.
-
The
--cgi
flag to the
python -m http.server
command-line interface has been deprecated since Python 3.13.
-
locale
:
-
pathlib
:
-
platform
:
-
threading
:
-
RLock()
will take no arguments in Python 3.15. Passing any arguments has been deprecated since Python 3.14, as the Python version does not permit any arguments, but the C version allows any number of positional or keyword arguments, ignoring every argument.
-
types
:
-
typing
:
-
The undocumented keyword argument syntax for creating
NamedTuple
classes (e.g.
Point = NamedTuple("Point", x=int, y=int)
) has been deprecated since Python 3.13. Use the class-based syntax or the functional syntax instead.
-
The
typing.no_type_check_decorator()
decorator function has been deprecated since Python 3.13. After eight years in the
typing
module, it has yet to be supported by any major type checker.
-
wave
:
Pending removal in Python 3.16
¶
-
The import system:
-
array
:
-
asyncio
:
-
builtins
:
-
Bitwise inversion on boolean types,
~True
or
~False
has been deprecated since Python 3.12, as it produces surprising and unintuitive results (
-2
and
-1
). Use
not x
instead for the logical negation of a Boolean. In the rare case that you need the bitwise inversion of the underlying integer, convert to
int
explicitly (
~int(x)
).
-
shutil
:
-
symtable
:
-
sys
:
-
tarfile
:
Pending Removal in Future Versions
¶
The following APIs will be removed in the future, although there is currently no date scheduled for their removal.
-
argparse
: Nesting argument groups and nesting mutually exclusive groups are deprecated.
-
array
’s
'u'
format code (
gh-57281
)
-
builtins
:
-
bool(NotImplemented)
.
-
Generators:
throw(type, exc, tb)
and
athrow(type, exc, tb)
signature is deprecated: use
throw(exc)
and
athrow(exc)
instead, the single argument signature.
-
Currently Python accepts numeric literals immediately followed by keywords, for example
0in x
,
1or x
,
0if 1else 2
. It allows confusing and ambiguous expressions like
[0x1for x in y]
(which can be interpreted as
[0x1 for x in y]
or
[0x1f or x in y]
). A syntax warning is raised if the numeric literal is immediately followed by one of keywords
and
,
else
,
for
,
if
,
in
,
is
and
or
. In a future release it will be changed to a syntax error. (
gh-87999
)
-
支持
__index__()
and
__int__()
method returning non-int type: these methods will be required to return an instance of a strict subclass of
int
.
-
支持
__float__()
method returning a strict subclass of
float
: these methods will be required to return an instance of
float
.
-
支持
__complex__()
method returning a strict subclass of
complex
: these methods will be required to return an instance of
complex
.
-
Delegation of
int()
to
__trunc__()
方法。
-
Passing a complex number as the
real
or
imag
argument in the
complex()
constructor is now deprecated; it should only be passed as a single positional argument. (Contributed by Serhiy Storchaka in
gh-109218
)。
-
calendar
:
calendar.January
and
calendar.February
constants are deprecated and replaced by
calendar.JANUARY
and
calendar.FEBRUARY
. (Contributed by Prince Roshan in
gh-103636
)。
-
codeobject.co_lnotab
:使用
codeobject.co_lines()
method instead.
-
datetime
:
-
utcnow()
: use
datetime.datetime.now(tz=datetime.UTC)
.
-
utcfromtimestamp()
: use
datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)
.
-
gettext
: Plural value must be an integer.
-
importlib
:
-
importlib.metadata
:
-
logging
: the
warn()
method has been deprecated since Python 3.3, use
warning()
代替。
-
mailbox
: Use of StringIO input and text mode is deprecated, use BytesIO and binary mode instead.
-
os
: Calling
os.register_at_fork()
in multi-threaded process.
-
pydoc.ErrorDuringImport
: A tuple value for
exc_info
parameter is deprecated, use an exception instance.
-
re
: More strict rules are now applied for numerical group references and group names in regular expressions. Only sequence of ASCII digits is now accepted as a numerical reference. The group name in bytes patterns and replacement strings can now only contain ASCII letters and digits and underscore. (Contributed by Serhiy Storchaka in
gh-91760
)。
-
sre_compile
,
sre_constants
and
sre_parse
模块。
-
shutil
:
rmtree()
’s
onerror
parameter is deprecated in Python 3.12; use the
onexc
parameter instead.
-
ssl
options and protocols:
-
sysconfig.is_python_build()
check_home
parameter is deprecated and ignored.
-
threading
方法:
-
typing.Text
(
gh-92332
).
-
unittest.IsolatedAsyncioTestCase
: it is deprecated to return a value that is not
None
from a test case.
-
urllib.parse
deprecated functions:
urlparse()
代替
-
splitattr()
-
splithost()
-
splitnport()
-
splitpasswd()
-
splitport()
-
splitquery()
-
splittag()
-
splittype()
-
splituser()
-
splitvalue()
-
to_bytes()
-
urllib.request
:
URLopener
and
FancyURLopener
style of invoking requests is deprecated. Use newer
urlopen()
functions and methods.
-
wsgiref
:
SimpleHandler.stdout.write()
should not do partial writes.
-
xml.etree.ElementTree
: Testing the truth value of an
Element
is deprecated. In a future release it will always return
True
. Prefer explicit
len(elem)
or
elem is not None
tests instead.
-
zipimport.zipimporter.load_module()
is deprecated: use
exec_module()
代替。
移除
¶
ensurepip
¶
-
Remove the bundled setuptools wheel from
ensurepip
, and stop installing setuptools in environments created by
venv
.
pip (>= 22.1)
does not require setuptools to be installed in the environment.
setuptools
-based (and
distutils
-based) packages can still be used with
pip install
, since pip will provide
setuptools
in the build environment it uses for building a package.
easy_install
,
pkg_resources
,
setuptools
and
distutils
are no longer provided by default in environments created with
venv
or bootstrapped with
ensurepip
, since they are part of the
setuptools
package. For projects relying on these at runtime, the
setuptools
project should be declared as a dependency and installed separately (typically, using pip).
(Contributed by Pradyun Gedam in
gh-95299
)。
gzip
¶
-
Remove the
filename
attribute of
gzip
’s
gzip.GzipFile
, deprecated since Python 2.6, use the
name
attribute instead. In write mode, the
filename
attribute added
'.gz'
file extension if it was not present. (Contributed by Victor Stinner in
gh-94196
)。
imp
¶
-
The
imp
module has been removed. (Contributed by Barry Warsaw in
gh-98040
)。
To migrate, consult the following correspondence table:
替换
imp.load_source()
采用:
import importlib.util
import importlib.machinery
def load_source(modname, filename):
loader = importlib.machinery.SourceFileLoader(modname, filename)
spec = importlib.util.spec_from_file_location(modname, filename, loader=loader)
module = importlib.util.module_from_spec(spec)
# The module is always executed and not cached in sys.modules.
# Uncomment the following line to cache the module.
# sys.modules[module.__name__] = module
loader.exec_module(module)
return module
-
移除
imp
functions and attributes with no replacements:
-
Undocumented functions:
-
imp.init_builtin()
-
imp.load_compiled()
-
imp.load_dynamic()
-
imp.load_package()
-
imp.lock_held()
,
imp.acquire_lock()
,
imp.release_lock()
: the locking scheme has changed in Python 3.3 to per-module locks.
-
imp.find_module()
constants:
SEARCH_ERROR
,
PY_SOURCE
,
PY_COMPILED
,
C_EXTENSION
,
PY_RESOURCE
,
PKG_DIRECTORY
,
C_BUILTIN
,
PY_FROZEN
,
PY_CODERESOURCE
,
IMP_HOOK
.
io
¶
-
移除
io
’s
io.OpenWrapper
and
_pyio.OpenWrapper
, deprecated in Python 3.10: just use
open()
instead. The
open()
(
io.open()
) function is a built-in function. Since Python 3.10,
_pyio.open()
is also a static method. (Contributed by Victor Stinner in
gh-94169
)。
sqlite3
¶
-
The following undocumented
sqlite3
features, deprecated in Python 3.10, are now removed:
If a shared cache must be used, open the database in URI mode using the
cache=shared
query parameter.
The
sqlite3.OptimizedUnicode
text factory has been an alias for
str
since Python 3.3. Code that previously set the text factory to
OptimizedUnicode
can either use
str
explicitly, or rely on the default value which is also
str
.
(Contributed by Erlend E. Aasland in
gh-92548
)。
ssl
¶
-
移除
ssl
’s
ssl.RAND_pseudo_bytes()
function, deprecated in Python 3.6: use
os.urandom()
or
ssl.RAND_bytes()
instead. (Contributed by Victor Stinner in
gh-94199
)。
-
Remove the
ssl.match_hostname()
function. It was deprecated in Python 3.7. OpenSSL performs hostname matching since Python 3.7, Python no longer uses the
ssl.match_hostname()
function. (Contributed by Victor Stinner in
gh-94199
)。
-
Remove the
ssl.wrap_socket()
function, deprecated in Python 3.7: instead, create a
ssl.SSLContext
object and call its
ssl.SSLContext.wrap_socket
method. Any package that still uses
ssl.wrap_socket()
is broken and insecure. The function neither sends a SNI TLS extension nor validates the server hostname. Code is subject to
CWE 295
(Improper Certificate Validation). (Contributed by Victor Stinner in
gh-94199
)。
webbrowser
¶
-
Remove support for obsolete browsers from
webbrowser
. The removed browsers include: Grail, Mosaic, Netscape, Galeon, Skipstone, Iceape, Firebird, and Firefox versions 35 and below (
gh-102871
).
xml.etree.ElementTree
¶
-
Remove the
ElementTree.Element.copy()
method of the pure Python implementation, deprecated in Python 3.10, use the
copy.copy()
function instead. The C implementation of
xml.etree.ElementTree
has no
copy()
method, only a
__copy__()
method. (Contributed by Victor Stinner in
gh-94383
)。
其它
¶
-
Remove the
suspicious
rule from the documentation
Makefile
and
Doc/tools/rstlint.py
, both in favor of
sphinx-lint
. (Contributed by Julien Palard in
gh-98179
)。
-
Remove the
keyfile
and
certfile
parameters from the
ftplib
,
imaplib
,
poplib
and
smtplib
modules, and the
key_file
,
cert_file
and
check_hostname
parameters from the
http.client
module, all deprecated since Python 3.6. Use the
context
parameter (
ssl_context
in
imaplib
) instead. (Contributed by Victor Stinner in
gh-94172
)。
-
移除
Jython
compatibility hacks from several stdlib modules and tests. (Contributed by Nikita Sobolev in
gh-99482
)。
-
移除
_use_broken_old_ctypes_structure_semantics_
flag from
ctypes
module. (Contributed by Nikita Sobolev in
gh-99285
)。
Porting to Python 3.12
¶
This section lists previously described changes and other bugfixes that may require changes to your code.
Python API 变化
¶
-
More strict rules are now applied for numerical group references and group names in regular expressions. Only sequence of ASCII digits is now accepted as a numerical reference. The group name in bytes patterns and replacement strings can now only contain ASCII letters and digits and underscore. (Contributed by Serhiy Storchaka in
gh-91760
)。
-
移除
randrange()
functionality deprecated since Python 3.10. Formerly,
randrange(10.0)
losslessly converted to
randrange(10)
. Now, it raises a
TypeError
. Also, the exception raised for non-integer values such as
randrange(10.5)
or
randrange('10')
has been changed from
ValueError
to
TypeError
. This also prevents bugs where
randrange(1e25)
would silently select from a larger range than
randrange(10**25)
. (Originally suggested by Serhiy Storchaka
gh-86388
)。
-
argparse.ArgumentParser
changed encoding and error handler for reading arguments from file (e.g.
fromfile_prefix_chars
option) from default text encoding (e.g.
locale.getpreferredencoding(False)
) 到
文件系统编码和错误处理程序
. Argument files should be encoded in UTF-8 instead of ANSI Codepage on Windows.
-
Remove the
asyncore
-based
smtpd
module deprecated in Python 3.4.7 and 3.5.4. A recommended replacement is the
asyncio
-based
aiosmtpd
PyPI module.
-
shlex.split()
: Passing
None
for
s
argument now raises an exception, rather than reading
sys.stdin
. The feature was deprecated in Python 3.9. (Contributed by Victor Stinner in
gh-94352
)。
-
The
os
module no longer accepts bytes-like paths, like
bytearray
and
memoryview
types: only the exact
bytes
type is accepted for bytes strings. (Contributed by Victor Stinner in
gh-98393
)。
-
syslog.openlog()
and
syslog.closelog()
now fail if used in subinterpreters.
syslog.syslog()
may still be used in subinterpreters, but now only if
syslog.openlog()
has already been called in the main interpreter. These new restrictions do not apply to the main interpreter, so only a very small set of users might be affected. This change helps with interpreter isolation. Furthermore,
syslog
is a wrapper around process-global resources, which are best managed from the main interpreter. (Contributed by Donghee Na in
gh-99127
)。
-
The undocumented locking behavior of
cached_property()
is removed, because it locked across all instances of the class, leading to high lock contention. This means that a cached property getter function could now run more than once for a single instance, if two threads race. For most simple cached properties (e.g. those that are idempotent and simply calculate a value based on other attributes of the instance) this will be fine. If synchronization is needed, implement locking within the cached property getter function or around multi-threaded access points.
-
sys._current_exceptions()
now returns a mapping from thread-id to an exception instance, rather than to a
(typ, exc, tb)
tuple. (Contributed by Irit Katriel in
gh-103176
)。
-
When extracting tar files using
tarfile
or
shutil.unpack_archive()
, pass the
filter
argument to limit features that may be surprising or dangerous. See
Extraction filters
了解细节。
-
The output of the
tokenize.tokenize()
and
tokenize.generate_tokens()
functions is now changed due to the changes introduced in
PEP 701
。这意味着
STRING
tokens are not emitted any more for f-strings and the tokens described in
PEP 701
are now produced instead:
FSTRING_START
,
FSTRING_MIDDLE
and
FSTRING_END
are now emitted for f-string “string” parts in addition to the appropriate tokens for the tokenization in the expression components. For example for the f-string
f"start {1+1} end"
the old version of the tokenizer emitted:
1,0-1,18: STRING 'f"start {1+1} end"'
while the new version emits:
1,0-1,2: FSTRING_START 'f"'
1,2-1,8: FSTRING_MIDDLE 'start '
1,8-1,9: OP '{'
1,9-1,10: NUMBER '1'
1,10-1,11: OP '+'
1,11-1,12: NUMBER '1'
1,12-1,13: OP '}'
1,13-1,17: FSTRING_MIDDLE ' end'
1,17-1,18: FSTRING_END '"'
Additionally, there may be some minor behavioral changes as a consequence of the changes required to support
PEP 701
. Some of these changes include:
-
The
type
attribute of the tokens emitted when tokenizing some invalid Python characters such as
!
has changed from
ERRORTOKEN
to
OP
.
-
Incomplete single-line strings now also raise
tokenize.TokenError
as incomplete multiline strings do.
-
Some incomplete or invalid Python code now raises
tokenize.TokenError
instead of returning arbitrary
ERRORTOKEN
tokens when tokenizing it.
-
Mixing tabs and spaces as indentation in the same file is not supported anymore and will raise a
TabError
.
-
The
threading
module now expects the
_thread
module to have an
_is_main_interpreter
attribute. It is a function with no arguments that returns
True
if the current interpreter is the main interpreter.
Any library or application that provides a custom
_thread
module should provide
_is_main_interpreter()
。(见
gh-112826
)。
构建变化
¶
-
Python no longer uses
setup.py
to build shared C extension modules. Build parameters like headers and libraries are detected in
configure
script. Extensions are built by
Makefile
. Most extensions use
pkg-config
and fall back to manual detection. (Contributed by Christian Heimes in
gh-93939
)。
-
va_start()
with two parameters, like
va_start(args, format),
is now required to build Python.
va_start()
is no longer called with a single parameter. (Contributed by Kumar Aditya in
gh-93207
)。
-
CPython now uses the ThinLTO option as the default link time optimization policy if the Clang compiler accepts the flag. (Contributed by Donghee Na in
gh-89536
)。
-
添加
COMPILEALL_OPTS
variable in
Makefile
to override
compileall
options (default:
-j0
) 在
make install
. Also merged the 3
compileall
commands into a single command to build .pyc files for all optimization levels (0, 1, 2) at once. (Contributed by Victor Stinner in
gh-99289
)。
-
Add platform triplets for 64-bit LoongArch:
-
loongarch64-linux-gnusf
-
loongarch64-linux-gnuf32
-
loongarch64-linux-gnu
(Contributed by Zhang Na in
gh-90656
)。
-
PYTHON_FOR_REGEN
now require Python 3.10 or newer.
-
Autoconf 2.71 and aclocal 1.16.4 is now required to regenerate
!configure
. (Contributed by Christian Heimes in
gh-89886
)。
-
Windows builds and macOS installers from python.org now use OpenSSL 3.0.
C API 变化
¶
新特征
¶
-
PEP 697
: Introduce the
Unstable C API tier
, intended for low-level tools like debuggers and JIT compilers. This API may change in each minor release of CPython without deprecation warnings. Its contents are marked by the
PyUnstable_
prefix in names.
Code object constructors:
Extra storage for code objects (
PEP 523
):
-
PyUnstable_Eval_RequestCodeExtraIndex()
(renamed from
_PyEval_RequestCodeExtraIndex
)
-
PyUnstable_Code_GetExtra()
(renamed from
_PyCode_GetExtra
)
-
PyUnstable_Code_SetExtra()
(renamed from
_PyCode_SetExtra
)
The original names will continue to be available until the respective API changes.
(Contributed by Petr Viktorin in
gh-101101
)。
-
PEP 697
: Add an API for extending types whose instance memory layout is opaque:
(Contributed by Petr Viktorin in
gh-103509
)。
-
Add the new
limited C API
function
PyType_FromMetaclass()
, which generalizes the existing
PyType_FromModuleAndSpec()
using an additional metaclass argument. (Contributed by Wenzel Jakob in
gh-93012
)。
-
API for creating objects that can be called using
the vectorcall protocol
was added to the
Limited API
:
The
Py_TPFLAGS_HAVE_VECTORCALL
flag is now removed from a class when the class’s
__call__()
method is reassigned. This makes vectorcall safe to use with mutable types (i.e. heap types without the immutable flag,
Py_TPFLAGS_IMMUTABLETYPE
). Mutable types that do not override
tp_call
now inherit the
Py_TPFLAGS_HAVE_VECTORCALL
flag. (Contributed by Petr Viktorin in
gh-93274
)。
The
Py_TPFLAGS_MANAGED_DICT
and
Py_TPFLAGS_MANAGED_WEAKREF
flags have been added. This allows extensions classes to support object
__dict__
and weakrefs with less bookkeeping, using less memory and with faster access.
-
API for performing calls using
the vectorcall protocol
was added to the
Limited API
:
This means that both the incoming and outgoing ends of the vector call protocol are now available in the
Limited API
. (Contributed by Wenzel Jakob in
gh-98586
)。
-
Add two new public functions,
PyEval_SetProfileAllThreads()
and
PyEval_SetTraceAllThreads()
, that allow to set tracing and profiling functions in all running threads in addition to the calling one. (Contributed by Pablo Galindo in
gh-93503
)。
-
Add new function
PyFunction_SetVectorcall()
to the C API which sets the vectorcall field of a given
PyFunctionObject
. (Contributed by Andrew Frost in
gh-92257
)。
-
The C API now permits registering callbacks via
PyDict_AddWatcher()
,
PyDict_Watch()
and related APIs to be called whenever a dictionary is modified. This is intended for use by optimizing interpreters, JIT compilers, or debuggers. (Contributed by Carl Meyer in
gh-91052
)。
-
添加
PyType_AddWatcher()
and
PyType_Watch()
API to register callbacks to receive notification on changes to a type. (Contributed by Carl Meyer in
gh-91051
)。
-
添加
PyCode_AddWatcher()
and
PyCode_ClearWatcher()
APIs to register callbacks to receive notification on creation and destruction of code objects. (Contributed by Itamar Oren in
gh-91054
)。
-
添加
PyFrame_GetVar()
and
PyFrame_GetVarString()
functions to get a frame variable by its name. (Contributed by Victor Stinner in
gh-91248
)。
-
添加
PyErr_GetRaisedException()
and
PyErr_SetRaisedException()
for saving and restoring the current exception. These functions return and accept a single exception object, rather than the triple arguments of the now-deprecated
PyErr_Fetch()
and
PyErr_Restore()
. This is less error prone and a bit more efficient. (Contributed by Mark Shannon in
gh-101578
)。
-
添加
_PyErr_ChainExceptions1
, which takes an exception instance, to replace the legacy-API
_PyErr_ChainExceptions
, which is now deprecated. (Contributed by Mark Shannon in
gh-101578
)。
-
添加
PyException_GetArgs()
and
PyException_SetArgs()
as convenience functions for retrieving and modifying the
args
passed to the exception’s constructor. (Contributed by Mark Shannon in
gh-101578
)。
-
添加
PyErr_DisplayException()
, which takes an exception instance, to replace the legacy-api
PyErr_Display()
. (Contributed by Irit Katriel in
gh-102755
).
Porting to Python 3.12
¶
-
Legacy Unicode APIs based on
Py_UNICODE*
representation has been removed. Please migrate to APIs based on UTF-8 or
wchar_t*
.
-
Argument parsing functions like
PyArg_ParseTuple()
doesn’t support
Py_UNICODE*
based format (e.g.
u
,
Z
) anymore. Please migrate to other formats for Unicode like
s
,
z
,
es
,和
U
.
-
tp_weaklist
for all static builtin types is always
NULL
. This is an internal-only field on
PyTypeObject
but we’re pointing out the change in case someone happens to be accessing the field directly anyway. To avoid breakage, consider using the existing public C-API instead, or, if necessary, the (internal-only)
_PyObject_GET_WEAKREFS_LISTPTR()
宏。
-
This internal-only
PyTypeObject.tp_subclasses
may now not be a valid object pointer. Its type was changed to
void
*
to reflect this. We mention this in case someone happens to be accessing the internal-only field directly.
To get a list of subclasses, call the Python method
__subclasses__()
(使用
PyObject_CallMethod()
,例如)。
-
Add support of more formatting options (left aligning, octals, uppercase hexadecimals,
intmax_t
,
ptrdiff_t
,
wchar_t
C strings, variable width and precision) in
PyUnicode_FromFormat()
and
PyUnicode_FromFormatV()
. (Contributed by Serhiy Storchaka in
gh-98836
)。
-
An unrecognized format character in
PyUnicode_FromFormat()
and
PyUnicode_FromFormatV()
now sets a
SystemError
. In previous versions it caused all the rest of the format string to be copied as-is to the result string, and any extra arguments discarded. (Contributed by Serhiy Storchaka in
gh-95781
)。
-
Fix wrong sign placement in
PyUnicode_FromFormat()
and
PyUnicode_FromFormatV()
. (Contributed by Philip Georgi in
gh-95504
)。
-
Extension classes wanting to add a
__dict__
or weak reference slot should use
Py_TPFLAGS_MANAGED_DICT
and
Py_TPFLAGS_MANAGED_WEAKREF
而不是
tp_dictoffset
and
tp_weaklistoffset
, respectively. The use of
tp_dictoffset
and
tp_weaklistoffset
is still supported, but does not fully support multiple inheritance (
gh-95589
), and performance may be worse. Classes declaring
Py_TPFLAGS_MANAGED_DICT
must call
_PyObject_VisitManagedDict()
and
_PyObject_ClearManagedDict()
to traverse and clear their instance’s dictionaries. To clear weakrefs, call
PyObject_ClearWeakRefs()
, as before.
-
The
PyUnicode_FSDecoder()
function no longer accepts bytes-like paths, like
bytearray
and
memoryview
types: only the exact
bytes
type is accepted for bytes strings. (Contributed by Victor Stinner in
gh-98393
)。
-
The
Py_CLEAR
,
Py_SETREF
and
Py_XSETREF
macros now only evaluate their arguments once. If an argument has side effects, these side effects are no longer duplicated. (Contributed by Victor Stinner in
gh-98724
)。
-
The interpreter’s error indicator is now always normalized. This means that
PyErr_SetObject()
,
PyErr_SetString()
and the other functions that set the error indicator now normalize the exception before storing it. (Contributed by Mark Shannon in
gh-101578
)。
-
_Py_RefTotal
is no longer authoritative and only kept around for ABI compatibility. Note that it is an internal global and only available on debug builds. If you happen to be using it then you’ll need to start using
_Py_GetGlobalRefTotal()
.
-
The following functions now select an appropriate metaclass for the newly created type:
Creating classes whose metaclass overrides
tp_new
is deprecated, and in Python 3.14+ it will be disallowed. Note that these functions ignore
tp_new
of the metaclass, possibly allowing incomplete initialization.
注意,
PyType_FromMetaclass()
(added in Python 3.12) already disallows creating classes whose metaclass overrides
tp_new
(
__new__()
in Python).
由于
tp_new
overrides almost everything
PyType_From*
functions do, the two are incompatible with each other. The existing behavior – ignoring the metaclass for several steps of type creation – is unsafe in general, since (meta)classes assume that
tp_new
was called. There is no simple general workaround. One of the following may work for you:
-
If you control the metaclass, avoid using
tp_new
in it:
-
If initialization can be skipped, it can be done in
tp_init
代替。
-
If the metaclass doesn’t need to be instantiated from Python, set its
tp_new
to
NULL
使用
Py_TPFLAGS_DISALLOW_INSTANTIATION
flag. This makes it acceptable for
PyType_From*
函数。
-
Avoid
PyType_From*
functions: if you don’t need C-specific features (slots or setting the instance size), create types by
调用
the metaclass.
-
If you
know
the
tp_new
can be skipped safely, filter the deprecation warning out using
warnings.catch_warnings()
from Python.
-
PyOS_InputHook
and
PyOS_ReadlineFunctionPointer
are no longer called in
subinterpreters
. This is because clients generally rely on process-wide global state (since these callbacks have no way of recovering extension module state).
This also avoids situations where extensions may find themselves running in a subinterpreter that they don’t support (or haven’t yet been loaded in). See
gh-104668
for more info.
-
PyLongObject
has had its internals changed for better performance. Although the internals of
PyLongObject
are private, they are used by some extension modules. The internal fields should no longer be accessed directly, instead the API functions beginning
PyLong_...
should be used instead. Two new
unstable
API functions are provided for efficient access to the value of
PyLongObject
s which fit into a single machine word:
-
Custom allocators, set via
PyMem_SetAllocator()
, are now required to be thread-safe, regardless of memory domain. Allocators that don’t have their own state, including “hooks”, are not affected. If your custom allocator is not already thread-safe and you need guidance then please create a new GitHub issue and CC
@ericsnowcurrently
.
弃用
¶
-
In accordance with
PEP 699
,
ma_version_tag
field in
PyDictObject
is deprecated for extension modules. Accessing this field will generate a compiler warning at compile time. This field will be removed in Python 3.14. (Contributed by Ramvikrams and Kumar Aditya in
gh-101193
. PEP by Ken Jin.)
-
Deprecate global configuration variable:
The
Py_InitializeFromConfig()
API should be used with
PyConfig
instead. (Contributed by Victor Stinner in
gh-77782
)。
-
Creating
immutable types
with mutable bases is deprecated and will be disabled in Python 3.14. (
gh-95388
)
-
The
structmember.h
header is deprecated, though it continues to be available and there are no plans to remove it.
Its contents are now available just by including
Python.h
, with a
Py
prefix added if it was missing:
Several items are not exposed from
Python.h
:
-
T_OBJECT
(使用
Py_T_OBJECT_EX
)
-
T_NONE
(previously undocumented, and pretty quirky)
-
The macro
WRITE_RESTRICTED
which does nothing.
-
宏
RESTRICTED
and
READ_RESTRICTED
, equivalents of
Py_AUDIT_READ
.
-
In some configurations,
<stddef.h>
is not included from
Python.h
. It should be included manually when using
offsetof()
.
The deprecated header continues to provide its original contents under the original names. Your old code can stay unchanged, unless the extra include and non-namespaced macros bother you greatly.
(Contributed in
gh-47146
by Petr Viktorin, based on earlier work by Alexander Belopolsky and Matthias Braun.)
-
PyErr_Fetch()
and
PyErr_Restore()
are deprecated. Use
PyErr_GetRaisedException()
and
PyErr_SetRaisedException()
instead. (Contributed by Mark Shannon in
gh-101578
)。
-
PyErr_Display()
is deprecated. Use
PyErr_DisplayException()
instead. (Contributed by Irit Katriel in
gh-102755
).
-
_PyErr_ChainExceptions
is deprecated. Use
_PyErr_ChainExceptions1
instead. (Contributed by Irit Katriel in
gh-102192
)。
-
使用
PyType_FromSpec()
,
PyType_FromSpecWithBases()
or
PyType_FromModuleAndSpec()
to create a class whose metaclass overrides
tp_new
is deprecated. Call the metaclass instead.
Pending Removal in Python 3.14
¶
Pending Removal in Python 3.15
¶
Pending Removal in Future Versions
¶
The following APIs are deprecated and will be removed, although there is currently no date scheduled for their removal.
移除
¶
-
Remove the
token.h
header file. There was never any public tokenizer C API. The
token.h
header file was only designed to be used by Python internals. (Contributed by Victor Stinner in
gh-92651
)。
-
Legacy Unicode APIs have been removed. See
PEP 623
for detail.
-
Remove the
PyUnicode_InternImmortal()
function macro. (Contributed by Victor Stinner in
gh-85858
)。