Python 3.12 有什麼新功能¶
- 編輯者:
Adam Turner
本文介紹了 Python 3.12 與 3.11 相比多了哪些新功能。 Python 3.12 於 2023 年 10 月 2 日發布。完整詳情請見changelog。
也參考
PEP 693 -- Python 3.12 發佈時程
發布重點摘要¶
Python 3.12 是 Python 程式語言的穩定版本,包含了語言和標準函式庫的綜合變更。標準函式庫的變更主要集中在清理棄用的 API、可用性和正確性。值得注意的是,distutils 套件已從標準函式庫中移除。os 和pathlib 中的檔案系統支援進行了許多改進,並且有數個模組得到更好的效能。
語言變更主要集中在可用性,因為f-字串已經移除了許多限制,並且持續改進 'Did you mean ...' 建議。新的型別參數語法和type 陳述式改進了泛型型別和型別別名在與靜態型別檢查器一起使用上的效率。
這篇文章並不試圖提供所有新功能的完整規格,而是提供一個方便的概覽。完整詳情應參考文件,如標準函式庫參考和語言參考。如果你想了解某個新功能的完整實作和設計理念,請參考該功能的 PEP;但請注意 PEP 通常在功能完全實作後就不再更新。
新增語法特性:
新增語法特性:
直譯器改進:
PEP 669,低影響監控
Improved 'Did you mean ...' suggestionsfor
NameError,ImportError, andSyntaxErrorexceptions
Python 資料模型改進:
PEP 688, using thebuffer protocol from Python
標準函式庫中的顯著改進
pathlib.Path類別現在支援子類別化os模組在 Windows 支援上有了數項改進isinstance()checks againstruntime-checkableprotocolsenjoy a speed up of between two and 20 timesasyncio套件進行了許多效能改進,一些基準測試顯示速度提高了 75%。Due to the changes inPEP 701,producing tokens via the
tokenizemodule is up to 64% faster.
安全性改進:
Replace the builtin
hashlibimplementations ofSHA1, SHA3, SHA2-384, SHA2-512, and MD5 with formally verified code from theHACL* project.These builtin implementations remain as fallbacks that are only used whenOpenSSL does not provide them.
C API 改進:
CPython 實作改進:
PEP 709, comprehension inlining
CPython support for the Linux
perfprofilerImplement stack overflow protection on supported platforms
新增型別特性:
重要的棄用、刪除或限制:
PEP 623: Remove
wstrfrom Unicode objects in Python's C API,reducing the size of everystrobject by at least 8 bytes.PEP 632: Remove the
distutilspackage.Seethe migration guidefor advice replacing the APIs it provided.The third-partySetuptoolspackage continues to providedistutils,if you still require it in Python 3.12 and beyond.gh-95299: Do not pre-install
setuptoolsin virtual environmentscreated withvenv.This means thatdistutils,setuptools,pkg_resources,andeasy_installwill no longer available by default; to access theserunpipinstallsetuptoolsin theactivatedvirtual environment.asynchat、asyncore和imp模組以及幾個unittest.TestCase的方法別名已被刪除。
新增功能¶
PEP 695:型別參數語法¶
Generic classes and functions underPEP 484 were declared using a verbose syntaxthat left the scope of type parameters unclear and required explicit declarations ofvariance.
PEP 695 introduces a new, more compact and explicit way to creategeneric classes andfunctions:
defmax[T](args:Iterable[T])->T:...classlist[T]:def__getitem__(self,index:int,/)->T:...defappend(self,element:T)->None:...
In addition, the PEP introduces a new way to declaretype aliasesusing thetype statement, which creates an instance ofTypeAliasType:
typePoint=tuple[float,float]
型別別名也可以是泛型:
typePoint[T]=tuple[T,T]
The new syntax allows declaringTypeVarTupleandParamSpec parameters, as well asTypeVarparameters with bounds or constraints:
typeIntFunc[**P]=Callable[P,int]# ParamSpectypeLabeledTuple[*Ts]=tuple[str,*Ts]# TypeVarTupletypeHashableSequence[T:Hashable]=Sequence[T]# 帶有邊界的 TypeVartypeIntOrStrSequence[T:(int,str)]=Sequence[T]# 帶有限制的 TypeVar
The value of type aliases and the bound and constraints of type variablescreated through this syntax are evaluated only on demand (seelazy evaluation). This means type aliases are able torefer to other types defined later in the file.
Type parameters declared through a type parameter list are visible within thescope of the declaration and any nested scopes, but not in the outer scope. Forexample, they can be used in the type annotations for the methods of a genericclass or in the class body. However, they cannot be used in the module scope afterthe class is defined. SeeType parameter lists for a detailed description of theruntime semantics of type parameters.
In order to support these scoping semantics, a new kind of scope is introduced,theannotation scope. Annotation scopes behave for themost part like function scopes, but interact differently with enclosing class scopes.In Python 3.13,annotations will also be evaluated inannotation scopes.
詳情請見PEP 695。
(PEP 由 Eric Traut 撰寫。由 Jelle Zijlstra、Eric Traut 和其他人在gh-103764 中實作。)
PEP 701: Syntactic formalization of f-strings¶
PEP 701 lifts some restrictions on the usage off-strings.Expression components inside f-strings can now be any valid Python expression,including strings reusing the same quote as the containing f-string,multi-line expressions, comments, backslashes, and unicode escape sequences.Let's cover these in detail:
Quote reuse: in Python 3.11, reusing the same quotes as the enclosing f-stringraises a
SyntaxError, forcing the user to either use other availablequotes (like using double quotes or triple quotes if the f-string uses singlequotes). In Python 3.12, you can now do things like this:>>>songs=['Take me back to Eden','Alkaline','Ascensionism']>>>f"This is the playlist:{", ".join(songs)}"'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
Note that before this change there was no explicit limit in how f-strings canbe nested, but the fact that string quotes cannot be reused inside theexpression component of f-strings made it impossible to nest f-stringsarbitrarily. In fact, this is the most nested f-string that could be written:
>>>f"""{f'''{f'{f"{1+1}"}'}'''}"""'2'
As now f-strings can contain any valid Python expression inside expressioncomponents, it is now possible to nest f-strings arbitrarily:
>>>f"{f"{f"{f"{f"{f"{1+1}"}"}"}"}"}"'2'
Multi-line expressions and comments: In Python 3.11, f-string expressionsmust be defined in a single line, even if the expression within the f-stringcould normally span multiple lines(like literal lists being defined over multiple lines),making them harder to read. In Python 3.12 you can now define f-stringsspanning multiple lines, and add inline comments:
>>> f"This is the playlist: {", ".join([... 'Take me back to Eden', # My, my, those eyes like fire... 'Alkaline', # Not acid nor alkaline... 'Ascensionism' # Take to the broken skies at last... ])}"'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'Backslashes and unicode characters: before Python 3.12 f-string expressionscouldn't contain any
\character. This also affected unicodeescapesequences (such as\N{snowman}) as these containthe\Npart that previously could not be part of expression components off-strings. Now, you can define expressions like this:>>>print(f"This is the playlist:{"\n".join(songs)}")This is the playlist: Take me back to EdenAlkalineAscensionism>>>print(f"This is the playlist:{"\N{BLACK HEART SUIT}".join(songs)}")This is the playlist: Take me back to Eden♥Alkaline♥Ascensionism
詳情請見PEP 701。
As a positive side-effect of how this feature has been implemented (by parsing f-stringswiththe PEG parser), now error messages for f-strings are more preciseand include the exact location of the error. For example, in Python 3.11, the followingf-string raises aSyntaxError:
>>>my_string=f"{xzy}"+f"{1+1}" File"<stdin>", line1(xzy)^^^SyntaxError:f-string: invalid syntax. Perhaps you forgot a comma?
but the error message doesn't include the exact location of the error within the line andalso has the expression artificially surrounded by parentheses. In Python 3.12, as f-stringsare parsed with the PEG parser, error messages can be more precise and show the entire line:
>>>my_string=f"{xzy}"+f"{1+1}" File"<stdin>", line1my_string=f"{xzy}"+f"{1+1}"^^^SyntaxError:invalid syntax. Perhaps you forgot a comma?
(Contributed by Pablo Galindo, Batuhan Taskaya, Lysandros Nikolaou, CristiánMaureira-Fredes and Marta Gómez ingh-102856. PEP written by Pablo Galindo,Batuhan Taskaya, Lysandros Nikolaou and Marta Gómez).
PEP 684:直譯器各別持有的 GIL¶
PEP 684 引入了直譯器各別持有的GIL,因此子直譯器現在可以使用各個直譯器特有的 GIL 來建立。這使得 Python 程式可以充分利用多個 CPU 核心。目前這僅透過 C-API 使用,不過 Python API預計在 3.13 中釋出。
Use the newPy_NewInterpreterFromConfig() function tocreate an interpreter with its own GIL:
PyInterpreterConfigconfig={.check_multi_interp_extensions=1,.gil=PyInterpreterConfig_OWN_GIL,};PyThreadState*tstate=NULL;PyStatusstatus=Py_NewInterpreterFromConfig(&tstate,&config);if(PyStatus_Exception(status)){return-1;}/* 新的直譯器現在會在目前執行緒中啟用。 */
For further examples how to use the C-API for sub-interpreters with aper-interpreter GIL, seeModules/_xxsubinterpretersmodule.c.
(由 Eric Snow 於gh-104210 等貢獻。)
PEP 669: Low impact monitoring for CPython¶
PEP 669 defines a newAPI 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 supportfor near-zero overhead debuggers and coverage tools.Seesys.monitoring for details.
(由 Mark Shannon 於gh-103082 中貢獻。)
PEP 688:使緩衝區協定可在 Python 中存取¶
PEP 688 introduces a way to use thebuffer protocolfrom Python code. Classes that implement the__buffer__() methodare now usable as buffer types.
The newcollections.abc.Buffer ABC provides a standardway to represent buffer objects, for example in type annotations.The newinspect.BufferFlags enum represents the flags thatcan be used to customize buffer creation.(Contributed by Jelle Zijlstra ingh-102500.)
PEP 709: Comprehension inlining¶
Dictionary, list, and set comprehensions are now inlined, rather than creating anew single-use function object for each execution of the comprehension. Thisspeeds up execution of a comprehension by up to two times.SeePEP 709 for further details.
Comprehension iteration variables remain isolated and don't overwrite avariable of the same name in the outer scope, nor are they visible after thecomprehension. 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
symtablemodule will no longer produce child symbol tables for eachcomprehension; instead, the comprehension's locals will be included in theparent function's symbol table.Calling
locals()inside a comprehension now includes variablesfrom outside the comprehension, and no longer includes the synthetic.0variable for the comprehension "argument".A comprehension iterating directly over
locals()(e.g.[kforkinlocals()]) may see "RuntimeError: dictionary changed size during iteration"when run under tracing (e.g. code coverage measurement). This is the samebehavior already seen in e.g.forkinlocals():. To avoid the error, firstcreate a list of keys to iterate over:keys=list(locals());[kforkinkeys].
(由 Carl Meyer 和 Vladimir Matveev 於PEP 709 中貢獻。)
改善錯誤訊息¶
Modules from the standard library are now potentially suggested as part ofthe error messages displayed by the interpreter when a
NameErrorisraised to the top level. (Contributed by Pablo Galindo ingh-98254.)>>>sys.version_infoTraceback (most recent call last): File"<stdin>", line1, in<module>NameError:name 'sys' is not defined. Did you forget to import 'sys'?
Improve the error suggestion for
NameErrorexceptions for instances.Now if aNameErroris raised in a method and the instance has anattribute that's exactly equal to the name in the exception, the suggestionwill includeself.<NAME>instead of the closest match in the methodscope. (Contributed by Pablo Galindo ingh-99139.)>>>classA:...def__init__(self):...self.blech=1......deffoo(self):...somethin=blech...>>>A().foo()Traceback (most recent call last): File"<stdin>", line1somethin=blech^^^^^NameError:name 'blech' is not defined. Did you mean: 'self.blech'?
Improve the
SyntaxErrorerror message when the user typesimportxfromyinstead offromyimportx. (Contributed by Pablo Galindo ingh-98931.)>>>importa.y.zfromb.y.zTraceback (most recent call last): File"<stdin>", line1importa.y.zfromb.y.z^^^^^^^^^^^^^^^^^^^^^^^SyntaxError:Did you mean to use 'from ... import ...' instead?
ImportErrorexceptions raised from failedfrom<module>import<name>statements now include suggestions for the value of<name>based on theavailable names in<module>. (Contributed by Pablo Galindo ingh-91058.)>>>fromcollectionsimportchainmapTraceback (most recent call last): File"<stdin>", line1, in<module>ImportError:cannot import name 'chainmap' from 'collections'. Did you mean: 'ChainMap'?
型別提示相關的新特性¶
PEP 692: UsingTypedDict for more precise**kwargs typing¶
Typing**kwargs in a function signature as introduced byPEP 484 allowedfor valid annotations only in cases where all of the**kwargs were of thesame type.
PEP 692 specifies a more precise way of typing**kwargs by relying ontyped dictionaries:
fromtypingimportTypedDict,UnpackclassMovie(TypedDict):name:stryear:intdeffoo(**kwargs:Unpack[Movie]):...
詳情請見PEP 692。
(由 Franek Magiera 於gh-103629 中貢獻。)
PEP 698:覆蓋靜態型別的裝飾器¶
A new decoratortyping.override() has been added to thetypingmodule. It indicates to type checkers that the method is intended to overridea method in a superclass. This allows type checkers to catch mistakes wherea method that is intended to override something in a base classdoes not in fact do so.
範例:
fromtypingimportoverrideclassBase:defget_color(self)->str:return"blue"classGoodChild(Base):@override# ok: overrides Base.get_colordefget_color(self)->str:return"yellow"classBadChild(Base):@override# type checker error: does not override Base.get_colordefget_colour(self)->str:return"red"
詳情請見PEP 698。
(由 Steven Troxler 於gh-101561 中貢獻。)
其他語言更動¶
The parser now raises
SyntaxErrorwhen parsing source code containingnull bytes. (Contributed by Pablo Galindo ingh-96670.)A backslash-character pair that is not a valid escape sequence now generatesa
SyntaxWarning, instead ofDeprecationWarning.For example,re.compile("\d+\.\d+")now emits aSyntaxWarning("\d"is an invalid escape sequence, use raw strings for regularexpression:re.compile(r"\d+\.\d+")).In a future Python version,SyntaxErrorwill eventually be raised,instead ofSyntaxWarning.(Contributed by Victor Stinner ingh-98401.)Octal escapes with value larger than
0o377(ex:"\477"), deprecatedin Python 3.11, now produce aSyntaxWarning, instead ofDeprecationWarning.In a future Python version they will be eventually aSyntaxError.(Contributed by Victor Stinner ingh-98401.)Variables used in the target part of comprehensions that are not stored tocan now be used in assignment expressions (
:=).For example, in[(b:=1)fora,b.propinsome_iter], the assignment tobis now allowed. Note that assigning to variables stored to in the targetpart of comprehensions (likea) is still disallowed, as perPEP 572.(Contributed by Nikita Sobolev ingh-100581.)Exceptions raised in a class or type's
__set_name__method are no longerwrapped by aRuntimeError. Context information is added to theexception as aPEP 678 note. (Contributed by Irit Katriel ingh-77757.)When a
try-except*construct handles the entireExceptionGroupand raises one other exception, that exception is no longer wrapped in anExceptionGroup. Also changed in version 3.11.4. (Contributed by IritKatriel ingh-103590.)The Garbage Collector now runs only on the eval breaker mechanism of thePython bytecode evaluation loop instead of object allocations. The GC canalso run when
PyErr_CheckSignals()is called so C extensions thatneed to run for a long time without executing any Python code also have achance to execute the GC periodically. (Contributed by Pablo Galindo ingh-97922.)All builtin and extension callables expecting boolean parameters now acceptarguments of any type instead of just
boolandint.(Contributed by Serhiy Storchaka ingh-60203.)memoryviewnow supports the half-float type (the "e" format code).(Contributed by Donghee Na and Antoine Pitrou ingh-90751.)sliceobjects are now hashable, allowing them to be used as dict keys andset items. (Contributed by Will Bradshaw, Furkan Onder, and Raymond Hettinger ingh-101264.)sum()now uses Neumaier summation to improve accuracy and commutativitywhen summing floats or mixed ints and floats.(Contributed by Raymond Hettinger ingh-100425.)ast.parse()now raisesSyntaxErrorinstead ofValueErrorwhen parsing source code containing null bytes. (Contributed by Pablo Galindoingh-96670.)The extraction methods in
tarfile, andshutil.unpack_archive(),have a new afilter argument that allows limiting tar features than may besurprising or dangerous, such as creating files outside the destinationdirectory.Seetarfile extraction filters for details.In Python 3.14, the default will switch to'data'.(Contributed by Petr Viktorin inPEP 706.)types.MappingProxyTypeinstances are now hashable if the underlyingmapping is hashable.(Contributed by Serhiy Storchaka ingh-87995.)透過新的環境變數
PYTHONPERFSUPPORT和命令列選項-Xperf以及新的sys.activate_stack_trampoline()、sys.deactivate_stack_trampoline()和sys.is_stack_trampoline_active()函式,新增對效能分析器的支援。(由 Pablo Galindo 設計。由 Pablo Galindo 和 Christian Heimes 貢獻,Gregory P. Smith [Google] 和 Mark Shannon 在gh-96123 中也有貢獻。)
新增模組¶
無。
改進的模組¶
array¶
The
array.arrayclass now supports subscripting, making it ageneric type. (Contributed by Jelle Zijlstra ingh-98658.)
asyncio¶
The performance of writing to sockets in
asynciohas beensignificantly improved.asyncionow avoids unnecessary copying whenwriting to sockets and usessendmsg()if the platformsupports it. (Contributed by Kumar Aditya ingh-91166.)Add
asyncio.eager_task_factory()andasyncio.create_eager_task_factory()functions to allow opting an event loop in to eager task execution,making some use-cases 2x to 5x faster.(Contributed by Jacob Bower & Itamar Oren ingh-102853,gh-104140, andgh-104138)On Linux,
asynciousesasyncio.PidfdChildWatcherby defaultifos.pidfd_open()is available and functional instead ofasyncio.ThreadedChildWatcher.(Contributed by Kumar Aditya ingh-98024.)The event loop now uses the best available child watcher for each platform(
asyncio.PidfdChildWatcherif supported andasyncio.ThreadedChildWatcherotherwise), so manuallyconfiguring a child watcher is not recommended.(Contributed by Kumar Aditya ingh-94597.)Addloop_factory parameter to
asyncio.run()to allow specifyinga custom event loop factory.(Contributed by Kumar Aditya ingh-99388.)Add C implementation of
asyncio.current_task()for 4x-6x speedup.(Contributed by Itamar Oren and Pranav Thulasiram Bhat ingh-100344.)asyncio.iscoroutine()now returnsFalsefor generators asasynciodoes not support legacy generator-based coroutines.(Contributed by Kumar Aditya ingh-102748.)asyncio.wait()andasyncio.as_completed()now accepts generatorsyielding tasks.(Contributed by Kumar Aditya ingh-78530.)
calendar¶
Add enums
calendar.Monthandcalendar.Daydefining months of the year and days of the week.(Contributed by Prince Roshan ingh-103636.)
csv¶
Add
csv.QUOTE_NOTNULLandcsv.QUOTE_STRINGSflags toprovide finer grained control ofNoneand empty strings byreaderandwriterobjects.
dis¶
Pseudo instruction opcodes (which are used by the compiler butdo not appear in executable bytecode) are now exposed in the
dismodule.HAVE_ARGUMENTis still relevant to real opcodes,but it is not useful for pseudo instructions. Use the newdis.hasargcollection instead.(Contributed by Irit Katriel ingh-94216.)Add the
dis.hasexccollection to signify instructions that setan exception handler. (Contributed by Irit Katriel ingh-94216.)
fractions¶
Objects of type
fractions.Fractionnow support float-styleformatting. (Contributed by Mark Dickinson ingh-100161.)
importlib.resources¶
importlib.resources.as_file()現在支援資源目錄。(由 Jason R. Coombs 於gh-97930 中貢獻。)將
importlib.resources.files()的第一個參數重新命名為anchor。(由 Jason R. Coombs 於gh-100598 中貢獻。)
inspect¶
新增
inspect.markcoroutinefunction()以標記會回傳coroutine 的同步函式,以供inspect.iscoroutinefunction()使用。(由 Carlton Gibson 於gh-99247 中貢獻。)新增
inspect.getasyncgenstate()和inspect.getasyncgenlocals()以確定非同步產生器的目前狀態。(由 Thomas Krennwallner 於gh-79940 中貢獻。)inspect.getattr_static()的效能已大幅改善。大多數對該函式的呼叫應該比 Python 3.11 中快至少 2 倍。(由 Alex Waygood 於gh-103193 中貢獻。)
itertools¶
新增
itertools.batched()以將元素收集到大小均等的元組中,其中最後一批次可能比其他的少。(由 Raymond Hettinger 於gh-98363 中貢獻。)
math¶
新增
math.sumprod()以計算乘積總和。(由 Raymond Hettinger 於gh-100485 中貢獻。)Extend
math.nextafter()to include asteps argumentfor moving up or down multiple steps at a time. (Contributed byMatthias Goergens, Mark Dickinson, and Raymond Hettinger ingh-94906.)
os¶
Add
os.PIDFD_NONBLOCKto open a file descriptorfor a process withos.pidfd_open()in non-blocking mode.(Contributed by Kumar Aditya ingh-93312.)os.DirEntrynow includes anos.DirEntry.is_junction()method to check if the entry is a junction.(Contributed by Charles Machalow ingh-99547.)Add
os.listdrives(),os.listvolumes()andos.listmounts()functions on Windows for enumerating drives, volumes and mount points.(Contributed by Steve Dower ingh-102519.)os.stat()andos.lstat()are now more accurate on Windows.Thest_birthtimefield will now be filled with the creation timeof the file, andst_ctimeis deprecated but still contains thecreation time (but in the future will return the last metadata change,for consistency with other platforms).st_devmay be up to 64 bitsandst_inoup to 128 bits depending on your file system, andst_rdevis always set to zero rather than incorrect values.Both functions may be significantly faster on newer releases ofWindows. (Contributed by Steve Dower ingh-99726.)
os.path¶
新增
os.path.isjunction()以檢查給定路徑是否為連結點 (junction)。(由 Charles Machalow 於gh-99547 中貢獻。)新增
os.path.splitroot()以將路徑分割為三元組(drive,root,tail)。(由 Barney Gale 於gh-101000 中貢獻。)
pathlib¶
Add support for subclassing
pathlib.PurePathandpathlib.Path, plus their Posix- and Windows-specific variants.Subclasses may override thepathlib.PurePath.with_segments()methodto pass information between path instances.Add
pathlib.Path.walk()for walking the directory trees and generatingall file or directory names within them, similar toos.walk().(Contributed by Stanislav Zmiev ingh-90385.)Addwalk_up optional parameter to
pathlib.PurePath.relative_to()to allow the insertion of..entries in the result; this behavior ismore consistent withos.path.relpath().(Contributed by Domenico Ragusa ingh-84538.)Add
pathlib.Path.is_junction()as a proxy toos.path.isjunction().(Contributed by Charles Machalow ingh-99547.)Addcase_sensitive optional parameter to
pathlib.Path.glob(),pathlib.Path.rglob()andpathlib.PurePath.match()for matchingthe path's case sensitivity, allowing for more precise control over the matching process.
platform¶
Add support for detecting Windows 11 and Windows Server releases past 2012.Previously, lookups on Windows Server platforms newer than Windows Server 2012and on Windows 11 would return
Windows-10.(Contributed by Steve Dower ingh-89545.)
pdb¶
Add convenience variables to hold values temporarily for debug sessionand provide quick access to values like the current frame or the returnvalue.(Contributed by Tian Gao ingh-103693.)
random¶
新增
random.binomialvariate()。(由 Raymond Hettinger 於gh-81620 中貢獻。)將預設值
lambd=1.0加入至random.expovariate()中。(由 Raymond Hettinger 在gh-100234 中貢獻。)
shutil¶
shutil.make_archive()now passes theroot_dir argument to customarchivers which support it.In this case it no longer temporarily changes the current working directoryof the process toroot_dir to perform archiving.(Contributed by Serhiy Storchaka ingh-74696.)shutil.rmtree()now accepts a new argumentonexc which is anerror handler likeonerror but which expects an exception instancerather than a(typ, val, tb) triplet.onerror is deprecated.(Contributed by Irit Katriel ingh-102828.)shutil.which()now consults thePATHEXT environment variable tofind matches withinPATH on Windows even when the givencmd includesa directory component.(Contributed by Charles Machalow ingh-103179.)shutil.which()will callNeedCurrentDirectoryForExePathWwhenquerying for executables on Windows to determine if the current workingdirectory should be prepended to the search path.(Contributed by Charles Machalow ingh-103179.)shutil.which()will return a path matching thecmd with a componentfromPATHEXTprior to a direct match elsewhere in the search path onWindows.(Contributed by Charles Machalow ingh-103179.)
sqlite3¶
Add the
sqlite3.Connection.autocommitattributetosqlite3.Connectionand theautocommit parameter tosqlite3.connect()to controlPEP 249-complianttransaction handling.(Contributed by Erlend E. Aasland ingh-83638.)Addentrypoint keyword-only parameter to
sqlite3.Connection.load_extension(),for overriding the SQLite extension entry point.(Contributed by Erlend E. Aasland ingh-103015.)Add
sqlite3.Connection.getconfig()andsqlite3.Connection.setconfig()tosqlite3.Connectionto make configuration changes to a database connection.(Contributed by Erlend E. Aasland ingh-103489.)
statistics¶
Extend
statistics.correlation()to include as arankedmethodfor computing the Spearman correlation of ranked data.(Contributed by Raymond Hettinger ingh-95861.)
sys¶
Add the
sys.monitoringnamespace to expose the newPEP 669 monitoring API.(Contributed by Mark Shannon ingh-103082.)Add
sys.activate_stack_trampoline()andsys.deactivate_stack_trampoline()for activating and deactivatingstack profiler trampolines,andsys.is_stack_trampoline_active()for querying if stack profilertrampolines are active.(Contributed by Pablo Galindo and Christian Heimeswith contributions from Gregory P. Smith [Google] and Mark Shannoningh-96123.)Add
sys.last_excwhich holds the last unhandled exception thatwas raised (for post-mortem debugging use cases). Deprecate thethree fields that have the same information in its legacy form:sys.last_type,sys.last_valueandsys.last_traceback.(Contributed by Irit Katriel ingh-102778.)sys._current_exceptions()now returns a mapping from thread-id to anexception instance, rather than to a(typ,exc,tb)tuple.(Contributed by Irit Katriel ingh-103176.)sys.setrecursionlimit()andsys.getrecursionlimit().The recursion limit now applies only to Python code. Builtin functions donot use the recursion limit, but are protected by a different mechanismthat prevents recursion from causing a virtual machine crash.
tempfile¶
tempfile.NamedTemporaryFile函式新增了一個選擇性參數delete_on_close (由 Evgeny Zorin 於gh-58451 中貢獻。)tempfile.mkdtemp()現在總是會傳回絕對路徑,即使提供給dir 參數的引數是相對路徑。
threading¶
Add
threading.settrace_all_threads()andthreading.setprofile_all_threads()that allow to set tracing andprofiling functions in all running threads in addition to the calling one.(Contributed by Pablo Galindo ingh-93503.)
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),...]),likecreate_*()methods.(Contributed by Serhiy Storchaka ingh-94473.)
tokenize¶
The
tokenizemodule includes the changes introduced inPEP 701.(Contributed by Marta Gómez Macías and Pablo Galindo ingh-102856.)See移植至 Python 3.12 for more information on thechanges to thetokenizemodule.
types¶
Add
types.get_original_bases()to allow for further introspection of使用者定義泛型型別 when subclassed. (Contributed byJames Hilton-Balfe and Alex Waygood ingh-101827.)
typing¶
isinstance()checks againstruntime-checkableprotocolsnow useinspect.getattr_static()rather thanhasattr()to lookup whetherattributes exist. This means that descriptors and__getattr__()methods are no longer unexpectedly evaluated duringisinstance()checksagainst runtime-checkable protocols. However, it may also mean that someobjects which used to be considered instances of a runtime-checkable protocolmay no longer be considered instances of that protocol on Python 3.12+, andvice versa. Most users are unlikely to be affected by this change.(Contributed by Alex Waygood ingh-102433.)The members of a runtime-checkable protocol are now considered "frozen" atruntime as soon as the class has been created. Monkey-patching attributesonto a runtime-checkable protocol will still work, but will have no impact on
isinstance()checks comparing objects to the protocol. For example:>>>fromtypingimportProtocol,runtime_checkable>>>@runtime_checkable...classHasX(Protocol):...x=1...>>>classFoo:......>>>f=Foo()>>>isinstance(f,HasX)False>>>f.x=1>>>isinstance(f,HasX)True>>>HasX.y=2>>>isinstance(f,HasX)# 沒有改變,即便 HasX 現在有 "y" 屬性True
This change was made in order to speed up
isinstance()checks againstruntime-checkable protocols.The performance profile of
isinstance()checks againstruntime-checkableprotocolshas changedsignificantly. Mostisinstance()checks against protocols with only a fewmembers should be at least 2x faster than in 3.11, and some may be 20xfaster or more. However,isinstance()checks against protocols with manymembers may be slower than in Python 3.11. (Contributed by AlexWaygood ingh-74690 andgh-103193.)All
typing.TypedDictandtyping.NamedTupleclasses now have the__orig_bases__attribute. (Contributed by Adrian Garcia Badaracco ingh-103699.)新增
frozen_default參數至typing.dataclass_transform()。(由 Erik De Bonte 於gh-99957 中貢獻。)
unicodedata¶
The Unicode database has been updated to version 15.0.0. (Contributed byBenjamin Peterson ingh-96734).
unittest¶
新增--durations 命令列選項,顯示 N 個最慢的測試案例:
python3-munittest--durations=3lib.tests.test_threading.....Slowesttestdurations----------------------------------------------------------------------1.210stest_timeout(Lib.test.test_threading.BarrierTests)1.003stest_default_timeout(Lib.test.test_threading.BarrierTests)0.518stest_timeout(Lib.test.test_threading.EventTests)(0.000durationshidden.Use-vtoshowthesedurations.)----------------------------------------------------------------------Ran158testsin9.869sOK(skipped=3)
(由 Giampaolo Rodola 於gh-48330 中貢獻。)
uuid¶
最佳化¶
Remove
wstrandwstr_lengthmembers from Unicode objects.It reduces object size by 8 or 16 bytes on 64bit platform. (PEP 623)(Contributed by Inada Naoki ingh-92536.)Add experimental support for using the BOLT binary optimizer in the buildprocess, which improves performance by 1-5%.(Contributed by Kevin Modzelewski ingh-90536 and tuned by Donghee Na ingh-101525)
Speed up the regular expression substitution (functions
re.sub()andre.subn()and correspondingre.Patternmethods) forreplacement strings containing group references by 2--3 times.(Contributed by Serhiy Storchaka ingh-91524.)透過延遲運算較繁重的字串格式化來加速
asyncio.Task的建立。(由 Itamar Oren 於gh-103793 中貢獻。)The
tokenize.tokenize()andtokenize.generate_tokens()functions areup to 64% faster as a side effect of the changes required to coverPEP 701 inthetokenizemodule. (Contributed by Marta Gómez Macías and Pablo Galindoingh-102856.)Speed up
super()method calls and attribute loads via thenewLOAD_SUPER_ATTRinstruction. (Contributed by Carl Meyer andVladimir Matveev ingh-103497.)
CPython 位元組碼變更¶
移除
LOAD_METHOD指令。它已經合併至LOAD_ATTR。LOAD_ATTR現在會像舊的LOAD_METHOD指令一樣行為,如果其 oparg 的低位元 (low bit) 有被設定。(由 Ken Jin 於gh-93429 中貢獻。)移除
JUMP_IF_FALSE_OR_POP和JUMP_IF_TRUE_OR_POP指令。(由 Irit Katriel 於gh-102859 中貢獻。)移除
PRECALL指令。(由 Mark Shannon 於gh-92925 中貢獻。)新增
BINARY_SLICE和STORE_SLICE指令。(由 Mark Shannon 於gh-94163 中貢獻。)新增
CALL_INTRINSIC_1指令。(由 Mark Shannon 於gh-99005 中貢獻。)新增
CALL_INTRINSIC_2指令。(由 Irit Katriel 於gh-101799 中貢獻。)新增
CLEANUP_THROW指令。(由 Brandt Bucher 於gh-90997 中貢獻。)新增
END_SEND指令。(由 Mark Shannon 於gh-103082 中貢獻。)新增
LOAD_FAST_AND_CLEAR指令作為PEP 709 實作的一部分。(由 Carl Meyer 於gh-101441 中貢獻。)新增
LOAD_FAST_CHECK指令。(由 Dennis Sweeney 於gh-93143 中貢獻。)新增
LOAD_FROM_DICT_OR_DEREF、LOAD_FROM_DICT_OR_GLOBALS和LOAD_LOCALS操作碼作為PEP 695 實作的一部分。移除LOAD_CLASSDEREF操作碼,可以用LOAD_LOCALS加上LOAD_FROM_DICT_OR_DEREF來取代。(由 Jelle Zijlstra 於gh-103764 中貢獻。)新增
LOAD_SUPER_ATTR指令。(由 Carl Meyer 和 Vladimir Matveev 於gh-103497 中貢獻。)新增
RETURN_CONST指令。(由 Wenyang Wang 於gh-101632 中貢獻。)
Demos and Tools¶
Remove the
Tools/demo/directory which contained old demo scripts. A copycan be found in theold-demos project.(Contributed by Victor Stinner ingh-97681.)Remove outdated example scripts of the
Tools/scripts/directory.A copy can be found in theold-demos project.(Contributed by Victor Stinner ingh-97669.)
已棄用¶
argparse:argparse.BooleanOptionalAction的type、choices 和metavar 參數已被棄用,將在 3.14 中移除。 (由 Nikita Sobolev 於gh-92248 貢獻。)ast:以下ast功能自 Python 3.8 起已在文件中被棄用,現在在存取或使用時會在 runtime 發出DeprecationWarning,並將在 Python 3.14 中移除:ast.Numast.Strast.Bytesast.NameConstantast.Ellipsis
請改用
ast.Constant。(由 Serhiy Storchaka 於gh-90953 貢獻。)已棄用並將在 Python 3.14 中移除的 child watcher 類別:
asyncio.MultiLoopChildWatcher、asyncio.FastChildWatcher、asyncio.AbstractChildWatcher和asyncio.SafeChildWatcher。 (由 Kumar Aditya 於gh-94597 貢獻。)asyncio.set_child_watcher()、asyncio.get_child_watcher()、asyncio.AbstractEventLoopPolicy.set_child_watcher()和asyncio.AbstractEventLoopPolicy.get_child_watcher()已被棄用並將在 Python 3.14 中移除。(由 Kumar Aditya 於gh-94597 貢獻。)預設事件迴圈策略的
get_event_loop()方法現在會在沒有設定目前事件迴圈且決定建立一個時發出DeprecationWarning。 (由 Serhiy Storchaka 和 Guido van Rossum 於gh-100160 貢獻。)
calendar:calendar.January和calendar.February常數已被棄用並被calendar.JANUARY和calendar.FEBRUARY取代。 (由 Prince Roshan 於gh-103636 貢獻。)collections.abc:棄用collections.abc.ByteString。使用
isinstance(obj,collections.abc.Buffer)來測試obj是否在 runtime 實作了緩衝區協定。在型別註解的使用中,請用Buffer或明確指定你的程式碼所支援型別的聯集(例如bytes|bytearray|memoryview)。ByteString最初被設計為一個抽象類別,以作為bytes和bytearray的超型別 (supertype)。然而由於 ABC 從未擁有任何方法,知道一個物件是ByteString的實例從未真正告訴你任何關於該物件的有用資訊。其他常見的緩衝區型別如memoryview也從未被理解為ByteString的子型別(無論是在 runtime 還是由靜態型別檢查器)。datetime:datetime.datetime'sutcnow()andutcfromtimestamp()are deprecated and will beremoved in a future version. Instead, use timezone-aware objects to representdatetimes in UTC: respectively, callnow()andfromtimestamp()with thetz parameter set todatetime.UTC.(Contributed by Paul Ganssle ingh-103857.)email:棄用email.utils.localtime()中的isdst 參數。(由 Alan Williams 於gh-72346 中貢獻。)importlib.abc:棄用下列類別,預定於 Python 3.14 中移除:importlib.abc.ResourceReaderimportlib.abc.Traversableimportlib.abc.TraversableResources
請改用
importlib.resources.abc類別:(由 Jason R. Coombs 和 Hugo van Kemenade 貢獻於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 codevolume and maintenance burden.(Contributed by Raymond Hettinger ingh-101588.)multiprocessing: In Python 3.14, the defaultmultiprocessingstart method will change to a safer one on Linux, BSDs,and other non-macOS POSIX platforms where'fork'is currentlythe default (gh-84559). Adding a runtime warning about this was deemed toodisruptive as the majority of code is not expected to care. Use theget_context()orset_start_method()APIs to explicitly specify whenyour coderequires'fork'. Seecontexts and start methods.pkgutil:pkgutil.find_loader()和pkgutil.get_loader()已被棄用並將在 Python 3.14 中移除;請改用importlib.util.find_spec()。(由 Nikita Sobolev 於gh-97850 中貢獻。)pty: The module has two undocumentedmaster_open()andslave_open()functions that have been deprecated since Python 2 but only gained aproperDeprecationWarningin 3.12. Remove them in 3.14.(Contributed by Soumendra Ganguly and Gregory P. Smith ingh-85984.)os:The
st_ctimefields return byos.stat()andos.lstat()onWindows are deprecated. In a future release, they will contain the lastmetadata change time, consistent with other platforms. For now, they stillcontain the creation time, which is also available in the newst_birthtimefield. (Contributed by Steve Dower ingh-99726.)On POSIX platforms,
os.fork()can now raise aDeprecationWarningwhen it can detect being called from amultithreaded process. There has always been a fundamental incompatibilitywith the POSIX platform when doing so. Even if such codeappeared to work.We added the warning to raise awareness as issues encountered by code doingthis are becoming more frequent. See theos.fork()documentation formore details along withthis discussion on fork being incompatible with threads forwhy we're now surfacing thislongstanding platform compatibility problem to developers.
When this warning appears due to usage of
multiprocessingorconcurrent.futuresthe fix is to use a differentmultiprocessingstart method such as"spawn"or"forkserver".shutil:shutil.rmtree()的onerror 引數已被棄用,請改用onexc。(由 Irit Katriel 於gh-102828 中貢獻。)default adapters and converters are now deprecated.Instead, use theAdapter and converter recipesand tailor them to your needs.(Contributed by Erlend E. Aasland ingh-90016.)
In
execute(),DeprecationWarningis now emittedwhennamed placeholders are used together withparameters supplied as asequence instead of as adict.Starting from Python 3.14, using named placeholders with parameters suppliedas a sequence will raise aProgrammingError.(Contributed by Erlend E. Aasland ingh-101698.)
sys:sys.last_type、sys.last_value和sys.last_traceback欄位已被棄用。請改用sys.last_exc。(由 Irit Katriel 於gh-102778 中貢獻。)tarfile: Extracting tar archives without specifyingfilter is deprecated untilPython 3.14, when'data'filter will become the default.See解壓縮篩選器 for details.typing.Hashableandtyping.Sized, aliases forcollections.abc.Hashableandcollections.abc.Sizedrespectively, aredeprecated. (gh-94309.)自 Python 3.9 起已被棄用的
typing.ByteString現在在使用時會發出DeprecationWarning。(由 Alex Waygood 於gh-91896 中貢獻。)
xml.etree.ElementTree: The module now emitsDeprecationWarningwhen testing the truth value of anxml.etree.ElementTree.Element.Before, the Python implementation emittedFutureWarning, and the Cimplementation emitted nothing.(Contributed by Jacob Walls ingh-83122.)The 3-arg signatures (type, value, traceback) of
coroutinethrow(),generatorthrow()andasyncgeneratorthrow()are deprecated andmay be removed in a future version of Python. Use the single-arg versionsof these functions instead. (Contributed by Ofey Chan ingh-89874.)DeprecationWarningis now raised when__package__on amodule differs from__spec__.parent(previouslyit wasImportWarning).(Contributed by Brett Cannon ingh-65961.)Setting
__package__or__cached__on amodule is deprecated, and will cease to be set or taken into consideration bythe import system in Python 3.14. (Contributed by Brett Cannon ingh-65961.)The bitwise inversion operator (
~) on bool is deprecated. It will throw anerror in Python 3.16. Usenotfor logical negation of bools instead.In the rare case that you really need the bitwise inversion of the underlyingint, convert to int explicitly:~int(x). (Contributed by Tim Hoffmanningh-103487.)自 3.10 起,於程式碼物件存取
co_lnotab的功能已在PEP 626 中被棄用,但只在 3.12 中於適時發出DeprecationWarning。可能在 3.15 中移除。(由 Nikita Sobolev 於gh-101866 貢獻。)
Python 3.13 中待移除的項目¶
模組(請見PEP 594):
aifcaudioopcgicgitbchunkcryptimghdrmailcapmsilibnisnntplibossaudiodevpipessndhdrspwdsunautelnetlibuuxdrlib
其他模組:
lib2to3和2to3 程式 (gh-84540)
API:
configparser.LegacyInterpolation(gh-90765)locale.resetlocale()(gh-90817)turtle.RawTurtle.settiltangle()(gh-50096)unittest.findTestCases()(gh-50096)unittest.getTestCaseNames()(gh-50096)unittest.makeSuite()(gh-50096)unittest.TestProgram.usageExit()(gh-67048)webbrowser.MacOSX(gh-86421)classmethod描述器鏈接 (gh-89519)
Python 3.14 中待移除的項目¶
argparse:argparse.BooleanOptionalAction的type、choices 和metavar 參數已被棄用,將在 3.14 中移除。 (由 Nikita Sobolev 於gh-92248 貢獻。)ast:自 Python 3.8 起,下列功能已在文件中被棄用,現在在存取或使用時會於 runtime 發出DeprecationWarning,並將在 Python 3.14 中移除:ast.Numast.Strast.Bytesast.NameConstantast.Ellipsis
請改用
ast.Constant。(由 Serhiy Storchaka 於gh-90953 貢獻。)已棄用並將在 Python 3.14 中移除的 child watcher 類別:
asyncio.MultiLoopChildWatcher、asyncio.FastChildWatcher、asyncio.AbstractChildWatcher和asyncio.SafeChildWatcher。 (由 Kumar Aditya 於gh-94597 貢獻。)asyncio.set_child_watcher()、asyncio.get_child_watcher()、asyncio.AbstractEventLoopPolicy.set_child_watcher()和asyncio.AbstractEventLoopPolicy.get_child_watcher()已被棄用並將在 Python 3.14 中移除。(由 Kumar Aditya 於gh-94597 貢獻。)預設事件迴圈策略的
get_event_loop()方法現在會在沒有設定目前事件迴圈且決定建立一個時發出DeprecationWarning。 (由 Serhiy Storchaka 和 Guido van Rossum 於gh-100160 貢獻。)
email:已棄用email.utils.localtime()中的isdst 參數。(由 Alan Williams 於gh-72346 貢獻。)importlib.abc的已棄用類別:importlib.abc.ResourceReaderimportlib.abc.Traversableimportlib.abc.TraversableResources
請改用
importlib.resources.abc類別:(由 Jason R. Coombs 和 Hugo van Kemenade 貢獻於gh-93963。)
itertools有不以文件記錄、效率低下、過去常有 bug 且不一致的 copy、deepcopy 和 pickle 操作支援。將在 3.14 中移除以大幅減少程式碼量和維護負擔。 (由 Raymond Hettinger 於gh-101588 貢獻。)multiprocessing:預設的啟動方法將在 Linux、BSD 和其他非 macOS POSIX 平台上更改為更安全的 方法,目前'fork'是預設值 (gh-84559)。對此增加一個 runtime 警告被認為太過擾人,因為 大多數程式碼不會在意。請使用get_context()或set_start_method()API 來明確指定你的程式碼何時需要'fork'。請參閱Contexts and start methods。pathlib:已棄用is_relative_to()和relative_to():額外引數的傳遞已被棄用。pkgutil:pkgutil.find_loader()和pkgutil.get_loader()現在會引發DeprecationWarning;請改用importlib.util.find_spec()。 (由 Nikita Sobolev 於gh-97850 貢獻。)pty:master_open():請用pty.openpty()。slave_open():請用pty.openpty()。
version和version_info。execute()和executemany(),如果使用named placeholders 且parameters 是序列而不是dict。
urllib:urllib.parse.Quoter已被棄用:它並非預期的公開 API。(由 Gregory P. Smith 於gh-88168 貢獻。)
Python 3.15 中待移除的項目¶
引入系統 (import system):
在模組上設定
__cached__而沒有設定__spec__.cached的做法已被棄用。在 Python 3.15 中,引入系統或標準函式庫將不再設定或考慮__cached__。(gh-97879)在模組上設定
__package__而沒有設定__spec__.parent的做法已被棄用。在 Python 3.15 中,引入系統或標準函式庫將不再設定或考慮__package__。(gh-97879)
自 Python 3.13 起,未記錄的
ctypes.SetPointerType()函式已被棄用。
過時且很少使用的
CGIHTTPRequestHandler自 Python 3.13 起已被棄用。不存在直接的替代。任何東西都比 CGI 更好地將 Web 伺服器與請求處理程序介接起來。自 Python 3.13 起,python -m http.server 命令列介面的
--cgi旗標已被棄用。
load_module()method:請改用exec_module()。
getdefaultlocale()已在 Python 3.11 中被棄用,原本計劃在 Python 3.13 中移除 (gh-90817),但被延後至 Python 3.15。請改用getlocale()、setlocale()和getencoding()。 (由 Hugo van Kemenade 於gh-111187 貢獻。)
PurePath.is_reserved()已自 Python 3.13 被棄用。請用os.path.isreserved()來偵測 Windows 上的保留路徑。
自 Python 3.13 起,
java_ver()已被棄用。此函式僅對 Jython 支援有用,具有令人困惑的 API,基本上未經測試。
sysconfig.is_python_build()的check_home 引數自 Python 3.12 起已被棄用。
RLock()在 Python 3.15 中將不接受任何引數。自 Python 3.14 起,傳遞任何引數的用法已被棄用,因為 Python 版本不允許任何引數,但 C 版本允許任意數量的位置或關鍵字引數,並忽略每個引數。
types.CodeType:自 3.10 起,存取co_lnotab已在PEP 626 中被棄用,並計劃在 3.12 中移除,但只在 3.12 中於適當時發出DeprecationWarning。可能在 3.15 中移除。(由 Nikita Sobolev 於gh-101866 貢獻。)
用於建立
NamedTuple類別的未以文件記錄之關鍵字引數語法 (Point=NamedTuple("Point",x=int,y=int)) 已自 Python 3.13 棄用。請改用基於類別的語法或函式語法 (functional syntax)。當使用
TypedDict的函式語法時,未傳遞值給fields 參數 (TD=TypedDict("TD")) 或傳遞None(TD=TypedDict("TD",None)) 的做法自 Python 3.13 起已被棄用。請使用classTD(TypedDict):pass或TD=TypedDict("TD",{})來建立具有零個欄位的 TypedDict。自 Python 3.13 起,
typing.no_type_check_decorator()裝飾器函式已被棄用。在typing模組中使用了八年之後,它尚未得到任何主要型別檢查器的支援。
wave:已棄用
Wave_read和Wave_write類別的getmark()、setmark()和getmarkers()方法自 Python 3.13 被棄用。
load_module()自 Python 3.10 被棄用。請改用exec_module()。(由 Jiahao Li 於gh-125746 貢獻。)
Python 3.16 中待移除的項目¶
引入系統 (import system):
在模組上設定
__loader__而沒有設定__spec__.loader的做法將於 Python 3.16 被棄用。在 Python 3.16 中,引入系統或標準函式庫將不再設定或考慮__loader__。
自 Python 3.3 起,
'u'格式碼 (wchar_t) 在文件中已被棄用,自 Python 3.13 起在 runtime 已被棄用。請使用'w'格式碼 (Py_UCS4) 來取代 Unicode 字元。
asyncio.iscoroutinefunction()已被棄用並將在 Python 3.16 中移除;請改用inspect.iscoroutinefunction()。(由 Jiahao Li 和 Kumar Aditya 於gh-122875 貢獻。)asyncio策略系統已被棄用並將在 Python 3.16 中移除。特別是以下類別和函式已被棄用:使用者應該使用
asyncio.run()或asyncio.Runner搭配loop_factory 來使用所需的事件迴圈實作。例如在 Windows 上使用
asyncio.SelectorEventLoop:importasyncioasyncdefmain():...asyncio.run(main(),loop_factory=asyncio.SelectorEventLoop)
(由 Kumar Aditya 於gh-127949 貢獻。)
自 Python 3.12 起,布林型別的位元反轉
~True或~False已被棄用,因為它會產生不預期且不直觀的結果(-2和-1)。使用notx代替布林值的邏輯否定。在極少數情況下,你需要對底層的整數進行位元反轉,請明確轉換為~int(x)(~int(x))。
自 Python 3.14 起,使用function 或sequence 關鍵字引數呼叫
functools.reduce()的 Python 實作已被棄用。
對具有strm 引數的自訂日誌記錄處理函式的支援已被棄用,並計劃在 Python 3.16 中移除。請改用stream 引數。(由 Mariusz Felisiak 於gh-115032 貢獻。)
有效的副檔名以 '.' 開頭或對
mimetypes.MimeTypes.add_type()為空字串。未加點的副檔名已被棄用,並將在 Python 3.16 中引發ValueError。(由 Hugo van Kemenade 於gh-75223 貢獻。)
自 Python 3.14 起,
ExecError例外已被棄用。自 Python 3.4 以來,它尚未被shutil中的任何函式使用,現在是RuntimeError的別名。
自 Python 3.14 起,
Class.get_methods方法已被棄用。
sys:自 Python 3.13 起,
_enablelegacywindowsfsencoding()函式已被棄用。請改用PYTHONLEGACYWINDOWSFSENCODING環境變數。
自 Python 3.14 起,
sysconfig.expand_makefile_vars()函式已被棄用。請改用sysconfig.get_paths()的vars引數。
自 Python 3.13 起,未以文件記錄和未被使用的
TarFile.tarfile屬性已被棄用。
Python 3.17 中待移除的項目¶
collections.abc.ByteString預計在 Python 3.17 中移除。使用
isinstance(obj,collections.abc.Buffer)來測試obj是否在 runtime 實作了緩衝區協定。在型別註解的使用中,請用Buffer或明確指定你的程式碼所支援型別的聯集(例如bytes|bytearray|memoryview)。ByteString最初被設計為一個抽象類別,以作為bytes和bytearray的超型別 (supertype)。然而由於 ABC 從未擁有任何方法,知道一個物件是ByteString的實例從未真正告訴你任何關於該物件的有用資訊。其他常見的緩衝區型別如memoryview也從未被理解為ByteString的子型別(無論是在 runtime 還是由靜態型別檢查器)。
在 Python 3.14 之前,舊式聯集是使用私有類別
typing._UnionGenericAlias實作的。這個類別不再被需要,但為了向後相容性而保留,並計劃將在 Python 3.17 中移除。使用者應該改用文件中記錄的內省輔助函式,例如typing.get_origin()和typing.get_args(),或者依賴私有實作細節。typing.ByteString自 Python 3.9 起已被棄用,預計在 Python 3.17 中移除。使用
isinstance(obj,collections.abc.Buffer)來測試obj是否在 runtime 實作了緩衝區協定。在型別註解的使用中,請用Buffer或明確指定你的程式碼所支援型別的聯集(例如bytes|bytearray|memoryview)。ByteString最初被設計為一個抽象類別,以作為bytes和bytearray的超型別 (supertype)。然而由於 ABC 從未擁有任何方法,知道一個物件是ByteString的實例從未真正告訴你任何關於該物件的有用資訊。其他常見的緩衝區型別如memoryview也從未被理解為ByteString的子型別(無論是在 runtime 還是由靜態型別檢查器)。
未來版本中的待移除項目¶
以下 API 將在未來被移除,雖然目前尚未安排移除日期。
巢狀引數群組和巢狀互斥群組已被棄用。
將未以文件記錄的關鍵字引數prefix_chars 傳遞給
add_argument_group()的做法現在已被棄用。argparse.FileType型別轉換器已被棄用。
產生器:
throw(type,exc,tb)和athrow(type,exc,tb)簽名已被棄用:請改用throw(exc)和athrow(exc),為單引數簽名。目前 Python 接受數值字面值後面立即接關鍵字,例如
0inx、1orx、0if1else2。它讓運算式模糊且容易混淆,如[0x1forxiny](可以解釋為[0x1forxiny]或[0x1forxiny])。如果數值字面值後立即接and、else、for、if、in、is和or之一的關鍵字,則會引發語法警告。在未來版本中,它將被更改為語法錯誤。(gh-87999)__index__()和__int__()方法回傳非 int 型別的支援:這些方法將需要回傳int的嚴格子類別實例。將
int()委派給__trunc__()方法。在
complex()建構子中將複數作為real 或imag 引數傳遞現在已被棄用;它應該只作為單個位置引數傳遞。 (由 Serhiy Storchaka 於gh-109218 貢獻。)
calendar:calendar.January和calendar.February常數已被棄用並被calendar.JANUARY和calendar.FEBRUARY取代。 (由 Prince Roshan 於gh-103636 貢獻。)codecs:請改用open()而非codecs.open()。(gh-133038)utcnow():請改用datetime.datetime.now(tz=datetime.UTC)。utcfromtimestamp():請改用datetime.datetime.fromtimestamp(timestamp,tz=datetime.UTC)。
gettext:複數值必須是整數。cache_from_source()debug_override 參數已被棄用:請改用optimization 參數。
EntryPoints元組介面。回傳值上的隱式
None。
mailbox:已棄用 StringIO 輸入和文本模式,請改用 BytesIO 和二進位模式。os:在多執行緒行程中呼叫os.register_at_fork()。pydoc.ErrorDuringImport:exc_info 參數的元組值已被棄用,請用例外實例。re:現在對正規表示式中的數值群組參照和群組名稱用了更嚴格的規則。現在只有 ASCII 數碼序列被接受作為數值參照。位元組模式和替換字串中的群組名稱現在只能包含 ASCII 字母、數碼和底線。(由 Serhiy Storchaka 於gh-91760 貢獻。)sre_compile、sre_constants和sre_parse模組。ssl選項和協定:不帶協定引數的
ssl.SSLContext已被棄用。ssl.SSLContext:set_npn_protocols()和selected_npn_protocol()已被棄用:請改用 ALPN。ssl.OP_NO_SSL*選項ssl.OP_NO_TLS*選項ssl.PROTOCOL_SSLv3ssl.PROTOCOL_TLSssl.PROTOCOL_TLSv1ssl.PROTOCOL_TLSv1_1ssl.PROTOCOL_TLSv1_2ssl.TLSVersion.SSLv3ssl.TLSVersion.TLSv1ssl.TLSVersion.TLSv1_1
threading方法:threading.Condition.notifyAll():請用notify_all()。threading.Event.isSet():請用is_set()。threading.Thread.isDaemon()、threading.Thread.setDaemon():請用threading.Thread.daemon屬性。threading.Thread.getName()、threading.Thread.setName():請用threading.Thread.name屬性。threading.currentThread():請用threading.current_thread()。threading.activeCount():請用threading.active_count()。
內部類別
typing._UnionGenericAlias不再用於實作typing.Union。為了保持與此私有類別使用者的相容性,直到至少 Python 3.17 都將提供一個相容性 shim。(由 Jelle Zijlstra 於gh-105499 貢獻。)unittest.IsolatedAsyncioTestCase:從測試案例中回傳非None的值已被棄用。urllib.parse已棄用函式:請改用urlparse()。splitattr()splithost()splitnport()splitpasswd()splitport()splitquery()splittag()splittype()splituser()splitvalue()to_bytes()
wsgiref:SimpleHandler.stdout.write()不應該進行部分寫入。xml.etree.ElementTree:已棄用對Element的真值測試。在未來版本中,它將始終回傳True。請改用明確的len(elem)或elemisnotNone測試。sys._clear_type_cache()已被棄用:請改用sys._clear_internal_caches()。
已移除¶
asynchat 和 asyncore¶
configparser¶
根據gh-89336,已移除了在 3.2 中被
configparser棄用的幾個名稱:configparser.ParsingError不再具有filename屬性或引數。請改用source屬性和引數。configparser不再具有SafeConfigParser類別。請改用較短的ConfigParser名稱。configparser.ConfigParser不再具有readfp方法。請改用read_file()。
distutils¶
ensurepip¶
Remove the bundled setuptools wheel from
ensurepip,and stop installing setuptools in environments created byvenv.pip(>=22.1)does not require setuptools to be installed in theenvironment.setuptools-based (anddistutils-based) packagescan still be used withpipinstall, since pip will providesetuptoolsin the build environment it uses for building apackage.easy_install,pkg_resources,setuptoolsanddistutilsare no longer provided by default in environments created withvenvor bootstrapped withensurepip, since they are part ofthesetuptoolspackage. For projects relying on these at runtime,thesetuptoolsproject should be declared as a dependency andinstalled separately (typically, using pip).(由 Pradyun Gedam 於gh-95299 中貢獻。)
enum¶
移除
enum的EnumMeta.__getattr__,對於列舉屬性的存取不再會需要它。
ftplib¶
gzip¶
Remove the
filenameattribute ofgzip'sgzip.GzipFile,deprecated since Python 2.6, use thenameattributeinstead. In write mode, thefilenameattribute added'.gz'fileextension if it was not present.(Contributed by Victor Stinner ingh-94196.)
hashlib¶
Remove the pure Python implementation of
hashlib'shashlib.pbkdf2_hmac(), deprecated in Python 3.10. Python 3.10 andnewer requires OpenSSL 1.1.1 (PEP 644): this OpenSSL version providesa C implementation ofpbkdf2_hmac()which is faster.(Contributed by Victor Stinner ingh-94199.)
importlib¶
現已完成清理
importlib中許多過去已經棄用的東西:對
module_repr()的參照和支援已刪除。(由 Barry Warsaw 在gh-97850 中貢獻。)importlib.util.set_package、importlib.util.set_loader和importlib.util.module_for_loader已全部刪除。(由 Brett Cannon 和 Nikita Sobolev 在gh-65961 和gh-97850 貢獻。)對
find_loader()和find_module()API 的支援已被刪除。(由 Barry Warsaw 在gh-98040 中貢獻。)importlib.abc.Finder、pkgutil.ImpImporter和pkgutil.ImpLoader已被刪除。(由 Barry Warsaw 在gh-98040 中貢獻。)
imp¶
imp模組已被移除。(由 Barry Warsaw 在gh-98040 中貢獻。)要遷移的話請參考以下對應表:
imp
importlib
imp.NullImporter將
None插入sys.path_importer_cacheimp.cache_from_source()imp.find_module()imp.get_magic()imp.get_suffixes()importlib.machinery.SOURCE_SUFFIXES、importlib.machinery.EXTENSION_SUFFIXES和importlib.machinery.BYTECODE_SUFFIXESimp.get_tag()imp.load_module()imp.new_module(name)types.ModuleType(name)imp.reload()imp.source_from_cache()imp.load_source()見下文
用以下取代
imp.load_source():importimportlib.utilimportimportlib.machinerydefload_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)# 此模組都會被執行且不會被快取於 sys.modules。# 要快取模組的話可以把下面一行取消註解# sys.modules[module.__name__] = moduleloader.exec_module(module)returnmodule
移除
imp函式和屬性、沒有替代方案:未以文件記錄的函式:
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()常數:SEARCH_ERROR、PY_SOURCE、PY_COMPILED、C_EXTENSION、PY_RESOURCE、PKG_DIRECTORY、C_BUILTIN、PY_FROZEN、PY_CODERESOURCE、IMP_HOOK。
io¶
locale¶
Remove
locale'slocale.format()function, deprecated in Python 3.7:uselocale.format_string()instead.(Contributed by Victor Stinner ingh-94226.)
smtpd¶
sqlite3¶
以下未以文件記錄的
sqlite3功能已在 Python 3.10 中被棄用、現在已被移除:sqlite3.enable_shared_cache()sqlite3.OptimizedUnicode
If a shared cache must be used, open the database in URI mode using the
cache=sharedquery parameter.The
sqlite3.OptimizedUnicodetext factory has been an alias forstrsince Python 3.3. Code that previously set the text factory toOptimizedUnicodecan either usestrexplicitly, or rely on thedefault value which is alsostr.(由 Erlend E. Aasland 於gh-92548 中貢獻。)
ssl¶
Remove
ssl'sssl.RAND_pseudo_bytes()function, deprecated in Python 3.6:useos.urandom()orssl.RAND_bytes()instead.(Contributed by Victor Stinner ingh-94199.)Remove the
ssl.match_hostname()function.It was deprecated in Python 3.7. OpenSSL performshostname matching since Python 3.7, Python no longer uses thessl.match_hostname()function.(Contributed by Victor Stinner ingh-94199.)Remove the
ssl.wrap_socket()function, deprecated in Python 3.7:instead, create assl.SSLContextobject and call itsssl.SSLContext.wrap_socketmethod. Any package that still usesssl.wrap_socket()is broken and insecure. The function neither sends aSNI TLS extension nor validates the server hostname. Code is subject toCWE 295(Improper Certificate Validation).(Contributed by Victor Stinner ingh-94199.)
unittest¶
移除許多
unittest中被棄用已久的功能:許多
TestCase方法別名:已棄用的別名
方法名稱
已棄用於
failUnless3.1
failIf3.1
failUnlessEqual3.1
failIfEqual3.1
failUnlessAlmostEqual3.1
failIfAlmostEqual3.1
failUnlessRaises3.1
assert_3.2
assertEquals3.2
assertNotEquals3.2
assertAlmostEquals3.2
assertNotAlmostEquals3.2
assertRegexpMatches3.2
assertRaisesRegexp3.2
assertNotRegexpMatches3.5
你可以使用https://github.com/isidentical/teyit 來自動現代化你的單元測試。
未以文件記錄且已失效的
TestCase方法assertDictContainsSubset(自 Python 3.2 起已棄用)。Undocumented
TestLoader.loadTestsFromModuleparameteruse_load_tests(deprecated and ignored since Python 3.5).對
TextTestResult類別的別名:_TextTestResult(自 Python 3.2 起已棄用)。
(由 Serhiy Storchaka 於gh-89325 中貢獻。)
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 thepure Python implementation, deprecated in Python 3.10, use thecopy.copy()function instead. The C implementation ofxml.etree.ElementTreehas nocopy()method, only a__copy__()method.(Contributed by Victor Stinner ingh-94383.)
zipimport¶
其他¶
Remove the
suspiciousrule from the documentationMakefileandDoc/tools/rstlint.py, both in favor ofsphinx-lint.(Contributed by Julien Palard ingh-98179.)Remove thekeyfile andcertfile parameters from the
ftplib,imaplib,poplibandsmtplibmodules,and thekey_file,cert_file andcheck_hostname parameters from thehttp.clientmodule,all deprecated since Python 3.6. Use thecontext parameter(ssl_context inimaplib) instead.(Contributed by Victor Stinner ingh-94172.)移除數個標準函式庫模組與測試中的
Jython相容性修補程式。(由 Nikita Sobolev 於gh-99482 中貢獻。)移除
ctypes模組中的_use_broken_old_ctypes_structure_semantics_旗標。(由 Nikita Sobolev 於gh-99285 中貢獻。)
移植至 Python 3.12¶
This section lists previously described changes and other bugfixesthat may require changes to your code.
Python API 的變更¶
More strict rules are now applied for numerical group references andgroup 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 onlycontain ASCII letters and digits and underscore.(Contributed by Serhiy Storchaka ingh-91760.)
Remove
randrange()functionality deprecated since Python 3.10. Formerly,randrange(10.0)losslessly converted torandrange(10). Now, it raises aTypeError. Also, the exception raised for non-integer values such asrandrange(10.5)orrandrange('10')has been changed fromValueErrortoTypeError. This also prevents bugs whererandrange(1e25)would silentlyselect from a larger range thanrandrange(10**25).(Originally suggested by Serhiy Storchakagh-86388.)argparse.ArgumentParserchanged encoding and error handlerfor reading arguments from file (e.g.fromfile_prefix_charsoption)from default text encoding (e.g.locale.getpreferredencoding(False))tofilesystem encoding and error handler.Argument files should be encoded in UTF-8 instead of ANSI Codepage on Windows.Remove the
asyncore-basedsmtpdmodule deprecated in Python 3.4.7and 3.5.4. A recommended replacement is theasyncio-basedaiosmtpd PyPI module.shlex.split(): PassingNonefors argument now raises anexception, rather than readingsys.stdin. The feature was deprecatedin Python 3.9.(Contributed by Victor Stinner ingh-94352.)The
osmodule no longer accepts bytes-like paths, likebytearrayandmemoryviewtypes: only the exactbytestype is accepted for bytes strings.(Contributed by Victor Stinner ingh-98393.)syslog.openlog()andsyslog.closelog()now fail if used in subinterpreters.syslog.syslog()may still be used in subinterpreters,but now only ifsyslog.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,syslogis a wrapperaround process-global resources, which are best managed from the main interpreter.(Contributed by Donghee Na ingh-99127.)The undocumented locking behavior of
cached_property()is removed, because it locked across all instances of the class, leading to highlock contention. This means that a cached property getter function could now runmore than once for a single instance, if two threads race. For most simplecached properties (e.g. those that are idempotent and simply calculate a valuebased on other attributes of the instance) this will be fine. Ifsynchronization is needed, implement locking within the cached property getterfunction or around multi-threaded access points.sys._current_exceptions()now returns a mapping from thread-id to anexception instance, rather than to a(typ,exc,tb)tuple.(Contributed by Irit Katriel ingh-103176.)When extracting tar files using
tarfileorshutil.unpack_archive(), pass thefilter argument to limit featuresthat may be surprising or dangerous.See解壓縮篩選器 for details.The output of the
tokenize.tokenize()andtokenize.generate_tokens()functions is now changed due to the changes introduced inPEP 701. Thismeans thatSTRINGtokens are not emitted any more for f-strings and thetokens described inPEP 701 are now produced instead:FSTRING_START,FSTRING_MIDDLEandFSTRING_ENDare now emitted for f-string "string"parts in addition to the appropriate tokens for the tokenization in theexpression components. For example for the f-stringf"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 thechanges required to supportPEP 701. Some of these changes include:
The
typeattribute of the tokens emitted when tokenizing some invalid Pythoncharacters such as!has changed fromERRORTOKENtoOP.Incomplete single-line strings now also raise
tokenize.TokenErroras incompletemultiline strings do.Some incomplete or invalid Python code now raises
tokenize.TokenErrorinstead ofreturning arbitraryERRORTOKENtokens when tokenizing it.Mixing tabs and spaces as indentation in the same file is not supported anymore and willraise a
TabError.
The
threadingmodule now expects the_threadmodule to havean_is_main_interpreterattribute. It is a function with noarguments that returnsTrueif the current interpreter is themain interpreter.Any library or application that provides a custom
_threadmoduleshould provide_is_main_interpreter().(Seegh-112826.)
建置變更¶
Python no longer uses
setup.pyto build shared C extension modules.Build parameters like headers and libraries are detected inconfigurescript. Extensions are built byMakefile. Most extensions usepkg-configand fall back to manual detection.(Contributed by Christian Heimes ingh-93939.)va_start()with two parameters, likeva_start(args,format),is now required to build Python.va_start()is no longer called with a single parameter.(Contributed by Kumar Aditya ingh-93207.)CPython now uses the ThinLTO option as the default link time optimization policyif the Clang compiler accepts the flag.(Contributed by Donghee Na ingh-89536.)
Add
COMPILEALL_OPTSvariable inMakefileto overridecompilealloptions (default:-j0) inmakeinstall. Also merged the 3compileallcommands into a single command to build .pyc files for alloptimization levels (0, 1, 2) at once.(Contributed by Victor Stinner ingh-99289.)Add platform triplets for 64-bit LoongArch:
loongarch64-linux-gnusf
loongarch64-linux-gnuf32
loongarch64-linux-gnu
(由 Zhang Na 於gh-90656 中貢獻。)
PYTHON_FOR_REGEN現在需要 Python 3.10 或更新的版本。Autoconf 2.71 and aclocal 1.16.4 is now required to regenerate
configure.(Contributed by Christian Heimes ingh-89886.)Windows builds and macOS installers from python.org now use OpenSSL 3.0.
C API 變更¶
新增功能¶
PEP 697: Introduce theUnstable C API tier,intended for low-level tools like debuggers and JIT compilers.This API may change in each minor release of CPython without deprecationwarnings.Its contents are marked by the
PyUnstable_prefix in names.程式碼物件建構函式:
PyUnstable_Code_New()(自PyCode_New重新命名)PyUnstable_Code_NewWithPosOnlyArgs()(自PyCode_NewWithPosOnlyArgs重新命名)
程式碼物件的額外儲存 (PEP 523):
PyUnstable_Eval_RequestCodeExtraIndex()(自_PyEval_RequestCodeExtraIndex重新命名)PyUnstable_Code_GetExtra()(自_PyCode_GetExtra重新命名)PyUnstable_Code_SetExtra()(自_PyCode_SetExtra重新命名)
原始名稱將可繼續使用,直到相應的 API 發生變更。
(由 Petr Viktorin 於gh-101101 中貢獻。)
PEP 697: Add an API for extending types whose instance memory layout isopaque:
PyType_Spec.basicsize可以為零或負數來指定繼承或擴充基底類別大小。PyObject_GetTypeData()andPyType_GetTypeDataSize()added to allow access to subclass-specific instance data.Py_TPFLAGS_ITEMS_AT_ENDandPyObject_GetItemData()added to allow safely extending certain variable-sized types, includingPyType_Type.Py_RELATIVE_OFFSETadded to allow definingmembersin terms of a subclass-specific struct.
(由 Petr Viktorin 於gh-103509 中貢獻。)
Add the newlimited C API function
PyType_FromMetaclass(),which generalizes the existingPyType_FromModuleAndSpec()usingan additional metaclass argument.(Contributed by Wenzel Jakob ingh-93012.)API for creating objects that can be called usingthe vectorcall protocol was added to theLimited API:
The
Py_TPFLAGS_HAVE_VECTORCALLflag is now removed from a classwhen the class's__call__()method is reassigned.This makes vectorcall safe to use with mutable types (i.e. heap typeswithout the immutable flag,Py_TPFLAGS_IMMUTABLETYPE).Mutable types that do not overridetp_callnowinherit thePy_TPFLAGS_HAVE_VECTORCALLflag.(Contributed by Petr Viktorin ingh-93274.)The
Py_TPFLAGS_MANAGED_DICTandPy_TPFLAGS_MANAGED_WEAKREFflags 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 usingthe vectorcall protocol was added to theLimited API:
This means that both the incoming and outgoing ends of the vector callprotocol are now available in theLimited API. (Contributedby Wenzel Jakob ingh-98586.)
Add two new public functions,
PyEval_SetProfileAllThreads()andPyEval_SetTraceAllThreads(), that allow to set tracing and profilingfunctions in all running threads in addition to the calling one. (Contributedby Pablo Galindo ingh-93503.)Add new function
PyFunction_SetVectorcall()to the C APIwhich sets the vectorcall field of a givenPyFunctionObject.(Contributed by Andrew Frost ingh-92257.)The C API now permits registering callbacks via
PyDict_AddWatcher(),PyDict_Watch()and related APIs to be called whenever a dictionaryis modified. This is intended for use by optimizing interpreters, JITcompilers, or debuggers.(Contributed by Carl Meyer ingh-91052.)Add
PyType_AddWatcher()andPyType_Watch()API to registercallbacks to receive notification on changes to a type.(Contributed by Carl Meyer ingh-91051.)Add
PyCode_AddWatcher()andPyCode_ClearWatcher()APIs to register callbacks to receive notification on creation anddestruction of code objects.(Contributed by Itamar Oren ingh-91054.)Add
PyFrame_GetVar()andPyFrame_GetVarString()functions toget a frame variable by its name.(Contributed by Victor Stinner ingh-91248.)Add
PyErr_GetRaisedException()andPyErr_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-deprecatedPyErr_Fetch()andPyErr_Restore().This is less error prone and a bit more efficient.(Contributed by Mark Shannon ingh-101578.)Add
_PyErr_ChainExceptions1, which takes an exception instance,to replace the legacy-API_PyErr_ChainExceptions, which is nowdeprecated. (Contributed by Mark Shannon ingh-101578.)Add
PyException_GetArgs()andPyException_SetArgs()as convenience functions for retrieving and modifyingtheargspassed to the exception's constructor.(Contributed by Mark Shannon ingh-101578.)Add
PyErr_DisplayException(), which takes an exception instance,to replace the legacy-apiPyErr_Display(). (Contributed byIrit Katriel ingh-102755).
PEP 683: IntroduceImmortal Objects, which allows objectsto bypass reference counts, and related changes to the C-API:
_Py_IMMORTAL_REFCNT:定義物件的參照計數as immortal.
_Py_IsImmortalChecks if an object has the immortal reference count.PyObject_HEAD_INIT這現在將初始化參照計數_Py_IMMORTAL_REFCNT(與Py_BUILD_CORE一起使用時)。
SSTATE_INTERNED_IMMORTAL駐留的 (interned) unicode 物件的識別字那是不滅的。
SSSTATE_INTERNED_IMMORTAL_STATIC駐留的 unicode 的識別字不滅且靜態的物體
sys.getunicodeinternedsize這會回傳 unicode 的總數objects that have been interned. This is now needed for
refleak.pytocorrectly track reference counts and allocated blocks
(由 Eddie Elizondo 於gh-84436 中貢獻。)
PEP 684:新增新的
Py_NewInterpreterFromConfig()函式和PyInterpreterConfig,它們可用於建立具有自己的 GIL 的子直譯器。(有關更多資訊,請參閱PEP 684:直譯器各別持有的 GIL。)(由 Eric Snow 在gh-104110 中貢獻。)In the limited C API version 3.12,
Py_INCREF()andPy_DECREF()functions are now implemented as opaque function calls tohide implementation details.(Contributed by Victor Stinner ingh-105387.)
移植至 Python 3.12¶
Legacy Unicode APIs based on
Py_UNICODE*representation has been removed.Please migrate to APIs based on UTF-8 orwchar_t*.Argument parsing functions like
PyArg_ParseTuple()doesn't supportPy_UNICODE*based format (e.g.u,Z) anymore. Please migrateto other formats for Unicode likes,z,es, andU.tp_weaklistfor all static builtin types is alwaysNULL.This is an internal-only field onPyTypeObjectbut we're pointing out the change in case someone happens to beaccessing the field directly anyway. To avoid breakage, considerusing the existing public C-API instead, or, if necessary, the(internal-only)_PyObject_GET_WEAKREFS_LISTPTR()macro.This internal-only
PyTypeObject.tp_subclassesmay now not bea valid object pointer. Its type was changed tovoid* toreflect this. We mention this in case someone happens to be accessing theinternal-only field directly.To get a list of subclasses, call the Python method
__subclasses__()(usingPyObject_CallMethod(),for example).Add support of more formatting options (left aligning, octals, uppercasehexadecimals,
intmax_t,ptrdiff_t,wchar_tCstrings, variable width and precision) inPyUnicode_FromFormat()andPyUnicode_FromFormatV().(Contributed by Serhiy Storchaka ingh-98836.)An unrecognized format character in
PyUnicode_FromFormat()andPyUnicode_FromFormatV()now sets aSystemError.In previous versions it caused all the rest of the format string to becopied as-is to the result string, and any extra arguments discarded.(Contributed by Serhiy Storchaka ingh-95781.)Fix wrong sign placement in
PyUnicode_FromFormat()andPyUnicode_FromFormatV().(Contributed by Philip Georgi ingh-95504.)Extension classes wanting to add a
__dict__or weak reference slotshould usePy_TPFLAGS_MANAGED_DICTandPy_TPFLAGS_MANAGED_WEAKREFinstead oftp_dictoffsetandtp_weaklistoffset, respectively.The use oftp_dictoffsetandtp_weaklistoffsetis stillsupported, but does not fully support multiple inheritance(gh-95589), and performance may be worse.Classes declaringPy_TPFLAGS_MANAGED_DICTmust call_PyObject_VisitManagedDict()and_PyObject_ClearManagedDict()to traverse and clear their instance's dictionaries.To clear weakrefs, callPyObject_ClearWeakRefs(), as before.The
PyUnicode_FSDecoder()function no longer accepts bytes-likepaths, likebytearrayandmemoryviewtypes: only the exactbytestype is accepted for bytes strings.(Contributed by Victor Stinner ingh-98393.)The
Py_CLEAR,Py_SETREFandPy_XSETREFmacros now only evaluate their arguments once. If an argument has sideeffects, these side effects are no longer duplicated.(Contributed by Victor Stinner ingh-98724.)The interpreter's error indicator is now always normalized. This meansthat
PyErr_SetObject(),PyErr_SetString()and the otherfunctions that set the error indicator now normalize the exceptionbefore storing it. (Contributed by Mark Shannon ingh-101578.)_Py_RefTotalis no longer authoritative and only kept aroundfor ABI compatibility. Note that it is an internal global and onlyavailable on debug builds. If you happen to be using it then you'llneed to start using_Py_GetGlobalRefTotal().The following functions now select an appropriate metaclass for the newlycreated type:
Creating classes whose metaclass overrides
tp_newis deprecated, and in Python 3.14+ it will be disallowed.Note that these functions ignoretp_newof the metaclass, possiblyallowing incomplete initialization.Note that
PyType_FromMetaclass()(added in Python 3.12)already disallows creating classes whose metaclass overridestp_new(__new__()in Python).Since
tp_newoverrides almost everythingPyType_From*functions do,the two are incompatible with each other.The existing behavior -- ignoring the metaclass for several stepsof type creation -- is unsafe in general, since (meta)classes assume thattp_newwas called.There is no simple general workaround. One of the following may work for you:If you control the metaclass, avoid using
tp_newin it:If initialization can be skipped, it can be done in
tp_initinstead.If the metaclass doesn't need to be instantiated from Python,set its
tp_newtoNULLusingthePy_TPFLAGS_DISALLOW_INSTANTIATIONflag.This makes it acceptable forPyType_From*functions.
Avoid
PyType_From*functions: if you don't need C-specific features(slots or setting the instance size), create types bycallingthe metaclass.If youknow the
tp_newcan be skipped safely, filter the deprecationwarning out usingwarnings.catch_warnings()from Python.
PyOS_InputHookandPyOS_ReadlineFunctionPointerare nolonger called insubinterpreters. This isbecause clients generally rely on process-wide global state (since thesecallbacks have no way of recovering extension module state).This also avoids situations where extensions may find themselves running in asubinterpreter that they don't support (or haven't yet been loaded in). Seegh-104668 for more info.
PyLongObjecthas had its internals changed for better performance.Although the internals ofPyLongObjectare private, they are usedby some extension modules.The internal fields should no longer be accessed directly, instead the APIfunctions beginningPyLong_...should be used instead.Two newunstable API functions are provided for efficient access to thevalue ofPyLongObjects which fit into a single machine word:Custom allocators, set via
PyMem_SetAllocator(), are nowrequired to be thread-safe, regardless of memory domain. Allocatorsthat don't have their own state, including "hooks", are not affected.If your custom allocator is not already thread-safe and you needguidance then please create a new GitHub issueand CC@ericsnowcurrently.
已棄用¶
In accordance withPEP 699, the
ma_version_tagfield inPyDictObjectis deprecated for extension modules. Accessing this field will generate a compilerwarning at compile time. This field will be removed in Python 3.14.(Contributed by Ramvikrams and Kumar Aditya ingh-101193. PEP by Ken Jin.)棄用全域配置變數:
Py_HashRandomizationFlag:請改用PyConfig.use_hash_seed和PyConfig.hash_seedPy_LegacyWindowsFSEncodingFlag:請改用PyPreConfig.legacy_windows_fs_encodingPy_FileSystemDefaultEncoding:請改用PyConfig.filesystem_encodingPy_HasFileSystemDefaultEncoding:請改用PyConfig.filesystem_encodingPy_FileSystemDefaultEncodeErrors:請改用PyConfig.filesystem_errorsPy_UTF8Mode:請改用PyPreConfig.utf8_mode(參見Py_PreInitialize())
Py_InitializeFromConfig()API 應改為與PyConfig一起使用。(由 Victor Stinner 於gh-77782 中貢獻。)Creating
immutabletypeswith mutablebases is deprecated and will be disabled in Python 3.14. (gh-95388)structmember.h標頭已棄用,但仍可使用,且還沒有移除它的計畫。現在只需包含
Python.h即可使用其內容,如果缺少,則新增Py前綴:型別巨集,如
Py_T_INT、Py_T_DOUBLE等(以前為T_INT、T_DOUBLE等)Py_READONLY(先前為READONLY)和Py_AUDIT_READ(先前全大寫)旗標
數個項目不再從
Python.h中公開:T_NONE(先前未記錄於文件上,且相當古怪)不做任何事的巨集
WRITE_RESTRICTED。RESTRICTED和READ_RESTRICTED這兩個巨集,相當於Py_AUDIT_READ。In some configurations,
<stddef.h>is not included fromPython.h.It should be included manually when usingoffsetof().
The deprecated header continues to provide its originalcontents under the original names.Your old code can stay unchanged, unless the extra include and non-namespacedmacros bother you greatly.
(由 Petr Viktorin 在gh-47146 中貢獻,其基於 Alexander Belopolsky 和 Matthias Braun 的前期工作。)
PyErr_Fetch()andPyErr_Restore()are deprecated.UsePyErr_GetRaisedException()andPyErr_SetRaisedException()instead.(Contributed by Mark Shannon ingh-101578.)PyErr_Display()已棄用,請改用PyErr_DisplayException()。(由 Irit Katriel 於gh-102755 中貢獻。)_PyErr_ChainExceptions已棄用,請改用_PyErr_ChainExceptions1。(由 Irit Katriel 於gh-102192 中貢獻。)使用
PyType_FromSpec()、PyType_FromSpecWithBases()或PyType_FromModuleAndSpec()建立一個其元類別覆寫tp_new的類別已被棄用。請改為呼叫元類別。
Python 3.14 中待移除的項目¶
PyDictObject中的ma_version_tag欄位,用於擴充模組 (PEP 699;gh-101193)。
Python 3.15 中待移除的項目¶
PyWeakref_GetObject()和PyWeakref_GET_OBJECT():請改用PyWeakref_GetRef()。可以使用pythoncapi-compat 專案來為 Python 3.12 和更早版本取得PyWeakref_GetRef()。Py_UNICODE型別與Py_UNICODE_WIDE巨集:請改用wchar_t。PyUnicode_AsDecodedObject():請改用PyCodec_Decode()。PyUnicode_AsDecodedUnicode():請改用PyCodec_Decode();請注意某些編解碼器(例如 "base64")可能會回傳非str的型別,例如bytes。PyUnicode_AsEncodedObject():請改用PyCodec_Encode()。PyUnicode_AsEncodedUnicode():請改用PyCodec_Encode();請注意某些編解碼器(例如 "base64")可能會回傳非bytes的型別,例如str。Python 初始化函式,自 Python 3.13 起已被棄用:
Py_GetPath():請改用PyConfig_Get("module_search_paths")(sys.path)。Py_GetPrefix():請改用PyConfig_Get("base_prefix")(sys.base_prefix)。如果需要處理虛擬環境,請改用PyConfig_Get("prefix")(sys.prefix)。Py_GetExecPrefix():請改用PyConfig_Get("base_exec_prefix")(sys.base_exec_prefix)。如果需要處理虛擬環境,請改用PyConfig_Get("exec_prefix")(sys.exec_prefix)。Py_GetProgramFullPath():請改用PyConfig_Get("executable")(sys.executable)。Py_GetProgramName():請改用PyConfig_Get("executable")(sys.executable)。Py_GetPythonHome():請改用PyConfig_Get("home")或PYTHONHOME環境變數。
pythoncapi-compat 專案 可以用來為 Python 3.13 和更早版本取得
PyConfig_Get()。用於配置 Python 初始化的函式,自 Python 3.11 起已被棄用:
PySys_SetArgvEx():請改用PyConfig.argv。PySys_SetArgv():請改用PyConfig.argv。Py_SetProgramName():請改用PyConfig.program_name。Py_SetPythonHome():請改用PyConfig.home。PySys_ResetWarnOptions():請改為清除sys.warnoptions和warnings.filters。
應改用帶有
PyConfig的Py_InitializeFromConfig()API。全域配置變數:
Py_DebugFlag:請改用PyConfig.parser_debug或PyConfig_Get("parser_debug")。Py_VerboseFlag:請改用PyConfig.verbose或PyConfig_Get("verbose")。Py_InteractiveFlag:請改用PyConfig.interactive或PyConfig_Get("interactive")。Py_InspectFlag:請改用PyConfig.inspect或PyConfig_Get("inspect")。Py_OptimizeFlag:請改用PyConfig.optimization_level或PyConfig_Get("optimization_level")。Py_NoSiteFlag:請改用PyConfig.site_import或PyConfig_Get("site_import")。Py_BytesWarningFlag:請改用PyConfig.bytes_warning或PyConfig_Get("bytes_warning")。Py_FrozenFlag:請改用PyConfig.pathconfig_warnings或PyConfig_Get("pathconfig_warnings")。Py_IgnoreEnvironmentFlag:請改用PyConfig.use_environment或PyConfig_Get("use_environment")。Py_DontWriteBytecodeFlag:請改用PyConfig.write_bytecode或PyConfig_Get("write_bytecode")。Py_NoUserSiteDirectory:請改用PyConfig.user_site_directory或PyConfig_Get("user_site_directory")。Py_UnbufferedStdioFlag:請改用PyConfig.buffered_stdio或PyConfig_Get("buffered_stdio")。Py_HashRandomizationFlag:請改用PyConfig.use_hash_seed和PyConfig.hash_seed或PyConfig_Get("hash_seed")。Py_IsolatedFlag:請改用PyConfig.isolated或PyConfig_Get("isolated")。Py_LegacyWindowsFSEncodingFlag:請改用PyPreConfig.legacy_windows_fs_encoding或PyConfig_Get("legacy_windows_fs_encoding")。Py_LegacyWindowsStdioFlag:請改用PyConfig.legacy_windows_stdio或PyConfig_Get("legacy_windows_stdio")。Py_FileSystemDefaultEncoding、Py_HasFileSystemDefaultEncoding:請改用PyConfig.filesystem_encoding或PyConfig_Get("filesystem_encoding")。Py_FileSystemDefaultEncodeErrors:請改用PyConfig.filesystem_errors或PyConfig_Get("filesystem_errors")。Py_UTF8Mode:請改用PyPreConfig.utf8_mode或PyConfig_Get("utf8_mode")。(請參閱Py_PreInitialize())
應改用帶有
PyConfig的Py_InitializeFromConfig()API 來設定這些選項。或者也可以使用PyConfig_Get()在執行時取得這些選項。
Python 3.16 中待移除的項目¶
libmpdecimal的打包副本 (bundled copy)。
未來版本中的待移除項目¶
下列 API 已被棄用並將會被移除,不過目前尚未訂定移除日期。
Py_TPFLAGS_HAVE_FINALIZE:自 Python 3.8 起不再需要PySlice_GetIndicesEx():請改用PySlice_Unpack()和PySlice_AdjustIndices()。PyUnicode_READY():自 Python 3.12 起不再需要PyErr_Display():請改用PyErr_DisplayException()。_PyErr_ChainExceptions():請改用_PyErr_ChainExceptions1。PyBytesObject.ob_shash成員:請改為呼叫PyObject_Hash()。執行緒局部儲存 (Thread Local Storage, TLS) API:
已移除¶
移除
token.h標頭檔案。從未有任何公開的 tokenizer C API。token.h標頭檔案的設計是僅限用於 Python 內部。(由 Victor Stinner 於gh-92651 中貢獻。)Legacy Unicode APIs have been removed. SeePEP 623 for detail.
PyUnicode_WCHAR_KINDPyUnicode_AS_UNICODE()PyUnicode_AsUnicode()PyUnicode_AsUnicodeAndSize()PyUnicode_AS_DATA()PyUnicode_FromUnicode()PyUnicode_GET_SIZE()PyUnicode_GetSize()PyUnicode_GET_DATA_SIZE()
移除
PyUnicode_InternImmortal()函式巨集。(由 Victor Stinner 於gh-85858 中貢獻。)