Was ist neu in Python 3.12¶
- Editor:
Adam Turner
Dieser Artikel erklärt die neuen Funktionen in Python 3.12 im Vergleich zu 3.11. Python 3.12 wurde am 2. Oktober 2023 veröffentlicht. Vollständige Details finden Sie im Changelog.
Siehe auch
PEP 693 – Python 3.12 Release Schedule
Zusammenfassung – Release-Highlights¶
Python 3.12 ist eine stabile Version der Python-Programmiersprache mit einer Mischung aus Änderungen an der Sprache und der Standardbibliothek. Die Änderungen an der Bibliothek konzentrieren sich auf die Bereinigung veralteter APIs, Benutzerfreundlichkeit und Korrektheit. Bemerkenswert ist, dass das distutils-Paket aus der Standardbibliothek entfernt wurde. Die Dateisystemunterstützung in os und pathlib wurde verbessert, und mehrere Module weisen eine bessere Leistung auf.
Die Sprachänderungen konzentrieren sich auf die Benutzerfreundlichkeit, da viele Einschränkungen für f-Strings entfernt wurden und die Vorschläge „Did you mean …“ weiterhin verbessert werden. Die neue Typ-Parameter-Syntax und die type-Anweisung verbessern die Ergonomie für die Verwendung von generischen Typen und Typ-Aliassen mit statischen Typprüfern.
Dieser Artikel versucht nicht, eine vollständige Spezifikation aller neuen Funktionen zu bieten, sondern gibt stattdessen einen praktischen Überblick. Für vollständige Details sollten Sie die Dokumentation konsultieren, wie z. B. die Library Reference und die Language Reference. Wenn Sie die vollständige Implementierung und die Begründung für eine Änderung verstehen möchten, ziehen Sie das PEP für eine bestimmte neue Funktion hinzu; beachten Sie jedoch, dass PEPs in der Regel nicht auf dem neuesten Stand gehalten werden, sobald eine Funktion vollständig implementiert ist.
Neue Syntaxfunktionen
Neue Grammatikfunktionen
Interpreter-Verbesserungen
PEP 669, Niedrig-impact-Überwachung
Verbesserte „Did you mean …“-Vorschläge für
NameError-,ImportError- undSyntaxError-Ausnahmen
Verbesserungen am Python-Datenmodell
PEP 688, Verwendung des Buffer-Protokolls aus Python
Signifikante Verbesserungen in der Standardbibliothek
Die Klasse
pathlib.Pathunterstützt jetzt UnterklassenbildungDas Modul
oserhielt mehrere Verbesserungen für die Windows-UnterstützungEin Kommandozeilen-Interface wurde zum Modul
sqlite3hinzugefügt`isinstance()`-Prüfungen gegen
runtime-checkable protocolssind zwei- bis zwanzigmal schneller gewordenDas Paket
asynciohat eine Reihe von Leistungsverbesserungen erfahren, wobei einige Benchmarks eine Beschleunigung von 75 % zeigen.Ein Kommandozeilen-Interface wurde zum Modul
uuidhinzugefügtAufgrund der Änderungen in PEP 701 ist die Erzeugung von Tokens über das Modul
tokenizebis zu 64 % schneller.
Sicherheitsverbesserungen
Ersetzen Sie die integrierten
hashlib-Implementierungen von SHA1, SHA3, SHA2-384, SHA2-512 und MD5 durch formal verifizierten Code aus dem HACL*-Projekt. Diese integrierten Implementierungen bleiben als Fallbacks erhalten, die nur verwendet werden, wenn OpenSSL sie nicht bereitstellt.
C-API-Verbesserungen
CPython-Implementierungsverbesserungen
PEP 709, Inlining von Comprehensions
CPython-Unterstützung für den Linux
perf-ProfilerImplementieren Sie Stack-Overflow-Schutz auf unterstützten Plattformen
Neue Typ-Annotation-Funktionen
PEP 692, Verwendung von
TypedDictzur Annotation von **kwargsPEP 698,
typing.override()-Decorator
Wichtige Verwarnungen, Entfernungen oder Einschränkungen
PEP 623: Entfernung von
wstraus Unicode-Objekten in Pythons C-API, wodurch die Größe jedesstr-Objekts um mindestens 8 Bytes reduziert wird.PEP 632: Entfernung des
distutils-Pakets. Weitere Hinweise zur Migration von den von ihm bereitgestellten APIs finden Sie im Migrationsleitfaden. Das Drittanbieter-Paket Setuptools bietet weiterhindistutils, wenn Sie es in Python 3.12 und darüber hinaus noch benötigen.gh-95299:
setuptoolswird nicht mehr standardmäßig in virtuellen Umgebungen installiert, die mitvenverstellt wurden. Dies bedeutet, dassdistutils,setuptools,pkg_resourcesundeasy_installnicht mehr standardmäßig verfügbar sind; um darauf zuzugreifen, führen Siepip install setuptoolsin der aktivierten virtuellen Umgebung aus.Die Module
asynchat,asyncoreundimpwurden zusammen mit mehrerenunittest.TestCase-Methoden-Aliassen entfernt.
Neue Funktionen¶
PEP 695: Typ-Parameter-Syntax¶
Generische Klassen und Funktionen gemäß PEP 484 wurden mit einer umständlichen Syntax deklariert, die den Geltungsbereich von Typ-Parametern unklar ließ und explizite Varianzdeklarationen erforderte.
PEP 695 führt eine neue, kompaktere und explizitere Methode zur Erstellung von generischen Klassen und Funktionen ein
def max[T](args: Iterable[T]) -> T:
...
class list[T]:
def __getitem__(self, index: int, /) -> T:
...
def append(self, element: T) -> None:
...
Zusätzlich führt die PEP eine neue Methode zur Deklaration von Typ-Aliassen mit der type-Anweisung ein, die eine Instanz von TypeAliasType erstellt.
type Point = tuple[float, float]
Typ-Aliasse können auch generisch sein.
type Point[T] = tuple[T, T]
Die neue Syntax erlaubt die Deklaration von TypeVarTuple- und ParamSpec-Parametern sowie von TypeVar-Parametern mit Bounds oder Einschränkungen.
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
Der Wert von Typ-Aliassen sowie die Bounds und Einschränkungen von Typvariablen, die über diese Syntax erstellt werden, werden nur bei Bedarf ausgewertet (siehe Lazy Evaluation). Dies bedeutet, dass Typ-Aliasse auf andere Typen verweisen können, die später in der Datei definiert sind.
Typ-Parameter, die über eine Typ-Parameterliste deklariert werden, sind innerhalb des Geltungsbereichs der Deklaration und aller verschachtelten Geltungsbereiche sichtbar, aber nicht im äußeren Geltungsbereich. Sie können beispielsweise in den Typannotationen für die Methoden einer generischen Klasse oder im Klassenkörper verwendet werden. Sie können jedoch nicht im Modulgeltungsbereich nach der Definition der Klasse verwendet werden. Siehe Typ-Parameterlisten für eine detaillierte Beschreibung der Laufzeitsemantik von Typ-Parametern.
Um diese Geltungsbereichssemantiken zu unterstützen, wird eine neue Art von Geltungsbereich eingeführt, der Annotation Scope. Annotation Scopes verhalten sich größtenteils wie Funktions-Scopes, interagieren aber anders mit einschließenden Klassenscopes. In Python 3.13 werden Annotationen ebenfalls in Annotation Scopes ausgewertet.
Siehe PEP 695 für weitere Details.
(PEP geschrieben von Eric Traut. Implementierung von Jelle Zijlstra, Eric Traut und anderen in gh-103764.)
PEP 701: Syntaktische Formalisierung von f-Strings¶
PEP 701 hebt einige Einschränkungen bei der Verwendung von f-Strings auf. Ausdruckskomponenten innerhalb von f-Strings können nun jeder gültige Python-Ausdruck sein, einschließlich Zeichenfolgen, die dasselbe Anführungszeichen wie der enthaltende f-String wiederverwenden, mehrzeilige Ausdrücke, Kommentare, Backslashes und Unicode-Escape-Sequenzen. Lassen Sie uns diese im Detail behandeln.
Wiederverwendung von Anführungszeichen: In Python 3.11 führt die Wiederverwendung derselben Anführungszeichen wie der enthaltende f-String zu einem
SyntaxError, wodurch der Benutzer gezwungen ist, entweder andere verfügbare Anführungszeichen zu verwenden (z. B. doppelte oder dreifache Anführungszeichen, wenn der f-String einfache Anführungszeichen verwendet). In Python 3.12 können Sie nun Dinge wie diese tun.>>> 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'
Beachten Sie, dass vor dieser Änderung keine explizite Grenze für die Verschachtelung von f-Strings bestand, aber die Tatsache, dass Zeichenfolgenanführungszeichen innerhalb der Ausdruckskomponente von f-Strings nicht wiederverwendet werden konnten, machte eine beliebige Verschachtelung von f-Strings unmöglich. Tatsächlich ist dies der am tiefsten verschachtelte f-String, der geschrieben werden konnte.
>>> f"""{f'''{f'{f"{1+1}"}'}'''}""" '2'
Da f-Strings nun jeden gültigen Python-Ausdruck innerhalb von Ausdruckskomponenten enthalten können, ist es nun möglich, f-Strings beliebig zu verschachteln.
>>> f"{f"{f"{f"{f"{f"{1+1}"}"}"}"}"}" '2'
Mehrzeilige Ausdrücke und Kommentare: In Python 3.11 müssen f-String-Ausdrücke in einer einzigen Zeile definiert werden, auch wenn der Ausdruck innerhalb des f-Strings normalerweise mehrere Zeilen umfassen könnte (z. B. literale Listen, die über mehrere Zeilen definiert werden), was sie schwerer lesbar macht. In Python 3.12 können Sie nun mehrzeilige f-Strings definieren und Inline-Kommentare hinzufügen.
>>> 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 und Unicode-Zeichen: Vor Python 3.12 konnten f-String-Ausdrücke keine
\-Zeichen enthalten. Dies wirkte sich auch auf Unicode-Escape-Sequenzen (wie\N{snowman}) aus, da diese den\N-Teil enthalten, der zuvor nicht Teil von Ausdruckskomponenten von f-Strings sein konnte. Nun können Sie Ausdrücke wie folgt definieren.>>> print(f"This is the playlist: {"\n".join(songs)}") This is the playlist: Take me back to Eden Alkaline Ascensionism >>> print(f"This is the playlist: {"\N{BLACK HEART SUIT}".join(songs)}") This is the playlist: Take me back to Eden♥Alkaline♥Ascensionism
Siehe PEP 701 für weitere Details.
Als positiver Nebeneffekt der Implementierung dieses Features (durch Parsen von f-Strings mit dem PEG-Parser) sind die Fehlermeldungen für f-Strings nun präziser und enthalten den genauen Speicherort des Fehlers. Beispielsweise löst in Python 3.11 der folgende f-String einen SyntaxError aus.
>>> my_string = f"{x z y}" + f"{1 + 1}"
File "<stdin>", line 1
(x z y)
^^^
SyntaxError: f-string: invalid syntax. Perhaps you forgot a comma?
Die Fehlermeldung enthält jedoch nicht den genauen Speicherort des Fehlers innerhalb der Zeile und hat den Ausdruck künstlich mit Klammern umgeben. In Python 3.12 können die Fehlermeldungen, da f-Strings mit dem PEG-Parser verarbeitet werden, präziser sein und die gesamte Zeile anzeigen.
>>> my_string = f"{x z y}" + f"{1 + 1}"
File "<stdin>", line 1
my_string = f"{x z y}" + f"{1 + 1}"
^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?
(Beigetragen von Pablo Galindo, Batuhan Taskaya, Lysandros Nikolaou, Cristián Maureira-Fredes und Marta Gómez in gh-102856. PEP geschrieben von Pablo Galindo, Batuhan Taskaya, Lysandros Nikolaou und Marta Gómez).
PEP 684: Ein pro Interpreter GIL¶
PEP 684 führt ein pro Interpreter GIL ein, sodass Sub-Interpreter nun mit einem eindeutigen GIL pro Interpreter erstellt werden können. Dies ermöglicht Python-Programmen, mehrere CPU-Kerne vollständig auszunutzen. Dies ist derzeit nur über die C-API verfügbar, obwohl eine Python-API für 3.13 erwartet wird.
Verwenden Sie die neue Funktion Py_NewInterpreterFromConfig(), um einen Interpreter mit eigenem GIL zu erstellen.
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. */
Weitere Beispiele für die Verwendung der C-API für Sub-Interpreter mit einem pro Interpreter GIL finden Sie in Modules/_xxsubinterpretersmodule.c.
(Beigetragen von Eric Snow in gh-104210, etc.)
PEP 669: Niedrig-impact-Überwachung für CPython¶
PEP 669 definiert eine neue API für Profiler, Debugger und andere Tools zur Überwachung von Ereignissen in CPython. Sie deckt eine breite Palette von Ereignissen ab, darunter Aufrufe, Rückgaben, Zeilen, Ausnahmen, Sprünge und mehr. Das bedeutet, dass Sie nur für das bezahlen, was Sie verwenden, und Unterstützung für Debugger und Abdeckungstools mit nahezu null Overhead bietet. Details finden Sie in sys.monitoring.
(Beigetragen von Mark Shannon in gh-103082.)
PEP 688: Bereitstellung des Buffer-Protokolls in Python¶
PEP 688 führt eine Möglichkeit ein, das Buffer-Protokoll aus Python-Code zu verwenden. Klassen, die die Methode __buffer__() implementieren, sind nun als Buffer-Typen verwendbar.
Die neue ABC collections.abc.Buffer bietet eine standardmäßige Möglichkeit, Buffer-Objekte darzustellen, z. B. in Typannotationen. Die neue Enum inspect.BufferFlags repräsentiert die Flags, die zur Anpassung der Buffer-Erstellung verwendet werden können. (Beigetragen von Jelle Zijlstra in gh-102500.)
PEP 709: Inlining von Comprehensions¶
Dictionary-, Listen- und Set-Comprehensions werden nun inline ausgeführt, anstatt für jede Ausführung der Comprehension ein neues Einweg-Funktionsobjekt zu erstellen. Dies beschleunigt die Ausführung einer Comprehension um das bis zu Zweifache. Weitere Details finden Sie in PEP 709.
Variablen für die Iteration von Comprehensions bleiben isoliert und überschreiben keine Variable mit demselben Namen im äußeren Geltungsbereich, noch sind sie nach der Comprehension sichtbar. Das Inlining führt zu einigen sichtbaren Verhaltensänderungen.
Es gibt keinen separaten Frame mehr für die Comprehension in Tracebacks, und das Tracing/Profiling zeigt die Comprehension nicht mehr als Funktionsaufruf an.
Das Modul
symtablewird keine untergeordneten Symboltabellen mehr für jede Comprehension erzeugen; stattdessen werden die Locals der Comprehension in die Symboltabelle der übergeordneten Funktion aufgenommen.Das Aufrufen von
locals()innerhalb einer Comprehension umfasst nun Variablen außerhalb der Comprehension und schließt die synthetische Variable.0für das Comprehension-„Argument“ nicht mehr ein.Eine Comprehension, die direkt über
locals()iteriert (z. B.[k for k in locals()]), kann „RuntimeError: dictionary changed size during iteration“ anzeigen, wenn sie unter Tracing (z. B. Code-Coverage-Messung) ausgeführt wird. Dies ist dasselbe Verhalten, das bereits bei z. B.for k in locals():auftrat. Um den Fehler zu vermeiden, erstellen Sie zuerst eine Liste von Schlüsseln zum Iterieren:keys = list(locals()); [k for k in keys].
(Beigetragen von Carl Meyer und Vladimir Matveev in PEP 709.)
Verbesserte Fehlermeldungen¶
Module aus der Standardbibliothek werden nun potenziell als Teil der Fehlermeldungen vorgeschlagen, die vom Interpreter angezeigt werden, wenn ein
NameErrorauf oberster Ebene ausgelöst wird. (Beigetragen von 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'?
Verbessern Sie die Fehlervorschläge für
NameError-Ausnahmen für Instanzen. Wenn nun einNameErrorin einer Methode ausgelöst wird und die Instanz ein Attribut hat, das exakt dem Namen in der Ausnahme entspricht, enthält der Vorschlagself.<NAME>anstelle der nächstgelegenen Übereinstimmung im Methodengeltungsbereich. (Beigetragen von 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'?
Verbessern Sie die
SyntaxError-Fehlermeldung, wenn der Benutzerimport x from yanstelle vonfrom y import xeingibt. (Beigetragen von 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-Ausnahmen, die bei fehlgeschlagenenfrom <module> import <name>-Anweisungen ausgelöst werden, enthalten nun Vorschläge für den Wert von<name>basierend auf den verfügbaren Namen in<module>. (Beigetragen von 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'?
Andere Sprachänderungen¶
Der Parser löst nun
SyntaxErroraus, wenn Quellcode mit Null-Bytes analysiert wird. (Beigetragen von Pablo Galindo in gh-96670.)Ein Backslash-Zeichenpaar, das keine gültige Escape-Sequenz ist, erzeugt nun eine
SyntaxWarninganstelle einerDeprecationWarning. Beispielsweise gibtre.compile("\d+\.\d+")nun eineSyntaxWarningaus (``\d`` ist eine ungültige Escape-Sequenz, verwenden Sie Rohzeichenketten für reguläre Ausdrücke:re.compile(r"\d+\.\d+")). In einer zukünftigen Python-Version wird schließlich einSyntaxErroranstelle vonSyntaxWarningausgelöst.Oktale Escapes mit einem Wert größer als
0o377(z. B."\477"), die in Python 3.11 als veraltet markiert wurden, erzeugen nun eineSyntaxWarninganstelle einerDeprecationWarning. In einer zukünftigen Python-Version wird dies schließlich zu einemSyntaxErrorführen.Variablen, die im Zielteil von Comprehensions verwendet werden und nicht gespeichert werden, können nun in Zuweisungsausdrücken (
:=) verwendet werden. Zum Beispiel ist in[(b := 1) for a, b.prop in some_iter]die Zuweisung anbnun erlaubt. Beachten Sie, dass die Zuweisung an Variablen, die im Zielteil von Comprehensions gespeichert werden (wiea), immer noch nicht erlaubt ist, gemäß PEP 572. (Beigetragen von Nikita Sobolev in gh-100581.)Ausnahmen, die in der
__set_name__-Methode einer Klasse oder eines Typs ausgelöst werden, werden nicht mehr von einerRuntimeErrorumschlossen. Kontextinformationen werden als PEP 678-Hinweis zur Ausnahme hinzugefügt. (Beigetragen von Irit Katriel in gh-77757.)Wenn ein
try-except*-Konstrukt die gesamteExceptionGroupbehandelt und eine andere Ausnahme auslöst, wird diese Ausnahme nicht mehr in eineExceptionGroupumschlossen. Ebenfalls geändert in Version 3.11.4. (Beigetragen von Irit Katriel in gh-103590.)Der Garbage Collector läuft nun nur noch auf dem Eval-Breaker-Mechanismus der Python-Bytecode-Ausführungsschleife anstelle von Objektallokationen. Der GC kann auch ausgeführt werden, wenn
PyErr_CheckSignals()aufgerufen wird, sodass C-Erweiterungen, die lange Zeit ohne Ausführung von Python-Code laufen müssen, ebenfalls die Möglichkeit haben, den GC periodisch auszuführen. (Beigetragen von Pablo Galindo in gh-97922.)Alle eingebauten und erweiterbaren aufrufbaren Objekte, die boolesche Parameter erwarten, akzeptieren nun Argumente beliebigen Typs anstelle von nur
boolundint. (Beigetragen von Serhiy Storchaka in gh-60203.)memoryviewunterstützt nun den Halbfloat-Typ (den "e"-Formatcode). (Beigetragen von Donghee Na und Antoine Pitrou in gh-90751.)slice-Objekte sind nun hashbar, was ihre Verwendung als Dictionary-Schlüssel und Set-Elemente ermöglicht. (Beigetragen von Will Bradshaw, Furkan Onder und Raymond Hettinger in gh-101264.)sum()verwendet nun die Neumaier-Summation zur Verbesserung der Genauigkeit und Kommutativität beim Summieren von Floats oder gemischten Ints und Floats. (Beigetragen von Raymond Hettinger in gh-100425.)ast.parse()löst nunSyntaxErroranstelle vonValueErroraus, wenn Quellcode mit Null-Bytes analysiert wird. (Beigetragen von Pablo Galindo in gh-96670.)Die Extraktionsmethoden in
tarfileundshutil.unpack_archive()verfügen über ein neues Argument filter, das die Begrenzung von Tar-Funktionen ermöglicht, die überraschend oder gefährlich sein können, z. B. das Erstellen von Dateien außerhalb des Zielverzeichnisses. Weitere Details finden Sie unter tarfile extraction filters. In Python 3.14 wird die Standardeinstellung auf'data'umgestellt. (Beigetragen von Petr Viktorin in PEP 706.)types.MappingProxyType-Instanzen sind nun hashbar, wenn das zugrunde liegende Mapping hashbar ist. (Beigetragen von Serhiy Storchaka in gh-87995.)Unterstützung für den perf-Profiler über die neue Umgebungsvariable
PYTHONPERFSUPPORTund die Befehlszeilenoption-X perfsowie die neuen Funktionensys.activate_stack_trampoline(),sys.deactivate_stack_trampoline()undsys.is_stack_trampoline_active()hinzugefügt. (Design von Pablo Galindo. Beigetragen von Pablo Galindo und Christian Heimes mit Beiträgen von Gregory P. Smith [Google] und Mark Shannon in gh-96123.)
Neue Module¶
Keine.
Verbesserte Module¶
array¶
Die Klasse
array.arrayunterstützt nun Subskriptionen, wodurch sie zu einem generischen Typ wird. (Beigetragen von Jelle Zijlstra in gh-98658.)
asyncio¶
Die Leistung beim Schreiben auf Sockets in
asynciowurde erheblich verbessert.asynciovermeidet nun unnötige Kopien beim Schreiben auf Sockets und verwendetsendmsg(), wenn die Plattform dies unterstützt. (Beigetragen von Kumar Aditya in gh-91166.)Die Funktionen
asyncio.eager_task_factory()undasyncio.create_eager_task_factory()wurden hinzugefügt, um eine Ereignisschleife für die sofortige Task-Ausführung zu ermöglichen, was einige Anwendungsfälle 2- bis 5-mal schneller macht. (Beigetragen von Jacob Bower & Itamar Oren in gh-102853, gh-104140 und gh-104138)Unter Linux verwendet
asynciostandardmäßigasyncio.PidfdChildWatcher, wennos.pidfd_open()verfügbar und funktionsfähig ist, anstelle vonasyncio.ThreadedChildWatcher. (Beigetragen von Kumar Aditya in gh-98024.)Die Ereignisschleife verwendet nun den besten verfügbaren Child-Watcher für jede Plattform (
asyncio.PidfdChildWatcher, wenn unterstützt, und andernfallsasyncio.ThreadedChildWatcher), sodass die manuelle Konfiguration eines Child-Watchers nicht empfohlen wird. (Beigetragen von Kumar Aditya in gh-94597.)Der Parameter loop_factory wurde zu
asyncio.run()hinzugefügt, um die Angabe einer benutzerdefinierten Schleifenfabrik zu ermöglichen. (Beigetragen von Kumar Aditya in gh-99388.)C-Implementierung von
asyncio.current_task()für eine 4- bis 6-fache Beschleunigung hinzugefügt. (Beigetragen von Itamar Oren und Pranav Thulasiram Bhat in gh-100344.)asyncio.iscoroutine()gibt nunFalsefür Generatoren zurück, daasynciokeine veralteten Generator-basierten Coroutinen unterstützt. (Beigetragen von Kumar Aditya in gh-102748.)asyncio.wait()undasyncio.as_completed()akzeptieren nun Generatoren, die Tasks ergeben. (Beigetragen von Kumar Aditya in gh-78530.)
calendar¶
Enums
calendar.Monthundcalendar.Dayhinzugefügt, die Monate des Jahres und Tage der Woche definieren. (Beigetragen von Prince Roshan in gh-103636.)
csv¶
Die Flags
csv.QUOTE_NOTNULLundcsv.QUOTE_STRINGSwurden hinzugefügt, um eine feinere Kontrolle überNoneund leere Strings durchreaderundwriter-Objekte zu ermöglichen.
dis¶
Pseudo-Instruktions-Opcodes (die vom Compiler verwendet werden, aber nicht im ausführbaren Bytecode erscheinen) werden nun im
dis-Modul verfügbar gemacht.HAVE_ARGUMENTist für echte Opcodes weiterhin relevant, aber für Pseudo-Instruktionen nicht nützlich. Verwenden Sie stattdessen die neue Sammlungdis.hasarg. (Beigetragen von Irit Katriel in gh-94216.)Die Sammlung
dis.hasexcwurde hinzugefügt, um Instruktionen zu kennzeichnen, die einen Ausnahmehandler setzen. (Beigetragen von Irit Katriel in gh-94216.)
fractions¶
Objekte vom Typ
fractions.Fractionunterstützen nun die Float-Formatierung. (Beigetragen von Mark Dickinson in gh-100161.)
importlib.resources¶
importlib.resources.as_file()unterstützt nun Ressourcenverzeichnisse. (Beigetragen von Jason R. Coombs in gh-97930.)Der erste Parameter von
importlib.resources.files()wurde in anchor umbenannt. (Beigetragen von Jason R. Coombs in gh-100598.)
inspect¶
Die Funktion
inspect.markcoroutinefunction()wurde hinzugefügt, um synchrone Funktionen zu kennzeichnen, die eine coroutine zurückgeben, zur Verwendung mitinspect.iscoroutinefunction(). (Beigetragen von Carlton Gibson in gh-99247.)Die Funktionen
inspect.getasyncgenstate()undinspect.getasyncgenlocals()wurden hinzugefügt, um den aktuellen Zustand asynchroner Generatoren zu ermitteln. (Beigetragen von Thomas Krennwallner in gh-79940.)Die Leistung von
inspect.getattr_static()wurde erheblich verbessert. Die meisten Aufrufe der Funktion sollten mindestens 2x schneller sein als in Python 3.11. (Beigetragen von Alex Waygood in gh-103193.)
itertools¶
Die Funktion
itertools.batched()wurde hinzugefügt, um Elemente in gleich große Tupel zu sammeln, wobei der letzte Batch kürzer als die anderen sein kann. (Beigetragen von Raymond Hettinger in gh-98363.)
math¶
Die Funktion
math.sumprod()wurde hinzugefügt, um eine Summe von Produkten zu berechnen. (Beigetragen von Raymond Hettinger in gh-100485.)Die Funktion
math.nextafter()wurde um das Argument steps erweitert, um das Bewegen in mehreren Schritten nach oben oder unten zu ermöglichen. (Beigetragen von Matthias Goergens, Mark Dickinson und Raymond Hettinger in gh-94906.)
os¶
Das Konstante
os.PIDFD_NONBLOCKwurde hinzugefügt, um einen Dateideskriptor für einen Prozess mitos.pidfd_open()im nicht-blockierenden Modus zu öffnen. (Beigetragen von Kumar Aditya in gh-93312.)os.DirEntryenthält nun eine Methodeos.DirEntry.is_junction(), um zu prüfen, ob der Eintrag eine Junction ist. (Beigetragen von Charles Machalow in gh-99547.)Die Funktionen
os.listdrives(),os.listvolumes()undos.listmounts()wurden unter Windows für die Enumeration von Laufwerken, Volumes und Mountpoints hinzugefügt. (Beigetragen von Steve Dower in gh-102519.)os.stat()undos.lstat()sind unter Windows nun genauer. Das Feldst_birthtimewird nun mit der Erstellungszeit der Datei gefüllt, undst_ctimeist veraltet, enthält aber immer noch die Erstellungszeit (wird aber zukünftig die letzte Metadatenänderung zurückgeben, um die Konsistenz mit anderen Plattformen zu gewährleisten).st_devkann je nach Dateisystem bis zu 64 Bit undst_inobis zu 128 Bit betragen, undst_rdevwird immer auf Null gesetzt anstatt auf falsche Werte. Beide Funktionen können auf neueren Windows-Versionen deutlich schneller sein. (Beigetragen von Steve Dower in gh-99726.)
os.path¶
Die Funktion
os.path.isjunction()wurde hinzugefügt, um zu prüfen, ob ein gegebener Pfad eine Junction ist. (Beigetragen von Charles Machalow in gh-99547.)Die Funktion
os.path.splitroot()wurde hinzugefügt, um einen Pfad in eine Triade(drive, root, tail)zu teilen. (Beigetragen von Barney Gale in gh-101000.)
pathlib¶
Unterstützung für die Unterklasse von
pathlib.PurePathundpathlib.Pathsowie deren Posix- und Windows-spezifischen Varianten wurde hinzugefügt. Unterklassen können die Methodepathlib.PurePath.with_segments()überschreiben, um Informationen zwischen Pfadinstanzen zu übergeben.Die Methode
pathlib.Path.walk()wurde hinzugefügt, um Verzeichnisbäume zu durchlaufen und alle Datei- oder Verzeichnisnamen darin zu generieren, ähnlich wie beios.walk(). (Beigetragen von Stanislav Zmiev in gh-90385.)Der optionale Parameter walk_up wurde zu
pathlib.PurePath.relative_to()hinzugefügt, um die Einfügung von..-Einträgen im Ergebnis zu ermöglichen; dieses Verhalten ist konsistenter mitos.path.relpath(). (Beigetragen von Domenico Ragusa in gh-84538.)Die Methode
pathlib.Path.is_junction()wurde als Proxy füros.path.isjunction()hinzugefügt. (Beigetragen von Charles Machalow in gh-99547.)Der optionale Parameter case_sensitive wurde zu
pathlib.Path.glob(),pathlib.Path.rglob()undpathlib.PurePath.match()hinzugefügt, um die Groß-/Kleinschreibung der Pfade zu berücksichtigen und eine präzisere Steuerung des Abgleichprozesses zu ermöglichen.
platform¶
Unterstützung für die Erkennung von Windows 11 und Windows Server-Versionen nach 2012 wurde hinzugefügt. Zuvor würden Lookups auf Windows Server-Plattformen, die neuer als Windows Server 2012 sind, und auf Windows 11
Windows-10zurückgeben. (Beigetragen von Steve Dower in gh-89545.)
pdb¶
Bequeme Variablen wurden hinzugefügt, um Werte temporär für Debugging-Sitzungen zu speichern und einen schnellen Zugriff auf Werte wie den aktuellen Frame oder den Rückgabewert zu ermöglichen. (Beigetragen von Tian Gao in gh-103693.)
random¶
Die Funktion
random.binomialvariate()wurde hinzugefügt. (Beigetragen von Raymond Hettinger in gh-81620.)Ein Standardwert von
lambd=1.0wurde zurandom.expovariate()hinzugefügt. (Beigetragen von Raymond Hettinger in gh-100234.)
shutil¶
shutil.make_archive()übergibt nun das Argument root_dir an benutzerdefinierte Archivierer, die es unterstützen. In diesem Fall wird das aktuelle Arbeitsverzeichnis des Prozesses nicht mehr vorübergehend auf root_dir geändert, um die Archivierung durchzuführen. (Beigetragen von Serhiy Storchaka in gh-74696.)shutil.rmtree()akzeptiert nun ein neues Argument onexc, das ein Fehlerbehandlungsroutine ähnlich wie onerror ist, aber eine Instanz einer Ausnahme anstelle eines (typ, val, tb)-Tripels erwartet. onerror ist veraltet. (Beigetragen von Irit Katriel in gh-102828.)shutil.which()berücksichtigt nun die Umgebungsvariable PATHEXT, um unter Windows Übereinstimmungen im PATH zu finden, auch wenn der angegebene cmd eine Verzeichnungskomponente enthält. (Beigetragen von Charles Machalow in gh-103179.)shutil.which()ruftNeedCurrentDirectoryForExePathWauf, wenn unter Windows nach ausführbaren Dateien gesucht wird, um zu bestimmen, ob das aktuelle Arbeitsverzeichnis dem Suchpfad vorangestellt werden soll. (Beigetragen von Charles Machalow in gh-103179.)shutil.which()gibt unter Windows einen Pfad zurück, der mit cmd und einer Komponente ausPATHEXTübereinstimmt, vor einer direkten Übereinstimmung an anderer Stelle im Suchpfad. (Beigetragen von Charles Machalow in gh-103179.)
sqlite3¶
Eine Befehlszeilenschnittstelle wurde hinzugefügt. (Beigetragen von Erlend E. Aasland in gh-77617.)
Das Attribut
sqlite3.Connection.autocommitwurde zusqlite3.Connectionund der Parameter autocommit zusqlite3.connect()hinzugefügt, um die PEP 249-konforme Transaktionsbehandlung zu steuern. (Beigetragen von Erlend E. Aasland in gh-83638.)Der Keyword-only-Parameter entrypoint wurde zu
sqlite3.Connection.load_extension()hinzugefügt, um den SQLite-Extension-Entrypoint zu überschreiben. (Beigetragen von Erlend E. Aasland in gh-103015.)Die Methoden
sqlite3.Connection.getconfig()undsqlite3.Connection.setconfig()wurden zusqlite3.Connectionhinzugefügt, um Konfigurationsänderungen an einer Datenbankverbindung vorzunehmen. (Beigetragen von Erlend E. Aasland in gh-103489.)
statistics¶
Die Funktion
statistics.correlation()wurde um die Methoderankedzur Berechnung der Spearman-Korrelation von Rangdaten erweitert. (Beigetragen von Raymond Hettinger in gh-95861.)
sys¶
Fügt den `sys.monitoring`-Namespace hinzu, um die neue PEP 669 Monitoring API bereitzustellen. (Beigetragen von Mark Shannon in gh-103082.)
Fügt `sys.activate_stack_trampoline()` und `sys.deactivate_stack_trampoline()` zum Aktivieren und Deaktivieren von Stack-Profiler-Trampolinen hinzu, sowie `sys.is_stack_trampoline_active()` zum Abfragen, ob Stack-Profiler-Trampoline aktiv sind. (Beigetragen von Pablo Galindo und Christian Heimes mit Beiträgen von Gregory P. Smith [Google] und Mark Shannon in gh-96123.)
Fügt `sys.last_exc` hinzu, das die letzte nicht behandelte Ausnahme enthält, die ausgelöst wurde (für Anwendungsfälle des Post-Mortem-Debugging). Die drei Felder, die die gleichen Informationen in ihrer Legacy-Form enthalten, werden als veraltet markiert: `sys.last_type`, `sys.last_value` und `sys.last_traceback`. (Beigetragen von Irit Katriel in gh-102778.)
`sys._current_exceptions()` gibt nun eine Zuordnung von Thread-IDs zu Ausnahmeinstanzen zurück, anstatt zu einem Tupel `(typ, exc, tb)`.
`sys.setrecursionlimit()` und `sys.getrecursionlimit()`. Das Rekursionslimit gilt nun nur noch für Python-Code. Eingebaute Funktionen verwenden das Rekursionslimit nicht, sind aber durch einen anderen Mechanismus geschützt, der verhindert, dass Rekursion zu einem Absturz der virtuellen Maschine führt.
tempfile¶
Die Funktion `tempfile.NamedTemporaryFile` hat einen neuen optionalen Parameter `delete_on_close`. (Beigetragen von Evgeny Zorin in gh-58451.)
`tempfile.mkdtemp()` gibt nun immer einen absoluten Pfad zurück, auch wenn das an den Parameter `dir` übergebene Argument ein relativer Pfad ist.
threading¶
Fügt `threading.settrace_all_threads()` und `threading.setprofile_all_threads()` hinzu, die es ermöglichen, Trace- und Profilerfunktionen in allen laufenden Threads zusätzlich zum aufrufenden Thread zu setzen. (Beigetragen von Pablo Galindo in gh-93503.)
tkinter¶
`tkinter.Canvas.coords()` verflacht nun seine Argumente. Es akzeptiert nun nicht nur Koordinaten als separate Argumente (`x1, y1, x2, y2, ...`) und eine Sequenz von Koordinaten (`[x1, y1, x2, y2, ...]`), sondern auch Koordinaten, die in Paaren gruppiert sind (`(x1, y1), (x2, y2), ...` und `[(x1, y1), (x2, y2), ...]`), wie die `create_*()` Methoden. (Beigetragen von Serhiy Storchaka in gh-94473.)
tokenize
Das Modul `tokenize` enthält die in PEP 701 eingeführten Änderungen. (Beigetragen von Marta Gómez Macías und Pablo Galindo in gh-102856.) Weitere Informationen zu den Änderungen am Modul `tokenize` finden Sie unter [Porting to Python 3.12](whatsnew312-porting-to-python312).
types¶
Fügt `types.get_original_bases()` hinzu, um eine weitere Introspektion von User-defined generic types beim Unterklassifizieren zu ermöglichen. (Beigetragen von James Hilton-Balfe und Alex Waygood in gh-101827.)
typing¶
`isinstance()`-Prüfungen gegen `runtime-checkable protocols` verwenden nun `inspect.getattr_static()` anstelle von `hasattr()`, um nach dem Vorhandensein von Attributen zu suchen. Dies bedeutet, dass Deskriptoren und `__getattr__()`-Methoden nicht mehr unerwartet während `isinstance()`-Prüfungen gegen runtime-checkable protocols ausgewertet werden. Es kann jedoch auch bedeuten, dass einige Objekte, die früher als Instanzen eines runtime-checkable protocols galten, in Python 3.12+ möglicherweise nicht mehr als Instanzen dieses Protokolls gelten und umgekehrt. Die meisten Benutzer werden von dieser Änderung wahrscheinlich nicht betroffen sein. (Beigetragen von Alex Waygood in gh-102433.)
Die Mitglieder eines runtime-checkable protocols gelten nun zur Laufzeit als „eingefroren“, sobald die Klasse erstellt wurde. Monkey-Patching von Attributen auf ein runtime-checkable protocol funktioniert weiterhin, hat aber keine Auswirkung auf `isinstance()`-Prüfungen, die Objekte mit dem Protokoll vergleichen. Zum Beispiel
>>> 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
Diese Änderung wurde vorgenommen, um `isinstance()`-Prüfungen gegen runtime-checkable protocols zu beschleunigen.
Das Leistungsprofil von `isinstance()`-Prüfungen gegen `runtime-checkable protocols` hat sich erheblich geändert. Die meisten `isinstance()`-Prüfungen gegen Protokolle mit nur wenigen Mitgliedern sollten mindestens 2x schneller sein als in 3.11, und einige können 20x schneller oder mehr sein. `isinstance()`-Prüfungen gegen Protokolle mit vielen Mitgliedern können jedoch langsamer sein als in Python 3.11. (Beigetragen von Alex Waygood in gh-74690 und gh-103193.)
Alle `typing.TypedDict`- und `typing.NamedTuple`-Klassen verfügen nun über das Attribut `__orig_bases__`. (Beigetragen von Adrian Garcia Badaracco in gh-103699.)
Fügt den Parameter `frozen_default` zu `typing.dataclass_transform()` hinzu. (Beigetragen von Erik De Bonte in gh-99957.)
unicodedata¶
Die Unicode-Datenbank wurde auf Version 15.0.0 aktualisiert. (Beigetragen von Benjamin Peterson in gh-96734).
unittest¶
Fügt die Kommandozeilenoption `--durations` hinzu, die die N langsamsten Testfälle anzeigt.
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)
(Beigetragen von Giampaolo Rodola in gh-48330)
uuid¶
Fügt eine Kommandozeilenschnittstelle hinzu. (Beigetragen von Adam Chhina in gh-88597.)
Optimierungen¶
Entfernt die Member `wstr` und `wstr_length` aus Unicode-Objekten. Dies reduziert die Objektgröße um 8 oder 16 Bytes auf 64-Bit-Plattformen. (PEP 623) (Beigetragen von Inada Naoki in gh-92536.)
Fügt experimentelle Unterstützung für die Verwendung des BOLT-Binäroptimizierers im Build-Prozess hinzu, was die Leistung um 1-5% verbessert. (Beigetragen von Kevin Modzelewski in gh-90536 und optimiert von Donghee Na in gh-101525)
Beschleunigt die reguläre Ausdruckssubstitution (Funktionen `re.sub()` und `re.subn()` sowie entsprechende `re.Pattern`-Methoden) für Ersetzungszeichenketten, die Gruppenreferenzen enthalten, um das 2-3-fache. (Beigetragen von Serhiy Storchaka in gh-91524.)
Beschleunigt die Erstellung von `asyncio.Task` durch Verzögerung aufwändiger Zeichenkettenformatierungen. (Beigetragen von Itamar Oren in gh-103793.)
Die Funktionen `tokenize.tokenize()` und `tokenize.generate_tokens()` sind bis zu 64% schneller als Nebeneffekt der Änderungen, die erforderlich waren, um PEP 701 im Modul `tokenize` abzudecken. (Beigetragen von Marta Gómez Macías und Pablo Galindo in gh-102856.)
Beschleunigt `super()`-Methodenaufrufe und Attributladungen über die neue `LOAD_SUPER_ATTR`-Anweisung. (Beigetragen von Carl Meyer und Vladimir Matveev in gh-103497.)
CPython Bytecode-Änderungen¶
Entfernt die `LOAD_METHOD`-Anweisung. Sie wurde in `LOAD_ATTR` integriert. `LOAD_ATTR` verhält sich nun wie die alte `LOAD_METHOD`-Anweisung, wenn das niederwertigste Bit seines Opargs gesetzt ist. (Beigetragen von Ken Jin in gh-93429.)
Entfernt die Anweisungen `JUMP_IF_FALSE_OR_POP` und `JUMP_IF_TRUE_OR_POP`. (Beigetragen von Irit Katriel in gh-102859.)
Entfernt die `PRECALL`-Anweisung. (Beigetragen von Mark Shannon in gh-92925.)
Fügt die Anweisungen `BINARY_SLICE` und `STORE_SLICE` hinzu. (Beigetragen von Mark Shannon in gh-94163.)
Fügt die `CALL_INTRINSIC_1`-Anweisungen hinzu. (Beigetragen von Mark Shannon in gh-99005.)
Fügt die `CALL_INTRINSIC_2`-Anweisung hinzu. (Beigetragen von Irit Katriel in gh-101799.)
Fügt die `CLEANUP_THROW`-Anweisung hinzu. (Beigetragen von Brandt Bucher in gh-90997.)
Fügt die `END_SEND`-Anweisung hinzu. (Beigetragen von Mark Shannon in gh-103082.)
Fügt die `LOAD_FAST_AND_CLEAR`-Anweisung als Teil der Implementierung von PEP 709 hinzu. (Beigetragen von Carl Meyer in gh-101441.)
Fügt die `LOAD_FAST_CHECK`-Anweisung hinzu. (Beigetragen von Dennis Sweeney in gh-93143.)
Fügt die Opcodes `LOAD_FROM_DICT_OR_DEREF`, `LOAD_FROM_DICT_OR_GLOBALS` und `LOAD_LOCALS` als Teil der Implementierung von PEP 695 hinzu. Entfernt den `LOAD_CLASSDEREF`-Opcode, der durch `LOAD_LOCALS` plus `LOAD_FROM_DICT_OR_DEREF` ersetzt werden kann. (Beigetragen von Jelle Zijlstra in gh-103764.)
Fügt die `LOAD_SUPER_ATTR`-Anweisung hinzu. (Beigetragen von Carl Meyer und Vladimir Matveev in gh-103497.)
Fügt die `RETURN_CONST`-Anweisung hinzu. (Beigetragen von Wenyang Wang in gh-101632.)
Demos und Tools
Entfernt das Verzeichnis `Tools/demo/`, das alte Demo-Skripte enthielt. Eine Kopie ist im Projekt [old-demos](https://github.com/gvanrossum/old-demos) zu finden. (Beigetragen von Victor Stinner in gh-97681.)
Entfernt veraltete Beispielskripte aus dem Verzeichnis `Tools/scripts/`. Eine Kopie ist im Projekt [old-demos](https://github.com/gvanrossum/old-demos) zu finden. (Beigetragen von Victor Stinner in gh-97669.)
Veraltet¶
`argparse`: Die Parameter `type`, `choices` und `metavar` von `argparse.BooleanOptionalAction` sind veraltet und werden in 3.14 entfernt. (Beigetragen von Nikita Sobolev in gh-92248.)
`ast`: Die folgenden `ast`-Features wurden seit Python 3.8 in der Dokumentation als veraltet markiert, lösen nun bei Zugriff oder Verwendung eine `DeprecationWarning` aus und werden in Python 3.14 entfernt.
ast.Numast.Strast.Bytesast.NameConstantast.Ellipsis
Verwenden Sie stattdessen `ast.Constant`. (Beigetragen von Serhiy Storchaka in gh-90953.)
-
Die Klassen für Child-Watcher `asyncio.MultiLoopChildWatcher`, `asyncio.FastChildWatcher`, `asyncio.AbstractChildWatcher` und `asyncio.SafeChildWatcher` sind veraltet und werden in Python 3.14 entfernt. (Beigetragen von Kumar Aditya in gh-94597.)
`asyncio.set_child_watcher()`, `asyncio.get_child_watcher()`, `asyncio.AbstractEventLoopPolicy.set_child_watcher()` und `asyncio.AbstractEventLoopPolicy.get_child_watcher()` sind veraltet und werden in Python 3.14 entfernt. (Beigetragen von Kumar Aditya in gh-94597.)
Die Methode `get_event_loop()` der Standard-Event-Loop-Policy gibt nun eine `DeprecationWarning` aus, wenn kein aktueller Event-Loop gesetzt ist und die Policy einen erstellt. (Beigetragen von Serhiy Storchaka und Guido van Rossum in gh-100160.)
`calendar`: Die Konstanten `calendar.January` und `calendar.February` sind veraltet und werden durch `calendar.JANUARY` und `calendar.FEBRUARY` ersetzt. (Beigetragen von Prince Roshan in gh-103636.)
`collections.abc`: `collections.abc.ByteString` ist veraltet.
Verwenden Sie
isinstance(obj, collections.abc.Buffer), um zur Laufzeit zu testen, obobjdas Buffer-Protokoll implementiert. Für die Verwendung in Typ-Annotationen verwenden Sie entwederBufferoder eine Union, die explizit die von Ihrem Code unterstützten Typen angibt (z. B.bytes | bytearray | memoryview).`ByteString` war ursprünglich als abstrakte Klasse gedacht, die als Obertyp sowohl für `bytes` als auch für `bytearray` dienen sollte. Da die ABC jedoch nie Methoden hatte, wusste man nie wirklich etwas Nützliches über ein Objekt, nur dass es eine Instanz von `ByteString` war. Andere gängige Puffertypen wie `memoryview` wurden ebenfalls nie als Untertypen von `ByteString` (weder zur Laufzeit noch von statischen Typenprüfern) verstanden.
Weitere Details finden Sie in PEP 688. (Beigetragen von Shantanu Jain in gh-91896.)
`datetime`: Die Methoden `datetime.datetime.utcnow()` und `datetime.datetime.utcfromtimestamp()` sind veraltet und werden in einer zukünftigen Version entfernt. Verwenden Sie stattdessen zeitzonenbewusste Objekte, um Datums- und Zeitangaben in UTC darzustellen: rufen Sie `now()` bzw. `fromtimestamp()` mit dem Parameter `tz`, der auf `datetime.UTC` gesetzt ist, auf. (Beigetragen von Paul Ganssle in gh-103857.)
`email`: Der Parameter `isdst` in `email.utils.localtime()` ist veraltet. (Beigetragen von Alan Williams in gh-72346.)
`importlib.abc`: Die folgenden Klassen sind veraltet und werden für die Entfernung in Python 3.14 geplant.
importlib.abc.ResourceReaderimportlib.abc.Traversableimportlib.abc.TraversableResources
Verwenden Sie stattdessen die Klassen von `importlib.resources.abc`.
(Beigetragen von Jason R. Coombs und Hugo van Kemenade in gh-93963.)
`itertools`: Die Unterstützung für Kopier-, Deepcopy- und Pickle-Operationen ist veraltet, nicht dokumentiert, ineffizient, historisch fehlerhaft und inkonsistent. Dies wird in 3.14 entfernt, um das Codevolumen und den Wartungsaufwand erheblich zu reduzieren. (Beigetragen von Raymond Hettinger in gh-101588.)
multiprocessing: In Python 3.14 wird die Standard-Startmethode vonmultiprocessingauf Linux, BSDs und anderen Nicht-macOS-POSIX-Plattformen, wo derzeit'fork'der Standard ist, zu einer sichereren Methode geändert (gh-84559). Das Hinzufügen einer Laufzeitwarnung hierzu wurde als zu störend erachtet, da nicht erwartet wird, dass die Mehrheit des Codes dies betrifft. Verwenden Sie die APIsget_context()oderset_start_method(), um explizit anzugeben, wenn Ihr Code'fork'*benötigt*. Siehe Kontexte und Startmethoden.pkgutil:pkgutil.find_loader()undpkgutil.get_loader()sind veraltet und werden in Python 3.14 entfernt. Verwenden Sie stattdessenimportlib.util.find_spec(). (Beigesteuert von Nikita Sobolev in gh-97850.)pty: Das Modul hat zwei undokumentierte Funktionenmaster_open()undslave_open(), die seit Python 2 veraltet sind, aber erst in 3.12 eine ordnungsgemäßeDeprecationWarningerhielten. Entfernung in 3.14. (Beigesteuert von Soumendra Ganguly und Gregory P. Smith in gh-85984.)os:Die Felder
st_ctime, die vonos.stat()undos.lstat()unter Windows zurückgegeben werden, sind veraltet. In einer zukünftigen Version enthalten sie die letzte Änderungszeit der Metadaten, konsistent mit anderen Plattformen. Derzeit enthalten sie immer noch die Erstellungszeit, die auch im neuen Feldst_birthtimeverfügbar ist. (Beigesteuert von Steve Dower in gh-99726.)Auf POSIX-Plattformen kann
os.fork()jetzt eineDeprecationWarningauslösen, wenn erkannt werden kann, dass es von einem multithreaded Prozess aufgerufen wird. Es gab schon immer eine grundlegende Inkompatibilität mit der POSIX-Plattform, wenn dies geschah. Selbst wenn solcher Code *scheinbar* funktionierte. Die Warnung wurde hinzugefügt, um das Bewusstsein zu schärfen, da die Probleme, auf die Code mit dieser Vorgehensweise stößt, häufiger werden. Siehe die Dokumentation zuos.fork()für weitere Details sowie diese Diskussion über die Inkompatibilität von fork mit Threads, um zu verstehen, *warum* wir dieses langjährige Kompatibilitätsproblem der Plattform nun Entwicklern aufzeigen.
Wenn diese Warnung aufgrund der Verwendung von
multiprocessingoderconcurrent.futuresauftritt, besteht die Lösung darin, eine anderemultiprocessing-Startmethode wie"spawn"oder"forkserver"zu verwenden.shutil: Das Argument onerror vonshutil.rmtree()ist veraltet; verwenden Sie stattdessen onexc. (Beigesteuert von Irit Katriel in gh-102828.)-
Standard-Adapter und Konverter sind jetzt veraltet. Verwenden Sie stattdessen die Adapter- und Konverter-Rezepte und passen Sie diese an Ihre Bedürfnisse an. (Beigesteuert von Erlend E. Aasland in gh-90016.)
In
execute()wird jetzt eineDeprecationWarningausgegeben, wenn benannte Platzhalter zusammen mit Parametern verwendet werden, die als Sequenz anstelle einesdictübergeben werden. Ab Python 3.14 löst die Verwendung benannter Platzhalter mit als Sequenz übergebenen Parametern einenProgrammingErroraus. (Beigesteuert von Erlend E. Aasland in gh-101698.)
sys: Die Feldersys.last_type,sys.last_valueundsys.last_tracebacksind veraltet. Verwenden Sie stattdessensys.last_exc. (Beigesteuert von Irit Katriel in gh-102778.)tarfile: Das Extrahieren von Tar-Archiven ohne Angabe von filter ist bis Python 3.14 veraltet, dann wird der'data'-Filter zum Standard. Weitere Details finden Sie unter Extraktionsfilter.-
typing.Hashableundtyping.Sized, Aliase fürcollections.abc.Hashablebzw.collections.abc.Sized, sind veraltet. (gh-94309.)typing.ByteString, das seit Python 3.9 veraltet ist, löst jetzt eineDeprecationWarningaus, wenn es verwendet wird. (Beigesteuert von Alex Waygood in gh-91896.)
xml.etree.ElementTree: Das Modul gibt nun eineDeprecationWarningaus, wenn der Wahrheitswert einesxml.etree.ElementTree.Elementgeprüft wird. Zuvor gab die Python-Implementierung eineFutureWarningaus, und die C-Implementierung gab nichts aus. (Beigesteuert von Jacob Walls in gh-83122.)Die 3-Argument-Signaturen (type, value, traceback) von
coroutine throw(),generator throw()undasync generator throw()sind veraltet und können in einer zukünftigen Python-Version entfernt werden. Verwenden Sie stattdessen die Ein-Argument-Versionen dieser Funktionen. (Beigesteuert von Ofey Chan in gh-89874.)DeprecationWarningwird jetzt ausgelöst, wenn__package__eines Moduls von__spec__.parentabweicht (zuvor war esImportWarning). (Beigesteuert von Brett Cannon in gh-65961.)Das Setzen von
__package__oder__cached__für ein Modul ist veraltet und wird ab Python 3.14 vom Import-System nicht mehr berücksichtigt. (Beigesteuert von Brett Cannon in gh-65961.)Der bitweise Inversionsoperator (
~) für boolesche Werte ist veraltet. Er wird in Python 3.16 einen Fehler auslösen. Verwenden Sienotfür die logische Negation von booleschen Werten. In den seltenen Fällen, in denen Sie wirklich die bitweise Inversion des zugrunde liegendenintbenötigen, konvertieren Sie explizit zu int:~int(x). (Beigesteuert von Tim Hoffmann in gh-103487.)Der Zugriff auf
co_lnotabauf Codeobjekten war in Python 3.10 über PEP 626 veraltet, erhielt aber erst in 3.12 eine ordnungsgemäßeDeprecationWarning. Kann in 3.15 entfernt werden. (Beigesteuert von Nikita Sobolev in gh-101866.)
Zur Entfernung in Python 3.13 vorgesehen¶
Module (siehe PEP 594)
aifcaudioopcgicgitbchunkcryptimghdrmailcapmsilibnisnntplibossaudiodevpipessndhdrspwdsunautelnetlibuuxdrlib
Andere Module
lib2to3und das Programm 2to3 (gh-84540)
APIs
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)Verkettung von
classmethod-Deskriptoren (gh-89519)importlib.resourcesveraltete Methodencontents()is_resource()open_binary()open_text()path()read_binary()read_text()
Verwenden Sie stattdessen
importlib.resources.files(). Siehe importlib-resources: Migration von Legacy (gh-106531)
Wird in Python 3.14 entfernt¶
`argparse`: Die Parameter `type`, `choices` und `metavar` von `argparse.BooleanOptionalAction` sind veraltet und werden in 3.14 entfernt. (Beigetragen von Nikita Sobolev in gh-92248.)
ast: Die folgenden Funktionen sind in der Dokumentation seit Python 3.8 veraltet, lösen jetzt eineDeprecationWarningaus, wenn sie zur Laufzeit aufgerufen oder verwendet werden, und werden in Python 3.14 entfernt.ast.Numast.Strast.Bytesast.NameConstantast.Ellipsis
Verwenden Sie stattdessen `ast.Constant`. (Beigetragen von Serhiy Storchaka in gh-90953.)
-
Die Klassen für Child-Watcher `asyncio.MultiLoopChildWatcher`, `asyncio.FastChildWatcher`, `asyncio.AbstractChildWatcher` und `asyncio.SafeChildWatcher` sind veraltet und werden in Python 3.14 entfernt. (Beigetragen von Kumar Aditya in gh-94597.)
`asyncio.set_child_watcher()`, `asyncio.get_child_watcher()`, `asyncio.AbstractEventLoopPolicy.set_child_watcher()` und `asyncio.AbstractEventLoopPolicy.get_child_watcher()` sind veraltet und werden in Python 3.14 entfernt. (Beigetragen von Kumar Aditya in gh-94597.)
Die Methode `get_event_loop()` der Standard-Event-Loop-Policy gibt nun eine `DeprecationWarning` aus, wenn kein aktueller Event-Loop gesetzt ist und die Policy einen erstellt. (Beigetragen von Serhiy Storchaka und Guido van Rossum in gh-100160.)
email: Der Parameter isdst inemail.utils.localtime()ist veraltet. (Beigesteuert von Alan Williams in gh-72346.)importlib.abcveraltete Klassenimportlib.abc.ResourceReaderimportlib.abc.Traversableimportlib.abc.TraversableResources
Verwenden Sie stattdessen die Klassen von `importlib.resources.abc`.
(Beigetragen von Jason R. Coombs und Hugo van Kemenade in gh-93963.)
itertoolshatte undokumentierte, ineffiziente, historisch fehlerhafte und inkonsistente Unterstützung für Kopier-, Tiefkopier- und Pickle-Operationen. Diese werden in 3.14 entfernt, was zu einer erheblichen Reduzierung des Codeumfangs und des Wartungsaufwands führt. (Beigesteuert von Raymond Hettinger in gh-101588.)multiprocessing: Die Standard-Startmethode wird auf Linux, BSDs und anderen Nicht-macOS-POSIX-Plattformen, wo derzeit'fork'der Standard ist, zu einer sichereren Methode geändert (gh-84559). Das Hinzufügen einer Laufzeitwarnung hierzu wurde als zu störend erachtet, da nicht erwartet wird, dass die Mehrheit des Codes dies betrifft. Verwenden Sie die APIsget_context()oderset_start_method(), um explizit anzugeben, wenn Ihr Code'fork'*benötigt*. Siehe Kontexte und Startmethoden.pathlib:is_relative_to()undrelative_to(): das Übergeben zusätzlicher Argumente ist veraltet.pkgutil:pkgutil.find_loader()undpkgutil.get_loader()geben jetztDeprecationWarningaus; verwenden Sie stattdessenimportlib.util.find_spec(). (Beigesteuert von Nikita Sobolev in gh-97850.)pty:master_open(): Verwenden Siepty.openpty().slave_open(): Verwenden Siepty.openpty().
-
versionundversion_info.execute()undexecutemany(), wenn benannte Platzhalter verwendet werden und parameters eine Sequenz anstelle einesdictist.
urllib:urllib.parse.Quoterist veraltet: Es war nicht als öffentliche API vorgesehen. (Beigesteuert von Gregory P. Smith in gh-88168.)
Zur Entfernung vorgesehen in Python 3.15¶
Das Importsystem
Das Setzen von
__cached__für ein Modul, während__spec__.cachednicht gesetzt wird, ist veraltet. In Python 3.15 wird__cached__vom Import-System oder der Standardbibliothek nicht mehr gesetzt oder berücksichtigt. (gh-97879)Das Setzen von
__package__für ein Modul, während__spec__.parentnicht gesetzt wird, ist veraltet. In Python 3.15 wird__package__vom Import-System oder der Standardbibliothek nicht mehr gesetzt oder berücksichtigt. (gh-97879)
-
Die undokumentierte Funktion
ctypes.SetPointerType()ist seit Python 3.13 veraltet.
-
Die veraltete und selten genutzte
CGIHTTPRequestHandlerist seit Python 3.13 veraltet. Es gibt keinen direkten Ersatz. *Alles* ist besser als CGI, um einen Webserver mit einem Request-Handler zu verbinden.Das Flag
--cgifür die Kommandozeilenschnittstelle python -m http.server ist seit Python 3.13 veraltet.
-
Methode
load_module(): verwenden Sie stattdessenexec_module().
-
Die Funktion
getdefaultlocale()ist seit Python 3.11 veraltet. Ihre Entfernung war ursprünglich für Python 3.13 (gh-90817) geplant, wurde aber auf Python 3.15 verschoben. Verwenden Sie stattdessengetlocale(),setlocale()undgetencoding(). (Beigesteuert von Hugo van Kemenade in gh-111187.)
-
PurePath.is_reserved()ist seit Python 3.13 veraltet. Verwenden Sieos.path.isreserved(), um reservierte Pfade unter Windows zu erkennen.
-
java_ver()ist seit Python 3.13 veraltet. Diese Funktion ist nur für die Jython-Unterstützung nützlich, hat eine verwirrende API und wird weitgehend nicht getestet.
-
Das Argument check_home von
sysconfig.is_python_build()ist seit Python 3.12 veraltet.
-
RLock()wird in Python 3.15 keine Argumente mehr akzeptieren. Das Übergeben von Argumenten ist seit Python 3.14 veraltet, da die Python-Version keine Argumente zulässt, die C-Version jedoch beliebige Positions- oder Schlüsselwortargumente zulässt und alle ignoriert.
-
types.CodeType: Der Zugriff aufco_lnotabwar in PEP 626 seit 3.10 veraltet und sollte ursprünglich in 3.12 entfernt werden, erhielt aber erst in 3.12 eine ordnungsgemäßeDeprecationWarning. Kann in 3.15 entfernt werden. (Beigesteuert von Nikita Sobolev in gh-101866.)
-
Die undokumentierte Schlüsselwortargument-Syntax für die Erstellung von
NamedTuple-Klassen (z. B.Point = NamedTuple("Point", x=int, y=int)) ist seit Python 3.13 veraltet. Verwenden Sie stattdessen die klassenbasierte Syntax oder die funktionale Syntax.Bei Verwendung der funktionalen Syntax von
TypedDicts ist das Fehlen eines Wertes für den Parameter fields (TD = TypedDict("TD")) oder das Übergeben vonNone(TD = TypedDict("TD", None)) seit Python 3.13 veraltet. Verwenden Sieclass TD(TypedDict): passoderTD = TypedDict("TD", {}), um ein TypedDict mit null Feldern zu erstellen.Der Dekorator
typing.no_type_check_decorator()ist seit Python 3.13 veraltet. Nach acht Jahren im Modultypingwurde er von keinem wichtigen Typ-Checker unterstützt.
wave:Die Methoden
getmark(),setmark()undgetmarkers()der KlassenWave_readundWave_writesind seit Python 3.13 veraltet.
-
load_module()ist seit Python 3.10 veraltet. Verwenden Sie stattdessenexec_module(). (Beigetragen von Jiahao Li in gh-125746.)
Vorschlag zur Entfernung in Python 3.16¶
Das Importsystem
Das Setzen von
__loader__für ein Modul, während gleichzeitig__spec__.loadernicht gesetzt wird, ist veraltet. In Python 3.16 wird__loader__vom Importsystem und der Standardbibliothek weder gesetzt noch berücksichtigt.
-
Der Formatcode
'u'(wchar_t) ist seit Python 3.3 in der Dokumentation und seit Python 3.13 zur Laufzeit veraltet. Verwenden Sie stattdessen den Formatcode'w'(Py_UCS4) für Unicode-Zeichen.
-
asyncio.iscoroutinefunction()ist veraltet und wird in Python 3.16 entfernt; verwenden Sie stattdesseninspect.iscoroutinefunction(). (Beigetragen von Jiahao Li und Kumar Aditya in gh-122875.)Das Richtliniensystem von
asyncioist veraltet und wird in Python 3.16 entfernt. Insbesondere sind die folgenden Klassen und Funktionen veraltet:Benutzer sollten
asyncio.run()oderasyncio.Runnermit loop_factory verwenden, um die gewünschte Event-Loop-Implementierung zu nutzen.Zum Beispiel, um
asyncio.SelectorEventLoopunter Windows zu verwendenimport asyncio async def main(): ... asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
(Beigetragen von Kumar Aditya in gh-127949.)
-
Bitweise Inversion auf booleschen Typen,
~Trueoder~False, ist seit Python 3.12 veraltet, da sie überraschende und unintuitive Ergebnisse liefert (-2und-1). Verwenden Sie stattdessennot xfür die logische Negation eines Boole-Wertes. In dem seltenen Fall, dass Sie die bitweise Inversion der zugrunde liegenden Ganzzahl benötigen, konvertieren Sie explizit zuint(~int(x)).
-
Das Aufrufen der Python-Implementierung von
functools.reduce()mit function oder sequence als Schlüsselwortargumente ist seit Python 3.14 veraltet.
-
Die Unterstützung für benutzerdefinierte Logging-Handler mit dem Argument strm ist veraltet und soll in Python 3.16 entfernt werden. Definieren Sie Handler stattdessen mit dem Argument stream. (Beigetragen von Mariusz Felisiak in gh-115032.)
-
Gültige Erweiterungen beginnen mit einem Punkt oder sind leer für
mimetypes.MimeTypes.add_type(). Nicht-punktierte Erweiterungen sind veraltet und lösen in Python 3.16 einenValueErroraus. (Beigetragen von Hugo van Kemenade in gh-75223.)
-
Die Ausnahme
ExecErrorist seit Python 3.14 veraltet. Sie wurde seit Python 3.4 von keiner Funktion inshutilverwendet und ist nun ein Alias fürRuntimeError.
-
Die Methode
Class.get_methodsist seit Python 3.14 veraltet.
sys:Die Funktion
_enablelegacywindowsfsencoding()ist seit Python 3.13 veraltet. Verwenden Sie stattdessen die UmgebungsvariablePYTHONLEGACYWINDOWSFSENCODING.
-
Die Funktion
sysconfig.expand_makefile_vars()ist seit Python 3.14 veraltet. Verwenden Sie stattdessen das Argument vars vonsysconfig.get_paths().
-
Das undokumentierte und ungenutzte Attribut
TarFile.tarfileist seit Python 3.13 veraltet.
Zur Entfernung vorgesehen in Python 3.17¶
-
collections.abc.ByteStringist für die Entfernung in Python 3.17 geplant.Verwenden Sie
isinstance(obj, collections.abc.Buffer), um zur Laufzeit zu testen, obobjdas Buffer-Protokoll implementiert. Für die Verwendung in Typ-Annotationen verwenden Sie entwederBufferoder eine Union, die explizit die von Ihrem Code unterstützten Typen angibt (z. B.bytes | bytearray | memoryview).`ByteString` war ursprünglich als abstrakte Klasse gedacht, die als Obertyp sowohl für `bytes` als auch für `bytearray` dienen sollte. Da die ABC jedoch nie Methoden hatte, wusste man nie wirklich etwas Nützliches über ein Objekt, nur dass es eine Instanz von `ByteString` war. Andere gängige Puffertypen wie `memoryview` wurden ebenfalls nie als Untertypen von `ByteString` (weder zur Laufzeit noch von statischen Typenprüfern) verstanden.
Weitere Details finden Sie unter PEP 688. (Beigesteuert von Shantanu Jain in gh-91896.)
-
Vor Python 3.14 wurden alte Unions mit der privaten Klasse
typing._UnionGenericAliasimplementiert. Diese Klasse wird für die Implementierung nicht mehr benötigt, wurde aber zur Abwärtskompatibilität beibehalten und soll spätestens in Python 3.17 entfernt werden. Benutzer sollten dokumentierte Introspektionshilfen wietyping.get_origin()undtyping.get_args()verwenden, anstatt sich auf private Implementierungsdetails zu verlassen.typing.ByteString, das seit Python 3.9 veraltet ist, ist für die Entfernung in Python 3.17 geplant.Verwenden Sie
isinstance(obj, collections.abc.Buffer), um zur Laufzeit zu testen, obobjdas Buffer-Protokoll implementiert. Für die Verwendung in Typ-Annotationen verwenden Sie entwederBufferoder eine Union, die explizit die von Ihrem Code unterstützten Typen angibt (z. B.bytes | bytearray | memoryview).`ByteString` war ursprünglich als abstrakte Klasse gedacht, die als Obertyp sowohl für `bytes` als auch für `bytearray` dienen sollte. Da die ABC jedoch nie Methoden hatte, wusste man nie wirklich etwas Nützliches über ein Objekt, nur dass es eine Instanz von `ByteString` war. Andere gängige Puffertypen wie `memoryview` wurden ebenfalls nie als Untertypen von `ByteString` (weder zur Laufzeit noch von statischen Typenprüfern) verstanden.
Weitere Details finden Sie unter PEP 688. (Beigesteuert von Shantanu Jain in gh-91896.)
Zur Entfernung vorgesehen in zukünftigen Versionen¶
Die folgenden APIs werden in Zukunft entfernt, obwohl derzeit kein Datum für ihre Entfernung geplant ist.
-
Verschachtelte Argumentgruppen und verschachtelte gegenseitig ausschließende Gruppen sind veraltet.
Das Übergeben des undokumentierten Schlüsselwortarguments prefix_chars an
add_argument_group()ist nun veraltet.Der Typ-Konverter
argparse.FileTypeist veraltet.
-
Generatoren: Die Signatur
throw(type, exc, tb)undathrow(type, exc, tb)ist veraltet: verwenden Sie stattdessenthrow(exc)undathrow(exc), die Signatur mit einem einzigen Argument.Derzeit akzeptiert Python numerische Literale, denen unmittelbar Schlüsselwörter folgen, z. B.
0in x,1or x,0if 1else 2. Dies ermöglicht verwirrende und mehrdeutige Ausdrücke wie[0x1for x in y](was als[0x1 for x in y]oder[0x1f or x in y]interpretiert werden kann). Eine Syntaxwarnung wird ausgegeben, wenn dem numerischen Literal unmittelbar eines der Schlüsselwörterand,else,for,if,in,isundorfolgt. In einer zukünftigen Version wird dies zu einem Syntaxfehler geändert. (gh-87999)Unterstützung für die Methode
__index__()und__int__(), die einen Nicht-Int-Typ zurückgibt: diese Methoden müssen eine Instanz einer strengen Unterklasse vonintzurückgeben.Unterstützung für die Methode
__float__(), die eine strenge Unterklasse vonfloatzurückgibt: diese Methoden müssen eine Instanz vonfloatzurückgeben.Unterstützung für die Methode
__complex__(), die eine strenge Unterklasse voncomplexzurückgibt: diese Methoden müssen eine Instanz voncomplexzurückgeben.Delegation von
int()an die Methode__trunc__().Das Übergeben einer komplexen Zahl als Argument real oder imag im Konstruktor
complex()ist nun veraltet; sie sollte nur als einzelnes Positionsargument übergeben werden. (Beigetragen von Serhiy Storchaka in gh-109218.)
`calendar`: Die Konstanten `calendar.January` und `calendar.February` sind veraltet und werden durch `calendar.JANUARY` und `calendar.FEBRUARY` ersetzt. (Beigetragen von Prince Roshan in gh-103636.)
codecs: Verwenden Sieopen()anstelle voncodecs.open(). (gh-133038)codeobject.co_lnotab: Verwenden Sie stattdessen die Methodecodeobject.co_lines().-
utcnow(): Verwenden Siedatetime.datetime.now(tz=datetime.UTC).utcfromtimestamp(): Verwenden Siedatetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC).
gettext: Der Pluralwert muss eine ganze Zahl sein.-
Der Parameter debug_override von
cache_from_source()ist veraltet: verwenden Sie stattdessen den Parameter optimization.
-
Schnittstelle des
EntryPoints-Tupels.Implizites
Nonebei Rückgabewerten.
logging: Die Methodewarn()ist seit Python 3.3 veraltet, verwenden Sie stattdessenwarning().mailbox: Die Verwendung von StringIO-Eingabe und Textmodus ist veraltet, verwenden Sie stattdessen BytesIO und Binärmodus.os: Aufruf vonos.register_at_fork()in einem Multithreading-Prozess.pydoc.ErrorDuringImport: Die Übergabe eines Tupelwerts für den Parameter exc_info ist veraltet, verwenden Sie stattdessen eine Ausnahmeinstanz.re: Für numerische Gruppennummern und Gruppennamen in regulären Ausdrücken werden nun strengere Regeln angewendet. Nur eine Sequenz von ASCII-Ziffern wird nun als numerische Referenz akzeptiert. Der Gruppenname in Byte-Mustern und Ersetzungszeichenfolgen darf nun nur ASCII-Buchstaben, Ziffern und Unterstriche enthalten. (Beigetragen von Serhiy Storchaka in gh-91760.)Module
sre_compile,sre_constantsundsre_parse.shutil: Das Parameter onerror vonrmtree()ist in Python 3.12 veraltet; verwenden Sie stattdessen den Parameter onexc.SSL-Optionen und -Protokolle
ssl.SSLContextohne Protokollargument ist veraltet.ssl.SSLContext:set_npn_protocols()undselected_npn_protocol()sind veraltet: verwenden Sie stattdessen ALPN.Optionen
ssl.OP_NO_SSL*Optionen
ssl.OP_NO_TLS*ssl.PROTOCOL_SSLv3ssl.PROTOCOL_TLSssl.PROTOCOL_TLSv1ssl.PROTOCOL_TLSv1_1ssl.PROTOCOL_TLSv1_2ssl.TLSVersion.SSLv3ssl.TLSVersion.TLSv1ssl.TLSVersion.TLSv1_1
Methoden von
threadingthreading.Condition.notifyAll(): verwenden Sienotify_all().threading.Event.isSet(): verwenden Sieis_set().threading.Thread.isDaemon(),threading.Thread.setDaemon(): verwenden Sie das Attributthreading.Thread.daemon.threading.Thread.getName(),threading.Thread.setName(): verwenden Sie das Attributthreading.Thread.name.threading.currentThread(): verwenden Siethreading.current_thread().threading.activeCount(): verwenden Siethreading.active_count().
Die interne Klasse
typing._UnionGenericAliaswird nicht mehr zur Implementierung vontyping.Unionverwendet. Um die Kompatibilität mit Benutzern dieser privaten Klasse zu erhalten, wird bis mindestens Python 3.17 ein Kompatibilitäts-Shim bereitgestellt. (Beigetragen von Jelle Zijlstra in gh-105499.)unittest.IsolatedAsyncioTestCase: Es ist veraltet, einen Wert zurückzugeben, der nichtNoneist, von einem Testfall.Veraltete Funktionen in
urllib.parse: stattdessenurlparse()splitattr()splithost()splitnport()splitpasswd()splitport()splitquery()splittag()splittype()splituser()splitvalue()to_bytes()
wsgiref:SimpleHandler.stdout.write()sollte keine Teil-Schreibvorgänge durchführen.xml.etree.ElementTree: Das Testen des Wahrheitswerts einesElementist veraltet. In einer zukünftigen Version wird dies immerTruezurückgeben. Bevorzugen Sie explizite Tests mitlen(elem)oderelem is not None.sys._clear_type_cache()ist veraltet: verwenden Sie stattdessensys._clear_internal_caches().
Entfernt¶
asynchat und asyncore¶
configparser¶
Mehrere Namen, die im
configparserbereits 3.2 veraltet waren, wurden gemäß gh-89336 entfernt.configparser.ParsingErrorhat keinfilenameAttribut oder Argument mehr. Verwenden Sie stattdessen das Attribut und das Argumentsource.configparserhat keineSafeConfigParserKlasse mehr. Verwenden Sie stattdessen den kürzeren NamenConfigParser.configparser.ConfigParserhat keinereadfpMethode mehr. Verwenden Sie stattdessenread_file().
distutils¶
Entfernen Sie das
distutilsPaket. Es wurde in Python 3.10 gemäß PEP 632 „Deprecate distutils module“ veraltet. Für Projekte, die immer nochdistutilsverwenden und nicht aktualisiert werden können, kann dassetuptoolsPaket installiert werden: es stellt immer nochdistutilsbereit. (Beigetragen von Victor Stinner in gh-92584.)
ensurepip¶
Entfernen Sie das gebündelte setuptools Wheel aus
ensurepipund hören Sie auf, setuptools in Umgebungen zu installieren, die vonvenverstellt wurden.pip (>= 22.1)benötigt kein installiertes setuptools in der Umgebung.setuptools-basierte (unddistutils-basierte) Pakete können weiterhin mitpip installverwendet werden, da pip setuptools in der Build-Umgebung bereitstellt, die es für das Erstellen eines Pakets verwendet.easy_install,pkg_resources,setuptoolsunddistutilswerden nicht mehr standardmäßig in Umgebungen bereitgestellt, die mitvenverstellt oder mitensurepipgebootstrapped wurden, da sie Teil dessetuptools-Pakets sind. Für Projekte, die diese zur Laufzeit verwenden, sollte dassetuptools-Projekt als Abhängigkeit deklariert und separat installiert werden (typischerweise mit pip).(Beigetragen von Pradyun Gedam in gh-95299.)
enum¶
ftplib¶
gzip¶
Entfernen Sie das
filename-Attribut vongzipsgzip.GzipFile, das seit Python 2.6 veraltet ist, verwenden Sie stattdessen dasname-Attribut. Im Schreibmodus fügte dasfilename-Attribut die Dateierweiterung'.gz'hinzu, wenn sie nicht vorhanden war. (Beigetragen von Victor Stinner in gh-94196.)
hashlib¶
Entfernen Sie die reine Python-Implementierung von
hashlibshashlib.pbkdf2_hmac(), die in Python 3.10 veraltet war. Python 3.10 und neuer erfordert OpenSSL 1.1.1 (PEP 644): diese OpenSSL-Version bietet eine C-Implementierung vonpbkdf2_hmac(), die schneller ist. (Beigetragen von Victor Stinner in gh-94199.)
importlib¶
Viele zuvor als veraltet markierte Bereinigungen in
importlibwurden nun abgeschlossen.Referenzen auf und Unterstützung für
module_repr()wurde entfernt. (Beigetragen von Barry Warsaw in gh-97850.)importlib.util.set_package,importlib.util.set_loaderundimportlib.util.module_for_loaderwurden alle entfernt. (Beigetragen von Brett Cannon und Nikita Sobolev in gh-65961 und gh-97850.)Unterstützung für die
find_loader()undfind_module()APIs wurde entfernt. (Beigetragen von Barry Warsaw in gh-98040.)importlib.abc.Finder,pkgutil.ImpImporterundpkgutil.ImpLoaderwurden entfernt. (Beigetragen von Barry Warsaw in gh-98040.)
imp¶
Das
imp-Modul wurde entfernt. (Beigetragen von Barry Warsaw in gh-98040.)Konsultieren Sie zur Migration die folgende Korrespondenztabelle
imp
importlib
imp.NullImporterFügen Sie
Noneinsys.path_importer_cacheeinimp.cache_from_source()imp.find_module()imp.get_magic()imp.get_suffixes()importlib.machinery.SOURCE_SUFFIXES,importlib.machinery.EXTENSION_SUFFIXESundimportlib.machinery.BYTECODE_SUFFIXESimp.get_tag()imp.load_module()imp.new_module(name)types.ModuleType(name)imp.reload()imp.source_from_cache()imp.load_source()Siehe unten
Ersetzen Sie
imp.load_source()durchimport 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
Entfernen Sie
imp-Funktionen und -Attribute ohne ErsatzUndokumentierte Funktionen
imp.init_builtin()imp.load_compiled()imp.load_dynamic()imp.load_package()
imp.lock_held(),imp.acquire_lock(),imp.release_lock(): das Sperrschema wurde in Python 3.3 auf sperren pro Modul umgestellt.Konstanten von
imp.find_module():SEARCH_ERROR,PY_SOURCE,PY_COMPILED,C_EXTENSION,PY_RESOURCE,PKG_DIRECTORY,C_BUILTIN,PY_FROZEN,PY_CODERESOURCE,IMP_HOOK.
io¶
Entfernen Sie
iosio.OpenWrapperund_pyio.OpenWrapper, die in Python 3.10 veraltet waren: verwenden Sie stattdessen einfachopen(). Die Funktionopen()(io.open()) ist eine eingebaute Funktion. Seit Python 3.10 ist_pyio.open()ebenfalls eine statische Methode. (Beigetragen von Victor Stinner in gh-94169.)
locale¶
Entfernen Sie die Funktion
localeslocale.format(), die in Python 3.7 veraltet war: verwenden Sie stattdessenlocale.format_string(). (Beigetragen von Victor Stinner in gh-94226.)
smtpd¶
sqlite3¶
Die folgenden undokumentierten
sqlite3-Funktionen, die in Python 3.10 veraltet waren, sind nun entfernt wordensqlite3.enable_shared_cache()sqlite3.OptimizedUnicode
Wenn ein Shared Cache verwendet werden muss, öffnen Sie die Datenbank im URI-Modus unter Verwendung des Query-Parameters
cache=shared.Die Textfabrik
sqlite3.OptimizedUnicodeist seit Python 3.3 ein Alias fürstr. Code, der zuvor die Textfabrik aufOptimizedUnicodegesetzt hat, kann entweder explizitstrverwenden oder sich auf den Standardwert verlassen, der ebenfallsstrist.(Beigetragen von Erlend E. Aasland in gh-92548.)
ssl¶
Entfernen Sie die Funktion
sslsssl.RAND_pseudo_bytes(), die in Python 3.6 veraltet war: verwenden Sie stattdessenos.urandom()oderssl.RAND_bytes(). (Beigetragen von Victor Stinner in gh-94199.)Entfernen Sie die Funktion
ssl.match_hostname(). Sie wurde in Python 3.7 veraltet. OpenSSL führt seit Python 3.7 die Hostnamenübereinstimmung durch, Python verwendet die Funktionssl.match_hostname()nicht mehr. (Beigetragen von Victor Stinner in gh-94199.)Entfernen Sie die Funktion
ssl.wrap_socket(), die in Python 3.7 veraltet war: erstellen Sie stattdessen einssl.SSLContext-Objekt und rufen Sie seine Methodessl.SSLContext.wrap_socketauf. Jedes Paket, das immer nochssl.wrap_socket()verwendet, ist defekt und unsicher. Die Funktion sendet weder eine SNI TLS-Erweiterung noch validiert sie den Servernamen. Der Code unterliegt CWE 295 (Fehlerhafte Zertifikatsvalidierung). (Beigetragen von Victor Stinner in gh-94199.)
unittest¶
Entfernen Sie viele lange als veraltet markierte
unittest-FunktionenEine Reihe von
TestCase-Methoden-AliaseVeralteter Alias
Methodenname
Veraltet in
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
Sie können https://github.com/isidentical/teyit verwenden, um Ihre Unit-Tests automatisch zu modernisieren.
Undokumentierte und fehlerhafte
TestCase-MethodeassertDictContainsSubset(veraltet seit Python 3.2).Undokumentierter
TestLoader.loadTestsFromModule-Parameter use_load_tests (veraltet und ignoriert seit Python 3.5).Ein Alias der Klasse
TextTestResult:_TextTestResult(veraltet seit Python 3.2).
(Beigetragen von Serhiy Storchaka in gh-89325.)
webbrowser¶
Entfernen Sie die Unterstützung für veraltete Browser aus
webbrowser. Die entfernten Browser umfassen: Grail, Mosaic, Netscape, Galeon, Skipstone, Iceape, Firebird und Firefox-Versionen 35 und darunter (gh-102871).
xml.etree.ElementTree¶
Entfernen Sie die Methode
ElementTree.Element.copy()der reinen Python-Implementierung, die in Python 3.10 veraltet war, verwenden Sie stattdessen die Funktioncopy.copy(). Die C-Implementierung vonxml.etree.ElementTreehat keinecopy()-Methode, nur eine__copy__()-Methode. (Beigetragen von Victor Stinner in gh-94383.)
zipimport¶
Sonstiges¶
Entfernen Sie die Regel
suspiciousaus dem Dokumentations-MakefileMakefileundDoc/tools/rstlint.py, beide zugunsten von sphinx-lint. (Beigetragen von Julien Palard in gh-98179.)Entfernen Sie die Parameter keyfile und certfile aus den Modulen
ftplib,imaplib,poplibundsmtplibsowie die Parameter key_file, cert_file und check_hostname aus dem Modulhttp.client, die alle seit Python 3.6 veraltet waren. Verwenden Sie stattdessen den Parameter context (ssl_context inimaplib). (Beigetragen von Victor Stinner in gh-94172.)Entfernen Sie
Jython-Kompatibilitäts-Hacks aus mehreren Standardbibliotheksmodulen und Tests. (Beigetragen von Nikita Sobolev in gh-99482.)Entfernen Sie das Flag
_use_broken_old_ctypes_structure_semantics_aus demctypes-Modul. (Beigetragen von Nikita Sobolev in gh-99285.)
Portierung auf Python 3.12¶
Dieser Abschnitt listet zuvor beschriebene Änderungen und weitere Fehlerbehebungen auf, die möglicherweise Änderungen an Ihrem Code erfordern.
Änderungen in der Python-API¶
Strengere Regeln werden nun für numerische Gruppenreferenzen und Gruppennamen in regulären Ausdrücken angewendet. Nur eine Sequenz von ASCII-Ziffern wird jetzt als numerische Referenz akzeptiert. Der Gruppenname in Byte-Mustern und Ersetzungszeichenfolgen kann nun nur ASCII-Buchstaben und Ziffern sowie Unterstriche enthalten. (Beigetragen von Serhiy Storchaka in gh-91760.)
Entfernen Sie die seit Python 3.10 veraltete Funktionalität von
randrange(). Früher wurderandrange(10.0)verlustfrei inrandrange(10)umgewandelt. Jetzt löst es einenTypeErroraus. Außerdem wurde die Ausnahme, die für nicht-ganzzahlige Werte wierandrange(10.5)oderrandrange('10')ausgelöst wurde, vonValueErrorzuTypeErrorgeändert. Dies verhindert auch Fehler, bei denenrandrange(1e25)stillschweigend aus einem größeren Bereich alsrandrange(10**25)auswählte. (Ursprünglich vorgeschlagen von Serhiy Storchaka gh-86388.)argparse.ArgumentParserhat die Kodierung und den Fehlerbehandlungsmechanismus für das Lesen von Argumenten aus Dateien (z.B. die Optionfromfile_prefix_chars) von der Standardtextkodierung (z.B.locale.getpreferredencoding(False)) zum Dateisystemkodierung und Fehlerhandler geändert. Argumentdateien sollten unter Windows in UTF-8 und nicht in ANSI-Codepage kodiert sein.Das
asyncore-basiertesmtpd-Modul, das in Python 3.4.7 und 3.5.4 veraltet war, wurde entfernt. Eine empfohlene Alternative ist dasasyncio-basierte aiosmtpd PyPI-Modul.shlex.split(): Das Übergeben vonNonefür das Argument s löst nun eine Ausnahme aus, anstatt vonsys.stdinzu lesen. Die Funktion war in Python 3.9 veraltet. (Beigetragen von Victor Stinner in gh-94352.)Das Modul
osakzeptiert keine bytes-ähnlichen Pfade mehr, wie z.B.bytearrayundmemoryview-Typen: nur der exaktebytes-Typ wird für Bytes-Strings akzeptiert. (Beigetragen von Victor Stinner in gh-98393.)syslog.openlog()undsyslog.closelog()schlagen nun fehl, wenn sie in Subinterpretern verwendet werden.syslog.syslog()kann weiterhin in Subinterpretern verwendet werden, aber nur, wennsyslog.openlog()bereits im Hauptinterpreter aufgerufen wurde. Diese neuen Einschränkungen gelten nicht für den Hauptinterpreter, daher sind nur sehr wenige Benutzer betroffen. Diese Änderung hilft bei der Interpreterisolierung. Darüber hinaus istsyslogein Wrapper um prozessweite globale Ressourcen, die am besten vom Hauptinterpreter aus verwaltet werden. (Beigetragen von Donghee Na in gh-99127.)Das undokumentierte Sperrverhalten von
cached_property()wurde entfernt, da es über alle Instanzen der Klasse gesperrt hat, was zu hoher Sperrkonkurrenz führte. Dies bedeutet, dass eine Getter-Funktion für eine Cache-Eigenschaft nun mehr als einmal für eine einzelne Instanz ausgeführt werden könnte, wenn zwei Threads konkurrieren. Für die meisten einfachen Cache-Eigenschaften (z.B. solche, die idempotent sind und einfach einen Wert basierend auf anderen Attributen der Instanz berechnen) wird dies in Ordnung sein. Wenn Synchronisation erforderlich ist, implementieren Sie die Sperrung innerhalb der Getter-Funktion der Cache-Eigenschaft oder um Multi-Thread-Zugriffspunkte.`sys._current_exceptions()` gibt nun eine Zuordnung von Thread-IDs zu Ausnahmeinstanzen zurück, anstatt zu einem Tupel `(typ, exc, tb)`.
Beim Extrahieren von Tar-Dateien mit
tarfileodershutil.unpack_archive()übergeben Sie das Argument filter, um Funktionen zu begrenzen, die überraschend oder gefährlich sein können. Einzelheiten finden Sie unter Extraktionsfilter.Die Ausgabe der Funktionen
tokenize.tokenize()undtokenize.generate_tokens()wurde aufgrund der Änderungen in PEP 701 geändert. Das bedeutet, dassSTRING-Token für f-Strings nicht mehr ausgegeben werden und die in PEP 701 beschriebenen Token nun stattdessen erzeugt werden:FSTRING_START,FSTRING_MIDDLEundFSTRING_ENDwerden nun für f-String "String"-Teile zusätzlich zu den entsprechenden Token für die Tokenisierung in den Ausdruckskomponenten ausgegeben. Zum Beispiel für den f-Stringf"start {1+1} end"gab die alte Version des Tokenizers aus1,0-1,18: STRING 'f"start {1+1} end"'
während die neue Version ausgibt
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 '"'
Zusätzlich kann es zu geringfügigen Verhaltensänderungen kommen, die sich aus den für die Unterstützung von PEP 701 erforderlichen Änderungen ergeben. Einige dieser Änderungen umfassen:
Das Attribut
typeder beim Tokenisieren einiger ungültiger Python-Zeichen wie!emittierten Tokens hat sich vonERRORTOKENzuOPgeändert.Unvollständige einzeilige Strings lösen nun ebenfalls eine
tokenize.TokenErroraus, so wie es auch unvollständige mehrzeilige Strings tun.Einige unvollständige oder ungültige Python-Code lösen beim Tokenisieren nun eine
tokenize.TokenErroraus, anstatt beliebigeERRORTOKEN-Tokens zurückzugeben.Die Mischung von Tabs und Leerzeichen zur Einrückung in derselben Datei wird nicht mehr unterstützt und löst eine
TabErroraus.
Das Modul
threadingerwartet nun, dass das Modul_threadein Attribut_is_main_interpreterbesitzt. Dies ist eine Funktion ohne Argumente, dieTruezurückgibt, wenn der aktuelle Interpreter der Hauptinterpreter ist.Jede Bibliothek oder Anwendung, die ein benutzerdefiniertes
_thread-Modul bereitstellt, sollte_is_main_interpreter()bereitstellen. (Siehe gh-112826.)
Build-Änderungen¶
Python verwendet nicht mehr
setup.py, um gemeinsam genutzte C-Erweiterungsmodule zu erstellen. Build-Parameter wie Header und Bibliotheken werden imconfigure-Skript erkannt. Erweiterungen werden vonMakefileerstellt. Die meisten Erweiterungen verwendenpkg-configund greifen auf manuelle Erkennung zurück. (Beigetragen von Christian Heimes in gh-93939.)va_start()mit zwei Parametern, wieva_start(args, format),wird nun zum Erstellen von Python benötigt.va_start()wird nicht mehr mit einem einzelnen Parameter aufgerufen. (Beigetragen von Kumar Aditya in gh-93207.)CPython verwendet nun die ThinLTO-Option als Standard-Richtlinie für die Link-Time-Optimierung, wenn der Clang-Compiler das Flag akzeptiert. (Beigetragen von Donghee Na in gh-89536.)
Hinzufügen der Variable
COMPILEALL_OPTSinMakefile, um diecompileall-Optionen (Standard:-j0) beimake installzu überschreiben. Außerdem wurden die 3compileall-Befehle zu einem einzigen Befehl zusammengeführt, um .pyc-Dateien für alle Optimierungsstufen (0, 1, 2) auf einmal zu erstellen. (Beigetragen von Victor Stinner in gh-99289.)Hinzufügen von Plattform-Triplets für 64-Bit LoongArch
loongarch64-linux-gnusf
loongarch64-linux-gnuf32
loongarch64-linux-gnu
(Beigetragen von Zhang Na in gh-90656.)
PYTHON_FOR_REGENerfordert nun Python 3.10 oder neuer.Autoconf 2.71 und aclocal 1.16.4 sind nun erforderlich, um
configureneu zu generieren. (Beigetragen von Christian Heimes in gh-89886.)Windows-Builds und macOS-Installer von python.org verwenden nun OpenSSL 3.0.
C-API-Änderungen¶
Neue Funktionen¶
PEP 697: Einführung der Unstable C API-Ebene, die für Low-Level-Tools wie Debugger und JIT-Compiler gedacht ist. Diese API kann sich in jeder kleineren Version von CPython ohne Warnungen zur Deprekation ändern. Ihr Inhalt ist durch das Präfix
PyUnstable_in den Namen gekennzeichnet.Konstruktoren für Code-Objekte
PyUnstable_Code_New()(umbenannt vonPyCode_New)PyUnstable_Code_NewWithPosOnlyArgs()(umbenannt vonPyCode_NewWithPosOnlyArgs)
Zusätzlicher Speicher für Code-Objekte (PEP 523)
PyUnstable_Eval_RequestCodeExtraIndex()(umbenannt von_PyEval_RequestCodeExtraIndex)PyUnstable_Code_GetExtra()(umbenannt von_PyCode_GetExtra)PyUnstable_Code_SetExtra()(umbenannt von_PyCode_SetExtra)
Die ursprünglichen Namen bleiben bis zur Änderung der jeweiligen API verfügbar.
(Beigetragen von Petr Viktorin in gh-101101.)
PEP 697: Hinzufügen einer API zum Erweitern von Typen, deren Instanzspeicherlayout opak ist
PyType_Spec.basicsizekann null oder negativ sein, um die Vererbung oder Erweiterung der Basisklassengröße anzugeben.Hinzufügen von
PyObject_GetTypeData()undPyType_GetTypeDataSize()für den Zugriff auf unterklassenspezifische Instanzdaten.Hinzufügen von
Py_TPFLAGS_ITEMS_AT_ENDundPyObject_GetItemData(), um bestimmte variable Typen, einschließlichPyType_Type, sicher erweitern zu können.Hinzufügen von
Py_RELATIVE_OFFSET, ummembersin Bezug auf eine unterklassenspezifische Struktur definieren zu können.
(Beigetragen von Petr Viktorin in gh-103509.)
Hinzufügen der neuen Funktion
PyType_FromMetaclass()zur begrenzten C API, diePyType_FromModuleAndSpec()mit einem zusätzlichen Metaklassen-Argument verallgemeinert. (Beigetragen von Wenzel Jakob in gh-93012.)API zum Erstellen von Objekten, die mittels vectorcall-Protokoll aufgerufen werden können, wurde zur Limited API hinzugefügt
Das Flag
Py_TPFLAGS_HAVE_VECTORCALLwird nun aus einer Klasse entfernt, wenn die__call__()-Methode der Klasse neu zugewiesen wird. Dies macht die Verwendung von vectorcall sicher für veränderliche Typen (d. h. Heap-Typen ohne immutable-Flag,Py_TPFLAGS_IMMUTABLETYPE). Veränderliche Typen, dietp_callnicht überschreiben, erben nun das FlagPy_TPFLAGS_HAVE_VECTORCALL. (Beigetragen von Petr Viktorin in gh-93274.)Die Flags
Py_TPFLAGS_MANAGED_DICTundPy_TPFLAGS_MANAGED_WEAKREFwurden hinzugefügt. Dies ermöglicht Erweiterungsklassen, Objekt-__dict__und Weakrefs mit weniger Verwaltungsaufwand, geringerem Speicherverbrauch und schnellerem Zugriff zu unterstützen.API für Aufrufe mittels vectorcall-Protokoll wurde zur Limited API hinzugefügt
Dies bedeutet, dass sowohl die eingehenden als auch die ausgehenden Enden des Vektoraufrufprotokolls nun in der Limited API verfügbar sind. (Beigetragen von Wenzel Jakob in gh-98586.)
Hinzufügen von zwei neuen öffentlichen Funktionen,
PyEval_SetProfileAllThreads()undPyEval_SetTraceAllThreads(), die es ermöglichen, Tracing- und Profiling-Funktionen in allen laufenden Threads zusätzlich zum aufrufenden Thread festzulegen. (Beigetragen von Pablo Galindo in gh-93503.)Hinzufügen der neuen Funktion
PyFunction_SetVectorcall()zur C API, die das Vectorcall-Feld eines gegebenenPyFunctionObjectsetzt. (Beigetragen von Andrew Frost in gh-92257.)Die C API erlaubt nun die Registrierung von Callbacks über
PyDict_AddWatcher(),PyDict_Watch()und verwandte APIs, die aufgerufen werden, wenn ein Dictionary geändert wird. Dies ist für optimierende Interpreter, JIT-Compiler oder Debugger gedacht. (Beigetragen von Carl Meyer in gh-91052.)Hinzufügen der API
PyType_AddWatcher()undPyType_Watch(), um Callbacks zur Benachrichtigung über Änderungen an einem Typ zu registrieren. (Beigetragen von Carl Meyer in gh-91051.)Hinzufügen der APIs
PyCode_AddWatcher()undPyCode_ClearWatcher(), um Callbacks zur Benachrichtigung über Erstellung und Zerstörung von Code-Objekten zu registrieren. (Beigetragen von Itamar Oren in gh-91054.)Hinzufügen der Funktionen
PyFrame_GetVar()undPyFrame_GetVarString(), um eine Frame-Variable anhand ihres Namens abzurufen. (Beigetragen von Victor Stinner in gh-91248.)Hinzufügen von
PyErr_GetRaisedException()undPyErr_SetRaisedException()zum Speichern und Wiederherstellen der aktuellen Ausnahme. Diese Funktionen geben ein einzelnes Ausnahmeobjekt zurück und akzeptieren es, anstatt der drei Argumente von den nun veralteten FunktionenPyErr_Fetch()undPyErr_Restore(). Dies ist fehlerunanfälliger und etwas effizienter. (Beigetragen von Mark Shannon in gh-101578.)Hinzufügen von
_PyErr_ChainExceptions1, das eine Ausnahmeinstanz annimmt, um die Legacy-API_PyErr_ChainExceptionszu ersetzen, die nun veraltet ist. (Beigetragen von Mark Shannon in gh-101578.)Hinzufügen von
PyException_GetArgs()undPyException_SetArgs()als Komfortfunktionen zum Abrufen und Ändern der an den Konstruktor der Ausnahme übergebenenargs. (Beigetragen von Mark Shannon in gh-101578.)Hinzufügen von
PyErr_DisplayException(), das eine Ausnahmeinstanz annimmt, um die Legacy-APIPyErr_Display()zu ersetzen. (Beigetragen von Irit Katriel in gh-102755).
PEP 683: Einführung von *unsterblichen Objekten*, die es Objekten ermöglichen, Referenzzählungen zu umgehen, und damit verbundene Änderungen an der C-API
_Py_IMMORTAL_REFCNT: Die Referenzzählung, die ein Objekt alsunsterblich definiert.
_Py_IsImmortalPrüft, ob ein Objekt die unsterbliche Referenzzählung hat.PyObject_HEAD_INITDies initialisiert nun die Referenzzählung mit_Py_IMMORTAL_REFCNT, wenn es mitPy_BUILD_COREverwendet wird.
SSTATE_INTERNED_IMMORTALEin Bezeichner für internierte Unicode-Objekte,die unsterblich sind.
SSTATE_INTERNED_IMMORTAL_STATICEin Bezeichner für internierte Unicode-Objekte, die unsterblich und statisch sind.
sys.getunicodeinternedsizeDies gibt die Gesamtzahl der internierte Unicode-Objekte zurück. Dies ist nun für
refleak.pyerforderlich, um Referenzzählungen und zugewiesene Blöcke korrekt zu verfolgen.
(Beigetragen von Eddie Elizondo in gh-84436.)
PEP 684: Hinzufügen der neuen Funktion
Py_NewInterpreterFromConfig()undPyInterpreterConfig, die zum Erstellen von Subinterpretern mit eigenen GILs verwendet werden können. (Weitere Informationen siehe PEP 684: Ein GIL pro Interpreter.) (Beigetragen von Eric Snow in gh-104110.)In der begrenzten C API-Version 3.12 werden die Funktionen
Py_INCREF()undPy_DECREF()nun als undurchsichtige Funktionsaufrufe implementiert, um Implementierungsdetails zu verbergen. (Beigetragen von Victor Stinner in gh-105387.)
Portierung auf Python 3.12¶
Legacy-Unicode-APIs, die auf
Py_UNICODE*-Darstellung basieren, wurden entfernt. Bitte migrieren Sie zu APIs, die auf UTF-8 oderwchar_t*basieren.Argument-Parsing-Funktionen wie
PyArg_ParseTuple()unterstützen keinePy_UNICODE*-basierten Formate mehr (z. B.u,Z). Bitte migrieren Sie zu anderen Formaten für Unicode wies,z,esundU.tp_weaklistfür alle statischen Builtin-Typen ist immerNULL. Dies ist ein nur intern verwendetes Feld inPyTypeObject, aber wir weisen darauf hin, falls jemand zufällig direkt auf das Feld zugreift. Um Fehler zu vermeiden, verwenden Sie stattdessen die vorhandene öffentliche C-API oder, falls notwendig, das (nur intern verwendete) Makro_PyObject_GET_WEAKREFS_LISTPTR().Dieses nur intern verwendete
PyTypeObject.tp_subclassesist möglicherweise kein gültiger Objektzeiger mehr. Sein Typ wurde in void* geändert, um dies widerzuspiegeln. Wir erwähnen dies für den Fall, dass jemand zufällig direkt auf das nur intern verwendete Feld zugreift.Um eine Liste von Unterklassen zu erhalten, rufen Sie die Python-Methode
__subclasses__()auf (z. B. mittelsPyObject_CallMethod()).Unterstützung für weitere Formatierungsoptionen (linksbündige Ausrichtung, Oktalzahlen, Großbuchstaben-Hexadezimalzahlen,
intmax_t,ptrdiff_t,wchar_tC-Strings, variable Breite und Genauigkeit) inPyUnicode_FromFormat()undPyUnicode_FromFormatV()hinzugefügt. (Beigetragen von Serhiy Storchaka in gh-98836.)Ein nicht erkannter Formatierungszeichen in
PyUnicode_FromFormat()undPyUnicode_FromFormatV()setzt nun eineSystemError. In früheren Versionen wurde der Rest des Formatstrings unverändert in den Ergebnisstring kopiert und zusätzliche Argumente verworfen. (Beigetragen von Serhiy Storchaka in gh-95781.)Behebung der falschen Vorzeichenplatzierung in
PyUnicode_FromFormat()undPyUnicode_FromFormatV(). (Beigetragen von Philip Georgi in gh-95504.)Erweiterungsklassen, die einen
__dict__- oder Weakref-Slot hinzufügen möchten, sollten stattdessenPy_TPFLAGS_MANAGED_DICTundPy_TPFLAGS_MANAGED_WEAKREFverwenden, anstatttp_dictoffsetundtp_weaklistoffset. Die Verwendung vontp_dictoffsetundtp_weaklistoffsetwird weiterhin unterstützt, aber nicht die Mehrfachvererbung vollständig (gh-95589) und die Leistung kann schlechter sein. Klassen, diePy_TPFLAGS_MANAGED_DICTdeklarieren, müssen_PyObject_VisitManagedDict()und_PyObject_ClearManagedDict()aufrufen, um die Dictionaries ihrer Instanzen zu durchlaufen und zu löschen. Zum Löschen von Weakrefs rufen SiePyObject_ClearWeakRefs()auf, wie zuvor.Die Funktion
PyUnicode_FSDecoder()akzeptiert keine byte-ähnlichen Pfade mehr, wie die Typenbytearrayundmemoryview: nur der exakte Typbyteswird für Byte-Strings akzeptiert. (Beigetragen von Victor Stinner in gh-98393.)Die Makros
Py_CLEAR,Py_SETREFundPy_XSETREFwerten ihre Argumente nun nur noch einmal aus. Wenn ein Argument Nebeneffekte hat, werden diese Nebeneffekte nicht mehr dupliziert. (Beigetragen von Victor Stinner in gh-98724.)Der Fehlerindikator des Interpreters wird nun immer normalisiert. Das bedeutet, dass
PyErr_SetObject(),PyErr_SetString()und die anderen Funktionen, die den Fehlerindikator setzen, die Ausnahme nun normalisieren, bevor sie gespeichert wird. (Beigetragen von Mark Shannon in gh-101578.)_Py_RefTotalist nicht mehr maßgebend und wird nur noch aus ABI-Kompatibilitätsgründen beibehalten. Beachten Sie, dass es sich um eine interne globale Variable handelt und nur in Debug-Builds verfügbar ist. Wenn Sie sie verwenden, müssen Sie nun_Py_GetGlobalRefTotal()verwenden.Die folgenden Funktionen wählen nun eine geeignete Metaklasse für den neu erstellten Typ aus:
Das Erstellen von Klassen, deren Metaklasse
tp_newüberschreibt, ist veraltet und wird in Python 3.14+ nicht mehr zugelassen. Beachten Sie, dass diese Funktionentp_newder Metaklasse ignorieren, was möglicherweise zu einer unvollständigen Initialisierung führt.Beachten Sie, dass
PyType_FromMetaclass()(eingeführt in Python 3.12) bereits die Erstellung von Klassen verbietet, deren Metaklassetp_new(__new__()in Python) überschreibt.Da
tp_newfast alles überschreibt, was diePyType_From*-Funktionen tun, sind die beiden unvereinbar. Das vorhandene Verhalten – das Ignorieren der Metaklasse für mehrere Schritte der Typenerstellung – ist im Allgemeinen unsicher, da (Meta-)Klassen davon ausgehen, dasstp_newaufgerufen wurde. Es gibt keine einfache allgemeine Problemumgehung. Eine der folgenden Optionen könnte für Sie funktionieren:Wenn Sie die Kontrolle über die Metaklasse haben, vermeiden Sie die Verwendung von
tp_newdarin.Wenn die Initialisierung übersprungen werden kann, kann sie stattdessen in
tp_initerfolgen.Wenn die Metaklasse nicht aus Python instanziiert werden muss, setzen Sie deren
tp_newaufNULL, indem Sie das FlagPy_TPFLAGS_DISALLOW_INSTANTIATIONverwenden. Dies macht sie fürPyType_From*-Funktionen akzeptabel.
Vermeiden Sie
PyType_From*-Funktionen: Wenn Sie keine C-spezifischen Features (Slots oder Festlegen der Instanzgröße) benötigen, erstellen Sie Typen, indem Sie die Metaklasse aufrufen.Wenn Sie *wissen*, dass
tp_newsicher übersprungen werden kann, filtern Sie die Deprekationswarnung mitwarnings.catch_warnings()aus Python heraus.
PyOS_InputHookundPyOS_ReadlineFunctionPointerwerden in Subinterpretern nicht mehr aufgerufen. Dies liegt daran, dass Clients im Allgemeinen auf prozessweite globale Zustände angewiesen sind (da diese Callbacks keine Möglichkeit haben, den Zustand von Erweiterungsmodulen wiederherzustellen).Dies vermeidet auch Situationen, in denen Erweiterungen sich in einem Subinterpreter wiederfinden, den sie nicht unterstützen (oder in dem sie noch nicht geladen wurden). Siehe gh-104668 für weitere Informationen.
Internals von
PyLongObjectwurden zur Leistungsverbesserung geändert. Obwohl die Internals vonPyLongObjectprivat sind, werden sie von einigen Erweiterungsmodulen verwendet. Die internen Felder sollten nicht mehr direkt angesprochen werden, stattdessen sollten die API-Funktionen mitPyLong_...beginnen. Zwei neue *instabile* API-Funktionen werden für den effizienten Zugriff auf den Wert vonPyLongObjects bereitgestellt, die in ein einziges Maschinenwort passenBenutzerdefinierte Allozatoren, die über
PyMem_SetAllocator()gesetzt werden, müssen nun threadsicher sein, unabhängig von der Speicherdomäne. Allozatoren, die keinen eigenen Zustand haben, einschließlich "Hooks", sind davon nicht betroffen. Wenn Ihr benutzerdefinierter Allozator noch nicht threadsicher ist und Sie Anleitung benötigen, erstellen Sie bitte ein neues GitHub-Issue und CC@ericsnowcurrently.
Veraltet¶
In Übereinstimmung mit PEP 699 ist das Feld
ma_version_taginPyDictObjectfür Erweiterungsmodule veraltet. Der Zugriff auf dieses Feld erzeugt eine Compiler-Warnung zur Kompilierzeit. Dieses Feld wird in Python 3.14 entfernt. (Beigetragen von Ramvikrams und Kumar Aditya in gh-101193. PEP von Ken Jin.)Globale Konfigurationsvariable veraltet
Py_DebugFlag: verwenden SiePyConfig.parser_debugPy_VerboseFlag: verwenden SiePyConfig.verbosePy_QuietFlag: verwenden SiePyConfig.quietPy_InteractiveFlag: verwenden SiePyConfig.interactivePy_InspectFlag: verwenden SiePyConfig.inspectPy_OptimizeFlag: verwenden SiePyConfig.optimization_levelPy_NoSiteFlag: verwenden SiePyConfig.site_importPy_BytesWarningFlag: verwenden SiePyConfig.bytes_warningPy_FrozenFlag: verwenden SiePyConfig.pathconfig_warningsPy_IgnoreEnvironmentFlag: verwenden SiePyConfig.use_environmentPy_DontWriteBytecodeFlag: verwenden SiePyConfig.write_bytecodePy_NoUserSiteDirectory: verwenden SiePyConfig.user_site_directoryPy_UnbufferedStdioFlag: verwenden SiePyConfig.buffered_stdioPy_HashRandomizationFlag: verwenden SiePyConfig.use_hash_seedundPyConfig.hash_seedPy_IsolatedFlag: verwenden SiePyConfig.isolatedPy_LegacyWindowsFSEncodingFlag: verwenden SiePyPreConfig.legacy_windows_fs_encodingPy_LegacyWindowsStdioFlag: verwenden SiePyConfig.legacy_windows_stdioPy_FileSystemDefaultEncoding: verwenden SiePyConfig.filesystem_encodingPy_HasFileSystemDefaultEncoding: verwenden SiePyConfig.filesystem_encodingPy_FileSystemDefaultEncodeErrors: verwenden SiePyConfig.filesystem_errorsPy_UTF8Mode: verwenden SiePyPreConfig.utf8_mode(siehePy_PreInitialize())
Die
Py_InitializeFromConfig()API sollte stattdessen mitPyConfigverwendet werden. (Beigetragen von Victor Stinner in gh-77782.)Das Erstellen von
unveränderlichen Typenmit veränderlichen Basen ist veraltet und wird in Python 3.14 deaktiviert. (gh-95388)Der Header
structmember.hist veraltet, obwohl er weiterhin verfügbar ist und es keine Pläne gibt, ihn zu entfernen.Sein Inhalt ist nun durch einfaches Einbinden von
Python.hverfügbar, wobei einPy-Präfix hinzugefügt wird, falls er fehlteTyp-Makros wie
Py_T_INT,Py_T_DOUBLEusw. (früherT_INT,T_DOUBLEusw.)Die Flags
Py_READONLY(früherREADONLY) undPy_AUDIT_READ(früher alles Großbuchstaben)
Mehrere Elemente werden nicht aus
Python.hexportiertT_OBJECT(verwenden SiePy_T_OBJECT_EX)T_NONE(früher undokumentiert und ziemlich eigenartig)Das Makro
WRITE_RESTRICTED, das nichts tut.Die Makros
RESTRICTEDundREAD_RESTRICTED, Äquivalente vonPy_AUDIT_READ.In einigen Konfigurationen wird
<stddef.h>nicht ausPython.heingebunden. Es sollte manuell eingebunden werden, wennoffsetof()verwendet wird.
Der veraltete Header stellt weiterhin seine ursprünglichen Inhalte unter den ursprünglichen Namen bereit. Ihr alter Code kann unverändert bleiben, es sei denn, die zusätzliche Einbindung und die nicht-namespaced Makros stören Sie stark.
(Beigetragen in gh-47146 von Petr Viktorin, basierend auf früheren Arbeiten von Alexander Belopolsky und Matthias Braun.)
PyErr_Fetch()undPyErr_Restore()sind veraltet. Verwenden Sie stattdessenPyErr_GetRaisedException()undPyErr_SetRaisedException(). (Beigetragen von Mark Shannon in gh-101578.)PyErr_Display()ist veraltet. Verwenden Sie stattdessenPyErr_DisplayException(). (Beigetragen von Irit Katriel in gh-102755)._PyErr_ChainExceptionsist veraltet. Verwenden Sie stattdessen_PyErr_ChainExceptions1. (Beigetragen von Irit Katriel in gh-102192.)Die Verwendung von
PyType_FromSpec(),PyType_FromSpecWithBases()oderPyType_FromModuleAndSpec()zum Erstellen einer Klasse, deren Metaklassetp_newüberschreibt, ist veraltet. Rufen Sie stattdessen die Metaklasse auf.
Zur Entfernung in Python 3.14 vorgemerkt¶
Das Feld
ma_version_taginPyDictObjectfür Erweiterungsmodule (PEP 699; gh-101193).Erstellung von
unveränderlichen Typenmit veränderlichen Basen (gh-95388).
Zur Entfernung in Python 3.15 vorgemerkt¶
PyImport_ImportModuleNoBlock(): Verwenden Sie stattdessenPyImport_ImportModule().PyWeakref_GetObject()undPyWeakref_GET_OBJECT(): Verwenden Sie stattdessenPyWeakref_GetRef(). Das Projekt pythoncapi-compat kann verwendet werden, umPyWeakref_GetRef()auf Python 3.12 und älter zu erhalten.Typ
Py_UNICODEund MakroPy_UNICODE_WIDE: Verwenden Sie stattdessenwchar_t.PyUnicode_AsDecodedObject(): Verwenden Sie stattdessenPyCodec_Decode().PyUnicode_AsDecodedUnicode(): Verwenden Sie stattdessenPyCodec_Decode(); Beachten Sie, dass einige Codecs (z. B. „base64“) einen anderen Typ alsstrzurückgeben können, z. B.bytes.PyUnicode_AsEncodedObject(): Verwenden Sie stattdessenPyCodec_Encode().PyUnicode_AsEncodedUnicode(): Verwenden Sie stattdessenPyCodec_Encode(); Beachten Sie, dass einige Codecs (z. B. „base64“) einen anderen Typ alsbyteszurückgeben können, z. B.str.Python-Initialisierungsfunktionen, veraltet in Python 3.13
Py_GetPath(): Verwenden Sie stattdessenPyConfig_Get("module_search_paths")(sys.path).Py_GetPrefix(): Verwenden Sie stattdessenPyConfig_Get("base_prefix")(sys.base_prefix). Verwenden SiePyConfig_Get("prefix")(sys.prefix), wenn virtuelle Umgebungen gehandhabt werden müssen.Py_GetExecPrefix(): Verwenden Sie stattdessenPyConfig_Get("base_exec_prefix")(sys.base_exec_prefix). Verwenden SiePyConfig_Get("exec_prefix")(sys.exec_prefix), wenn virtuelle Umgebungen gehandhabt werden müssen.Py_GetProgramFullPath(): Verwenden Sie stattdessenPyConfig_Get("executable")(sys.executable).Py_GetProgramName(): Verwenden Sie stattdessenPyConfig_Get("executable")(sys.executable).Py_GetPythonHome(): Verwenden Sie stattdessenPyConfig_Get("home")oder die UmgebungsvariablePYTHONHOME.
Das Projekt pythoncapi-compat kann verwendet werden, um
PyConfig_Get()auf Python 3.13 und älter zu erhalten.Funktionen zur Konfiguration der Python-Initialisierung, veraltet in Python 3.11
PySys_SetArgvEx(): Setzen Sie stattdessenPyConfig.argv.PySys_SetArgv(): Setzen Sie stattdessenPyConfig.argv.Py_SetProgramName(): Setzen Sie stattdessenPyConfig.program_name.Py_SetPythonHome(): Setzen Sie stattdessenPyConfig.home.PySys_ResetWarnOptions(): Leeren Sie stattdessensys.warnoptionsundwarnings.filters.
Die API
Py_InitializeFromConfig()sollte stattdessen mitPyConfigverwendet werden.Globale Konfigurationsvariablen
Py_DebugFlag: Verwenden Sie stattdessenPyConfig.parser_debugoderPyConfig_Get("parser_debug").Py_VerboseFlag: Verwenden Sie stattdessenPyConfig.verboseoderPyConfig_Get("verbose").Py_QuietFlag: Verwenden Sie stattdessenPyConfig.quietoderPyConfig_Get("quiet").Py_InteractiveFlag: Verwenden Sie stattdessenPyConfig.interactiveoderPyConfig_Get("interactive").Py_InspectFlag: Verwenden Sie stattdessenPyConfig.inspectoderPyConfig_Get("inspect").Py_OptimizeFlag: Verwenden Sie stattdessenPyConfig.optimization_leveloderPyConfig_Get("optimization_level").Py_NoSiteFlag: Verwenden Sie stattdessenPyConfig.site_importoderPyConfig_Get("site_import").Py_BytesWarningFlag: Verwenden Sie stattdessenPyConfig.bytes_warningoderPyConfig_Get("bytes_warning").Py_FrozenFlag: Verwenden Sie stattdessenPyConfig.pathconfig_warningsoderPyConfig_Get("pathconfig_warnings").Py_IgnoreEnvironmentFlag: Verwenden Sie stattdessenPyConfig.use_environmentoderPyConfig_Get("use_environment").Py_DontWriteBytecodeFlag: Verwenden Sie stattdessenPyConfig.write_bytecodeoderPyConfig_Get("write_bytecode").Py_NoUserSiteDirectory: Verwenden Sie stattdessenPyConfig.user_site_directoryoderPyConfig_Get("user_site_directory").Py_UnbufferedStdioFlag: Verwenden Sie stattdessenPyConfig.buffered_stdiooderPyConfig_Get("buffered_stdio").Py_HashRandomizationFlag: Verwenden Sie stattdessenPyConfig.use_hash_seedundPyConfig.hash_seedoderPyConfig_Get("hash_seed").Py_IsolatedFlag: Verwenden Sie stattdessenPyConfig.isolatedoderPyConfig_Get("isolated").Py_LegacyWindowsFSEncodingFlag: Verwenden Sie stattdessenPyPreConfig.legacy_windows_fs_encodingoderPyConfig_Get("legacy_windows_fs_encoding").Py_LegacyWindowsStdioFlag: Verwenden Sie stattdessenPyConfig.legacy_windows_stdiooderPyConfig_Get("legacy_windows_stdio").Py_FileSystemDefaultEncoding,Py_HasFileSystemDefaultEncoding: Verwenden Sie stattdessenPyConfig.filesystem_encodingoderPyConfig_Get("filesystem_encoding").Py_FileSystemDefaultEncodeErrors: Verwenden Sie stattdessenPyConfig.filesystem_errorsoderPyConfig_Get("filesystem_errors").Py_UTF8Mode: Verwenden Sie stattdessenPyPreConfig.utf8_modeoderPyConfig_Get("utf8_mode"). (SiehePy_PreInitialize())
Die API
Py_InitializeFromConfig()sollte mitPyConfigverwendet werden, um diese Optionen zu setzen. OderPyConfig_Get()kann verwendet werden, um diese Optionen zur Laufzeit abzurufen.
Zur Entfernung in Python 3.16 vorgemerkt¶
Die gebündelte Kopie von
libmpdec.
Zur Entfernung in zukünftigen Versionen vorgemerkt¶
Die folgenden APIs sind veraltet und werden entfernt, obwohl derzeit kein Termin für ihre Entfernung geplant ist.
Py_TPFLAGS_HAVE_FINALIZE: Seit Python 3.8 nicht mehr benötigt.PyErr_Fetch(): Verwenden Sie stattdessenPyErr_GetRaisedException().PyErr_NormalizeException(): Verwenden Sie stattdessenPyErr_GetRaisedException().PyErr_Restore(): Verwenden Sie stattdessenPyErr_SetRaisedException().PyModule_GetFilename(): Verwenden Sie stattdessenPyModule_GetFilenameObject().PyOS_AfterFork(): Verwenden Sie stattdessenPyOS_AfterFork_Child().PySlice_GetIndicesEx(): Verwenden Sie stattdessenPySlice_Unpack()undPySlice_AdjustIndices().PyUnicode_READY(): Seit Python 3.12 nicht mehr benötigt.PyErr_Display(): Verwenden Sie stattdessenPyErr_DisplayException()._PyErr_ChainExceptions(): Verwenden Sie stattdessen_PyErr_ChainExceptions1().PyBytesObject.ob_shashmember: Rufen Sie stattdessenPyObject_Hash()auf.Thread Local Storage (TLS) API
PyThread_create_key(): Verwenden Sie stattdessenPyThread_tss_alloc().PyThread_delete_key(): Verwenden Sie stattdessenPyThread_tss_free().PyThread_set_key_value(): Verwenden Sie stattdessenPyThread_tss_set().PyThread_get_key_value(): Verwenden Sie stattdessenPyThread_tss_get().PyThread_delete_key_value(): Verwenden Sie stattdessenPyThread_tss_delete().PyThread_ReInitTLS(): Seit Python 3.7 nicht mehr benötigt.
Entfernt¶
Entfernen Sie die Headerdatei
token.h. Es gab nie eine öffentliche Tokenizer-C-API. Die Headerdateitoken.hwar nur für die interne Verwendung von Python bestimmt. (Beigetragen von Victor Stinner in gh-92651.)Veraltete Unicode-APIs wurden entfernt. Details finden Sie in PEP 623.
PyUnicode_WCHAR_KINDPyUnicode_AS_UNICODE()PyUnicode_AsUnicode()PyUnicode_AsUnicodeAndSize()PyUnicode_AS_DATA()PyUnicode_FromUnicode()PyUnicode_GET_SIZE()PyUnicode_GetSize()PyUnicode_GET_DATA_SIZE()
Entfernen Sie das Makro
PyUnicode_InternImmortal(). (Beigetragen von Victor Stinner in gh-85858.)