Was ist Neu in Python 3.12¶
- Herausgeber:
Adam Turner
Dieser Artikel erklärt die neuen Features in Python 3.12 im Vergleich zu 3.11. Python 3.12 wurde am 2. Oktober 2023 veröffentlicht. Alle Einzelheiten stehen im Änderungsprotokoll.
Siehe auch
PEP 693 – Zeitplan für die Veröffentlichung von Python 3.12
Zusammenfassung - Release Höhepunkte¶
Python 3.12 ist eine stabile Ausgabe der Programmiersprache Python, mit einer Mischung aus Änderungen an der Sprache und an der Standardbibliothek. Die Änderungen an der Bibliothek drehen sich vor allem darum, als veraltet markierte APIs aufzuräumen, und um Benutzerfreundlichkeit und Korrektheit. Bemerkenswert ist, dass das Paket distutils aus der Standardbibliothek entfernt wurde. Die Unterstützung für Dateisysteme in os und pathlib hat eine Reihe von Verbesserungen erfahren, und mehrere Module arbeiten schneller.
Die Änderungen an der Sprache drehen sich um Benutzerfreundlichkeit: Bei f-Strings sind viele Einschränkungen gefallen, und die Vorschläge im Stil „Did you mean …“ werden weiter besser. Die neue Syntax für Typparameter und die Anweisung type machen die Arbeit mit generischen Typen und Typaliasen in statischen Typprüfern angenehmer.
Dieser Artikel versucht nicht, eine vollständige Spezifikation aller neuen Features zu liefern, sondern gibt einen handlichen Überblick. Alle Einzelheiten stehen in der Dokumentation, etwa in der Bibliotheksreferenz und der Sprachreferenz. Um die vollständige Implementierung und die Entwurfsgründe einer Änderung zu verstehen, sieh im PEP zum jeweiligen neuen Feature nach. Beachte aber, dass PEPs in der Regel nicht mehr aktualisiert werden, sobald ein Feature vollständig umgesetzt ist.
Neue Syntax-Features:
Neue Grammatik-Features:
Verbesserungen am Interpreter:
PEP 669, Überwachung mit geringer Auswirkung
Verbesserte Vorschläge im Stil „Did you mean …“ für die Ausnahmen
NameError,ImportErrorundSyntaxError
Verbesserungen am Python-Datenmodell:
PEP 688, das Pufferprotokoll aus Python heraus verwenden
Wesentliche Verbesserungen in der Standardbibliothek:
Die Klasse
pathlib.Pathlässt sich jetzt ableitenDas Modul
oshat mehrere Verbesserungen für die Unterstützung von Windows erhaltenEine Befehlszeilenschnittstelle ist zum Modul
sqlite3hinzugekommenPrüfungen mit
isinstance()gegenzur Laufzeit prüfbare Protokollesind zwei- bis zwanzigmal schnellerDas Paket
asynciohat eine Reihe von Geschwindigkeitsverbesserungen erfahren, bei einigen Vergleichsmessungen bis zu 75 %.Eine Befehlszeilenschnittstelle ist zum Modul
uuidhinzugekommenWegen der Änderungen in PEP 701 erzeugt das Modul
tokenizeToken bis zu 64 % schneller.
Verbesserungen bei der Sicherheit:
Die eingebauten
hashlib-Umsetzungen von SHA1, SHA3, SHA2-384, SHA2-512 und MD5 sind durch formal verifizierten Code aus dem Projekt HACL* ersetzt. Diese eingebauten Umsetzungen bleiben als Rückfallebene erhalten und werden nur verwendet, wenn OpenSSL sie nicht bereitstellt.
Verbesserungen der C-API:
Verbesserungen an der CPython-Implementierung:
PEP 709, Comprehensions werden eingebettet
CPython-Unterstützung für den Linux-Profiler
perfSchutz gegen Stapelüberläufe auf den unterstützten Plattformen umgesetzt
Neue Typisierungsfunktionen:
PEP 698, Dekorator
@typing.override
Wichtige Markierungen als veraltet, Entfernungen oder Einschränkungen:
PEP 623:
wstrist aus den Unicode-Objekten in der C-API von Python entfernt, wodurch jedesstr-Objekt mindestens 8 Byte kleiner wird.PEP 632: Das Paket
distutilsist entfernt. Hinweise, womit sich die bereitgestellten APIs ersetzen lassen, stehen in der Umstiegsanleitung. Das Paket Setuptools von Dritten stelltdistutilsweiterhin bereit, falls du es in Python 3.12 und darüber hinaus noch brauchst.gh-95299:
setuptoolswird in virtuellen Umgebungen, die mitvenverzeugt werden, nicht mehr vorinstalliert. Das heißt, dassdistutils,setuptools,pkg_resourcesundeasy_installnicht mehr von sich aus verfügbar sind. Um sie zu erhalten, führepip install setuptoolsin der aktivierten virtuellen Umgebung aus.Die Module
asynchat,asyncoreundimpsind entfernt, ebenso mehrere Methoden-Aliase vonunittest.TestCase.
Neue Funktionen¶
PEP 695: Syntax für Typparameter¶
Generische Klassen und Funktionen nach PEP 484 wurden mit einer umständlichen Syntax deklariert, die den Gültigkeitsbereich der Typparameter unklar ließ und ausdrückliche Angaben zur Varianz verlangte.
PEP 695 führt eine neue, knappere und ausdrücklichere Möglichkeit ein, generische Klassen und Funktionen zu erzeugen:
def max[T](args: Iterable[T]) -> T:
...
class list[T]:
def __getitem__(self, index: int, /) -> T:
...
def append(self, element: T) -> None:
...
Darüber hinaus führt das PEP eine neue Möglichkeit ein, Typaliase mit der Anweisung type zu deklarieren, die eine Instanz von TypeAliasType erzeugt:
type Point = tuple[float, float]
Typaliase können auch generisch sein:
type Point[T] = tuple[T, T]
Die neue Syntax erlaubt es, Parameter vom Typ TypeVarTuple und ParamSpec zu deklarieren sowie TypeVar-Parameter mit Schranken 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 Typaliasen sowie die Schranken und Einschränkungen von Typvariablen, die über diese Syntax erzeugt werden, werden erst bei Bedarf ausgewertet (siehe verzögerte Auswertung). Das heißt, Typaliase können sich auf andere Typen beziehen, die erst später in der Datei definiert werden.
Typparameter, die über eine Typparameterliste deklariert werden, sind im Gültigkeitsbereich der Deklaration und in allen darin verschachtelten Bereichen sichtbar, nicht aber im äußeren Bereich. Sie lassen sich zum Beispiel in den Typannotationen der Methoden einer generischen Klasse oder im Klassenkörper verwenden. Im Modulbereich nach der Klassendefinition lassen sie sich dagegen nicht verwenden. Eine ausführliche Beschreibung der Laufzeitsemantik von Typparametern steht unter Typenparameterlisten.
Um diese Semantik der Gültigkeitsbereiche zu ermöglichen, ist eine neue Art von Bereich hinzugekommen, der Annotationsbereich. Annotationsbereiche verhalten sich größtenteils wie Funktionsbereiche, wirken aber anders mit umgebenden Klassenbereichen zusammen. In Python 3.13 werden auch Annotationen in Annotationsbereichen ausgewertet.
Näheres unter PEP 695.
(PEP verfasst von Eric Traut. Umsetzung 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. Ausdrucksbestandteile innerhalb von f-Strings dürfen jetzt jeder gültige Python-Ausdruck sein, auch Zeichenketten mit denselben Anführungszeichen wie der umgebende f-String, mehrzeilige Ausdrücke, Kommentare, Backslashes und Unicode-Escape-Sequenzen. Sehen wir uns das im Einzelnen an:
Anführungszeichen wiederverwenden: In Python 3.11 löst es einen
SyntaxErroraus, dieselben Anführungszeichen wie der umgebende f-String zu verwenden, sodass man auf andere verfügbare Anführungszeichen ausweichen muss (etwa doppelte oder dreifache, wenn der f-String einfache verwendet). In Python 3.12 ist jetzt so etwas möglich:>>> 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'
Beachte, dass es vor dieser Änderung keine ausdrückliche Obergrenze dafür gab, wie tief f-Strings verschachtelt werden können. Dass sich Anführungszeichen innerhalb des Ausdrucksbestandteils eines f-Strings aber nicht wiederverwenden lassen, machte eine beliebig tiefe Verschachtelung unmöglich. Tatsächlich war dies der am tiefsten verschachtelte f-String, der sich schreiben ließ:
>>> f"""{f'''{f'{f"{1+1}"}'}'''}""" '2'
Da f-Strings jetzt in ihren Ausdrucksbestandteilen jeden gültigen Python-Ausdruck enthalten dürfen, lassen sie sich jetzt beliebig tief verschachteln:
>>> f"{f"{f"{f"{f"{f"{1+1}"}"}"}"}"}" '2'
Mehrzeilige Ausdrücke und Kommentare: In Python 3.11 müssen Ausdrücke in f-Strings in einer einzigen Zeile stehen, selbst wenn der Ausdruck im f-String sich gewöhnlich über mehrere Zeilen erstrecken könnte (etwa Listenliterale über mehrere Zeilen), was sie schlechter lesbar macht. In Python 3.12 kannst du f-Strings jetzt über mehrere Zeilen schreiben und Kommentare einstreuen:
>>> 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 durften Ausdrücke in f-Strings kein einziges
\-Zeichen enthalten. Das betraf auch Unicode-Escape-Sequenzen (wie\N{snowman}), denn diese enthalten den Teil\N, der vorher nicht in Ausdrucksbestandteilen von f-Strings vorkommen durfte. Jetzt kannst du Ausdrücke wie diesen schreiben:>>> 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
Weitere Einzelheiten siehe PEP 701.
Als erfreuliche Nebenwirkung der Art, wie dieses Feature umgesetzt ist (f-Strings werden mit dem PEG-Parser ausgewertet), sind die Fehlermeldungen zu f-Strings jetzt genauer und nennen die genaue Stelle des Fehlers. In Python 3.11 löst zum Beispiel 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 nennt aber nicht die genaue Stelle des Fehlers in der Zeile und setzt den Ausdruck künstlich in Klammern. In Python 3.12 können die Fehlermeldungen genauer sein und die ganze Zeile zeigen, weil f-Strings mit dem PEG-Parser ausgewertet werden:
>>> 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 and Marta Gómez in gh-102856. PEP geschrieben von Pablo Galindo, Batuhan Taskaya, Lysandros Nikolaou and Marta Gómez).
PEP 684: Ein GIL je Interpreter¶
PEP 684 führt einen GIL je Interpreter ein, sodass Subinterpreter jetzt mit einem eigenen GIL je Interpreter erzeugt werden können. Damit können Python-Programme mehrere CPU-Kerne voll ausnutzen. Derzeit ist das nur über die C-API verfügbar, eine Python-API ist aber für 3.13 vorgesehen.
Verwende die neue Funktion Py_NewInterpreterFromConfig(), um einen Interpreter mit eigenem GIL zu erzeugen:
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 dafür, wie sich die C-API für Subinterpreter mit einem GIL je Interpreter verwenden lässt, stehen in Modules/_xxsubinterpretersmodule.c.
(Beigetragen von Eric Snow in gh-104210 und weiteren.)
PEP 669: Überwachung mit geringer Auswirkung für CPython¶
PEP 669 legt eine neue API fest, mit der Profiler, Debugger und andere Werkzeuge Ereignisse in CPython überwachen können. Sie deckt viele Ereignisarten ab, darunter Aufrufe, Rückgaben, Zeilen, Ausnahmen, Sprünge und mehr. Das heißt, du zahlst nur für das, was du nutzt, und damit sind Debugger und Werkzeuge zur Abdeckungsmessung mit nahezu keinem Mehraufwand möglich. Einzelheiten unter sys.monitoring.
(Beigetragen von Mark Shannon in gh-103082.)
PEP 688: Das Pufferprotokoll aus Python zugänglich machen¶
PEP 688 führt eine Möglichkeit ein, das Pufferprotokoll aus Python-Code heraus zu verwenden. Klassen, die die Methode __buffer__() umsetzen, lassen sich jetzt als Puffertypen verwenden.
Die neue ABC collections.abc.Buffer bietet eine einheitliche Möglichkeit, Pufferobjekte darzustellen, zum Beispiel in Typannotationen. Die neue Aufzählung inspect.BufferFlags stellt die Schalter dar, mit denen sich das Erzeugen eines Puffers anpassen lässt. (Beigetragen von Jelle Zijlstra in gh-102500.)
PEP 709: Comprehensions werden eingebettet¶
Dictionary-, Listen- und Mengen-Comprehensions werden jetzt eingebettet, statt bei jeder Ausführung der Comprehension ein neues, einmalig genutztes Funktionsobjekt zu erzeugen. Damit läuft eine Comprehension bis zu doppelt so schnell. Weitere Einzelheiten unter PEP 709.
Die Iterationsvariablen einer Comprehension bleiben abgeschirmt, überschreiben also keine gleichnamige Variable im äußeren Bereich und sind nach der Comprehension auch nicht sichtbar. Das Einbetten führt allerdings zu einigen sichtbaren Verhaltensänderungen:
In Rückverfolgungen gibt es keinen eigenen Rahmen für die Comprehension mehr, und Tracing und Profiling zeigen die Comprehension nicht mehr als Funktionsaufruf.
Das Modul
symtableerzeugt keine untergeordneten Symboltabellen für die einzelnen Comprehensions mehr. Stattdessen stehen die lokalen Variablen der Comprehension in der Symboltabelle der übergeordneten Funktion.locals()innerhalb einer Comprehension aufzurufen liefert jetzt auch Variablen von außerhalb der Comprehension und nicht mehr die künstliche Variable.0für das „Argument“ der Comprehension.Eine Comprehension, die unmittelbar über
locals()iteriert (zum Beispiel[k for k in locals()]), kann unter Tracing (etwa bei einer Messung der Codeabdeckung) „RuntimeError: dictionary changed size during iteration“ zu sehen bekommen. Dasselbe Verhalten zeigt sich schon beifor k in locals():. Um den Fehler zu vermeiden, erzeuge erst eine Liste der Schlüssel, über die iteriert wird: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 jetzt unter Umständen als Teil der Fehlermeldungen vorgeschlagen, die der Interpreter ausgibt, wenn ein
NameErrorbis zur obersten Ebene durchschlägt. (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'?
Der Fehlervorschlag bei
NameError-Ausnahmen in Instanzen ist verbessert. Wird jetzt in einer Methode einNameErrorausgelöst und hat die Instanz ein Attribut, das genau dem Namen in der Ausnahme entspricht, enthält der Vorschlagself.<NAME>statt der nächstliegenden Übereinstimmung im Gültigkeitsbereich der Methode. (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'?
Die
SyntaxError-Fehlermeldung ist verbessert, wenn jemandimport x from ystattfrom y import xschreibt. (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 aus fehlgeschlagenenfrom <module> import <name>-Anweisungen enthalten jetzt Vorschläge für den Wert von<name>, die sich an den in<module>verfügbaren Namen orientieren. (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 sprachliche Änderungen¶
Der Parser löst jetzt einen
SyntaxErroraus, wenn er Quelltext auswertet, der Nullbytes enthält. (Beigetragen von Pablo Galindo in gh-96670.)Ein Paar aus Backslash und Zeichen, das keine gültige Escape-Sequenz ist, erzeugt jetzt eine
SyntaxWarningstatt einerDeprecationWarning.re.compile("\d+\.\d+")gibt zum Beispiel jetzt eineSyntaxWarningaus ("\d"ist keine gültige Escape-Sequenz, verwende für reguläre Ausdrücke rohe Zeichenketten:re.compile(r"\d+\.\d+")). In einer künftigen Python-Version wird dann einSyntaxErrorstatt einerSyntaxWarningausgelöst. (Beigetragen von Victor Stinner in gh-98401.)Oktale Escapes mit einem Wert größer als
0o377(zum Beispiel"\477"), die in Python 3.11 als veraltet markiert wurden, erzeugen jetzt eineSyntaxWarningstatt einerDeprecationWarning. In einer künftigen Python-Version werden sie schließlich einSyntaxError. (Beigetragen von Victor Stinner in gh-98401.)Variablen, die im Zielteil von Comprehensions verwendet werden, aber nicht beschrieben werden, lassen sich jetzt in Zuweisungsausdrücken (
:=) verwenden. In[(b := 1) for a, b.prop in some_iter]ist die Zuweisung anbzum Beispiel jetzt erlaubt. Beachte, dass die Zuweisung an Variablen, die im Zielteil von Comprehensions beschrieben werden (wiea), nach PEP 572 weiterhin nicht erlaubt ist. (Beigetragen von Nikita Sobolev in gh-100581.)Ausnahmen, die in der Methode
__set_name__einer Klasse oder eines Typs ausgelöst werden, werden nicht mehr in einenRuntimeErroreingehüllt. Kontextinformationen werden der Ausnahme als Hinweis nach PEP 678 angehängt. (Beigetragen von Irit Katriel in gh-77757.)Behandelt ein
try-except*-Konstrukt die gesamteExceptionGroupund löst eine andere Ausnahme aus, wird diese Ausnahme nicht mehr in eineExceptionGroupeingehüllt. Ebenfalls geändert in Version 3.11.4. (Beigetragen von Irit Katriel in gh-103590.)Die Speicherbereinigung läuft jetzt nur noch über den Eval-Breaker-Mechanismus der Bytecode-Auswertungsschleife von Python und nicht mehr beim Anfordern von Objektspeicher. Die Speicherbereinigung kann auch laufen, wenn
PyErr_CheckSignals()aufgerufen wird, sodass C-Erweiterungen, die lange laufen müssen, ohne Python-Code auszuführen, ebenfalls Gelegenheit haben, die Speicherbereinigung von Zeit zu Zeit auszuführen. (Beigetragen von Pablo Galindo in gh-97922.)Alle eingebauten und aus Erweiterungen stammenden aufrufbaren Objekte, die boolesche Parameter erwarten, nehmen jetzt Argumente jeden Typs an und nicht mehr nur
boolundint. (Beigetragen von Serhiy Storchaka in gh-60203.)memoryviewunterstützt jetzt den Typ Half-Float (das Formatzeichen „e“). (Beigetragen von Donghee Na und Antoine Pitrou in gh-90751.)slice-Objekte sind jetzt hashbar und lassen sich damit als Dictionary-Schlüssel und Mengenelemente verwenden. (Beigetragen von Will Bradshaw, Furkan Onder und Raymond Hettinger in gh-101264.)sum()verwendet jetzt die Neumaier-Summation, um beim Summieren von Gleitkommazahlen oder einer Mischung aus ganzen und Gleitkommazahlen genauer und kommutativ zu arbeiten. (Beigetragen von Raymond Hettinger in gh-100425.)ast.parse()löst jetzt einenSyntaxErrorstatt einesValueErroraus, wenn Quelltext ausgewertet wird, der Nullbytes enthält. (Beigetragen von Pablo Galindo in gh-96670.)Die Methoden zum Entpacken in
tarfileundshutil.unpack_archive()haben ein neues Argument filter, mit dem sich tar-Features einschränken lassen, die überraschend oder gefährlich sein können, etwa Dateien außerhalb des Zielverzeichnisses anzulegen. Einzelheiten unter Filter beim Entpacken mit tarfile. In Python 3.14 wird die Voreinstellung auf'data'umgestellt. (Beigetragen von Petr Viktorin in PEP 706.)types.MappingProxyType-Instanzen sind jetzt hashbar, wenn das zugrunde liegende Mapping hashbar ist. (Beigetragen von Serhiy Storchaka in gh-87995.)Unterstützung für den perf-Profiler ist hinzugekommen, über die neue Umgebungsvariable
PYTHONPERFSUPPORTund die Befehlszeilenoption-X perfsowie über die neuen Funktionensys.activate_stack_trampoline(),sys.deactivate_stack_trampoline()undsys.is_stack_trampoline_active(). (Entwurf 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 jetzt die Indizierung und ist damit ein generischer Typ. (Beigetragen von Jelle Zijlstra in gh-98658.)
asyncio¶
Das Schreiben auf Sockets in
asyncioist deutlich schneller geworden.asynciovermeidet beim Schreiben auf Sockets jetzt unnötige Kopien und verwendetsendmsg(), sofern die Plattform es unterstützt. (Beigetragen von Kumar Aditya in gh-91166.)Die Funktionen
asyncio.eager_task_factory()undasyncio.create_eager_task_factory()sind hinzugekommen, mit denen sich eine Ereignisschleife auf die vorgezogene Ausführung von Aufträgen umstellen lässt, was manche Anwendungsfälle zwei- bis fünfmal schneller macht. (Beigetragen von Jacob Bower und Itamar Oren in gh-102853, gh-104140 und gh-104138)Unter Linux verwendet
asynciovon sich ausasyncio.PidfdChildWatcherstattasyncio.ThreadedChildWatcher, sofernos.pidfd_open()verfügbar und funktionsfähig ist. (Beigetragen von Kumar Aditya in gh-98024.)Die Ereignisschleife verwendet jetzt den besten verfügbaren Child-Watcher für die jeweilige Plattform (
asyncio.PidfdChildWatcher, sofern unterstützt, sonstasyncio.ThreadedChildWatcher), sodass es nicht empfohlen ist, einen Child-Watcher von Hand einzustellen. (Beigetragen von Kumar Aditya in gh-94597.)Der Parameter loop_factory ist zu
asyncio.run()hinzugekommen, um eine eigene Fabrik für Ereignisschleifen angeben zu können. (Beigetragen von Kumar Aditya in gh-99388.)Eine C-Umsetzung von
asyncio.current_task()ist hinzugekommen, die vier- bis sechsmal schneller ist. (Beigetragen von Itamar Oren und Pranav Thulasiram Bhat in gh-100344.)asyncio.iscoroutine()gibt für Generatoren jetztFalsezurück, dennasynciounterstützt die alten generatorbasierten Coroutinen nicht. (Beigetragen von Kumar Aditya in gh-102748.)asyncio.wait()undasyncio.as_completed()nehmen jetzt Generatoren an, die Aufträge liefern. (Beigetragen von Kumar Aditya in gh-78530.)
Kalender¶
Die Aufzählungen
calendar.Monthundcalendar.Daysind hinzugekommen. Sie legen die Monate des Jahres und die Tage der Woche fest. (Beigetragen von Prince Roshan in gh-103636.)
csv¶
Die Schalter
csv.QUOTE_NOTNULLundcsv.QUOTE_STRINGSsind hinzugekommen, um feiner zu steuern, wiereader- undwriter-Objekte mitNoneund leeren Zeichenketten umgehen.
dis¶
Die Opcodes der Pseudo-Anweisungen (die der Compiler verwendet, die aber im ausführbaren Bytecode nicht vorkommen) sind jetzt im Modul
diszugänglich.HAVE_ARGUMENTgilt weiterhin für echte Opcodes, ist für Pseudo-Anweisungen aber nicht brauchbar. Verwende stattdessen die neue Sammlungdis.hasarg. (Beigetragen von Irit Katriel in gh-94216.)Die Sammlung
dis.hasexcist hinzugekommen, um Anweisungen zu kennzeichnen, die einen Ausnahmebehandler setzen. (Beigetragen von Irit Katriel in gh-94216.)
fractions¶
Objekte vom Typ
fractions.Fractionunterstützen jetzt die Formatierung im Stil von Gleitkommazahlen. (Beigetragen von Mark Dickinson in gh-100161.)
importlib.resources¶
importlib.resources.as_file()unterstützt jetzt Ressourcenverzeichnisse. (Beigetragen von Jason R. Coombs in gh-97930.)Der erste Parameter von
importlib.resources.files()ist in anchor umbenannt. (Beigetragen von Jason R. Coombs in gh-100598.)
inspect¶
inspect.markcoroutinefunction()ist hinzugekommen, um synchrone Funktionen, die eine Coroutine zurückgeben, für die Verwendung mitinspect.iscoroutinefunction()zu kennzeichnen. (Beigetragen von Carlton Gibson in gh-99247.)inspect.getasyncgenstate()undinspect.getasyncgenlocals()sind hinzugekommen, um den aktuellen Zustand asynchroner Generatoren zu ermitteln. (Beigetragen von Thomas Krennwallner in gh-79940.)inspect.getattr_static()ist deutlich schneller geworden. Die meisten Aufrufe der Funktion sollten mindestens doppelt so schnell sein wie in Python 3.11. (Beigetragen von Alex Waygood in gh-103193.)
itertools¶
itertools.batched()ist hinzugekommen, um in gleich große Tupel zu sammeln, wobei das letzte Bündel kürzer sein kann als die übrigen. (Beigetragen von Raymond Hettinger in gh-98363.)
math¶
math.sumprod()ist hinzugekommen, um eine Summe von Produkten zu berechnen. (Beigetragen von Raymond Hettinger in gh-100485.)math.nextafter()ist um ein Argument steps erweitert, um mehrere Schritte auf einmal nach oben oder unten zu gehen. (Beigetragen von Matthias Goergens, Mark Dickinson und Raymond Hettinger in gh-94906.)
os¶
os.PIDFD_NONBLOCKist hinzugekommen, um mitos.pidfd_open()einen Dateideskriptor für einen Prozess im nicht blockierenden Modus zu öffnen. (Beigetragen von Kumar Aditya in gh-93312.)os.DirEntryhat jetzt eine Methodeos.DirEntry.is_junction(), mit der sich prüfen lässt, ob der Eintrag eine Junction ist. (Beigetragen von Charles Machalow in gh-99547.)Die Funktionen
os.listdrives(),os.listvolumes()undos.listmounts()sind unter Windows hinzugekommen, um Laufwerke, Datenträger und Einhängepunkte aufzuzählen. (Beigetragen von Steve Dower in gh-102519.)os.stat()undos.lstat()arbeiten unter Windows jetzt genauer. Das Feldst_birthtimeenthält jetzt die Erstellungszeit der Datei, undst_ctimeist als veraltet markiert, enthält aber weiterhin die Erstellungszeit (wird künftig jedoch die letzte Änderung der Metadaten zurückgeben, in Übereinstimmung mit anderen Plattformen).st_devdarf je nach Dateisystem bis zu 64 Bit undst_inobis zu 128 Bit lang sein, undst_rdevwird immer auf null gesetzt statt auf falsche Werte. Beide Funktionen können auf neueren Windows-Ausgaben deutlich schneller sein. (Beigetragen von Steve Dower in gh-99726.)
os.path¶
os.path.isjunction()ist hinzugekommen, um zu prüfen, ob ein angegebener Pfad eine Junction ist. (Beigetragen von Charles Machalow in gh-99547.)os.path.splitroot()ist hinzugekommen, um einen Pfad in ein Tripel(drive, root, tail)zu zerlegen. (Beigetragen von Barney Gale in gh-101000.)
pathlib¶
Unterstützung dafür, von
pathlib.PurePathundpathlib.Pathsowie von ihren Posix- und Windows-eigenen Varianten abzuleiten, ist hinzugekommen. Unterklassen dürfen die Methodepathlib.PurePath.with_segments()überschreiben, um Informationen zwischen Pfadinstanzen weiterzugeben.pathlib.Path.walk()ist hinzugekommen, um Verzeichnisbäume zu durchlaufen und alle darin enthaltenen Datei- und Verzeichnisnamen zu liefern, ähnlich wieos.walk(). (Beigetragen von Stanislav Zmiev in gh-90385.)Der optionale Parameter walk_up ist zu
pathlib.PurePath.relative_to()hinzugekommen, um..-Einträge im Ergebnis zu erlauben. Dieses Verhalten stimmt besser mitos.path.relpath()überein. (Beigetragen von Domenico Ragusa in gh-84538.)pathlib.Path.is_junction()ist als Stellvertreter füros.path.isjunction()hinzugekommen. (Beigetragen von Charles Machalow in gh-99547.)Der optionale Parameter case_sensitive ist zu
pathlib.Path.glob(),pathlib.Path.rglob()undpathlib.PurePath.match()hinzugekommen, um die Groß- und Kleinschreibung beim Abgleich des Pfads festzulegen und den Abgleich damit genauer steuern zu können.
platform¶
Unterstützung dafür, Windows 11 und Windows-Server-Ausgaben nach 2012 zu erkennen, ist hinzugekommen. Vorher gaben Abfragen auf Windows-Server-Plattformen, die neuer als Windows Server 2012 sind, und unter Windows 11
Windows-10zurück. (Beigetragen von Steve Dower in gh-89545.)
pdb¶
Praktische Variablen sind hinzugekommen, die Werte für die Dauer einer Debug-Sitzung festhalten und schnellen Zugriff auf Werte wie den aktuellen Rahmen oder den Rückgabewert bieten. (Beigetragen von Tian Gao in gh-103693.)
random¶
random.binomialvariate()ist hinzugekommen. (Beigetragen von Raymond Hettinger in gh-81620.)Für
random.expovariate()ist die Voreinstellunglambd=1.0hinzugekommen. (Beigetragen von Raymond Hettinger in gh-100234.)
shutil¶
shutil.make_archive()gibt das Argument root_dir jetzt an eigene Archivierer weiter, die es unterstützen. In diesem Fall wird das aktuelle Arbeitsverzeichnis des Prozesses für das Archivieren nicht mehr vorübergehend auf root_dir gewechselt. (Beigetragen von Serhiy Storchaka in gh-74696.)shutil.rmtree()nimmt jetzt ein neues Argument onexc an, einen Fehlerbehandler wie onerror, der jedoch eine Ausnahmeinstanz statt eines Tripels (typ, val, tb) erwartet. onerror ist als veraltet markiert. (Beigetragen von Irit Katriel in gh-102828.)shutil.which()zieht jetzt die Umgebungsvariable PATHEXT zurate, um unter Windows Treffer innerhalb von PATH zu finden, selbst wenn das angegebene cmd einen Verzeichnisteil enthält. (Beigetragen von Charles Machalow in gh-103179.)shutil.which()ruft bei der Suche nach ausführbaren Dateien unter WindowsNeedCurrentDirectoryForExePathWauf, um festzustellen, 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 zu cmd mit einer Endung ausPATHEXTpasst, bevor eine unmittelbare Übereinstimmung an anderer Stelle im Suchpfad herangezogen wird. (Beigetragen von Charles Machalow in gh-103179.)
sqlite3¶
Eine Befehlszeilenschnittstelle ist hinzugekommen. (Beigetragen von Erlend E. Aasland in gh-77617.)
Das Attribut
sqlite3.Connection.autocommitist zusqlite3.Connectionund der Parameter autocommit zusqlite3.connect()hinzugekommen, um die Transaktionsbehandlung nach PEP 249 zu steuern. (Beigetragen von Erlend E. Aasland in gh-83638.)Der nur über Schlüsselwort angebbare Parameter entrypoint ist zu
sqlite3.Connection.load_extension()hinzugekommen, um den Einsprungpunkt der SQLite-Erweiterung zu überschreiben. (Beigetragen von Erlend E. Aasland in gh-103015.)sqlite3.Connection.getconfig()undsqlite3.Connection.setconfig()sind zusqlite3.Connectionhinzugekommen, um Konfigurationsänderungen an einer Datenbankverbindung vorzunehmen. (Beigetragen von Erlend E. Aasland in gh-103489.)
statistics¶
statistics.correlation()ist um eine Methoderankederweitert, um die Spearman-Korrelation rangskalierter Daten zu berechnen. (Beigetragen von Raymond Hettinger in gh-95861.)
sys¶
Der Namensraum
sys.monitoringist hinzugekommen, um die neue Überwachungs-API aus PEP 669 zugänglich zu machen. (Beigetragen von Mark Shannon in gh-103082.)sys.activate_stack_trampoline()undsys.deactivate_stack_trampoline()sind hinzugekommen, um Trampoline für Stapel-Profiler ein- und auszuschalten, sowiesys.is_stack_trampoline_active(), um abzufragen, ob sie eingeschaltet sind. (Beigetragen von Pablo Galindo und Christian Heimes, mit Beiträgen von Gregory P. Smith [Google] und Mark Shannon in gh-96123.)sys.last_excist hinzugekommen. Es enthält die letzte unbehandelte Ausnahme, die ausgelöst wurde (für die Fehlersuche im Nachhinein). Die drei Felder, die dieselbe Information in ihrer alten Form enthalten, sind als veraltet markiert:sys.last_type,sys.last_valueundsys.last_traceback. (Beigetragen von Irit Katriel in gh-102778.)sys._current_exceptions()gibt jetzt eine Zuordnung von Thread-Kennung auf eine Ausnahmeinstanz zurück statt auf ein Tupel(typ, exc, tb). (Beigetragen von Irit Katriel in gh-103176.)sys.setrecursionlimit()undsys.getrecursionlimit(). Die Rekursionsgrenze gilt jetzt nur noch für Python-Code. Eingebaute Funktionen verwenden die Rekursionsgrenze nicht, sind aber durch einen anderen Mechanismus davor geschützt, dass Rekursion die virtuelle Maschine zum Absturz bringt.
tempfile¶
Die Funktion
tempfile.NamedTemporaryFilehat einen neuen optionalen Parameter delete_on_close. (Beigetragen von Evgeny Zorin in gh-58451.)tempfile.mkdtemp()gibt jetzt immer einen absoluten Pfad zurück, auch wenn das für den Parameter dir übergebene Argument ein relativer Pfad ist.
threading¶
threading.settrace_all_threads()undthreading.setprofile_all_threads()sind hinzugekommen, mit denen sich Funktionen für Tracing und Profiling in allen laufenden Threads setzen lassen, nicht nur im aufrufenden. (Beigetragen von Pablo Galindo in gh-93503.)
tkinter¶
tkinter.Canvas.coords()flacht seine Argumente jetzt ab. Es nimmt jetzt nicht nur Koordinaten als einzelne Argumente (x1, y1, x2, y2, ...) und eine Folge von Koordinaten ([x1, y1, x2, y2, ...]) an, sondern auch paarweise gruppierte Koordinaten ((x1, y1), (x2, y2), ...und[(x1, y1), (x2, y2), ...]), so wie diecreate_*()-Methoden. (Beigetragen von Serhiy Storchaka in gh-94473.)
tokenize¶
Das Modul
tokenizeenthält die Änderungen aus PEP 701. (Beigetragen von Marta Gómez Macías und Pablo Galindo in gh-102856.) Mehr zu den Änderungen am Modultokenizesteht unter Portierung auf Python 3.12.
types¶
types.get_original_bases()ist hinzugekommen, um User-defined generic types bei Ableitungen genauer untersuchen zu können. (Beigetragen von James Hilton-Balfe und Alex Waygood in gh-101827.)
typing¶
Prüfungen mit
isinstance()gegenzur Laufzeit prüfbare Protokolleverwenden jetztinspect.getattr_static()statthasattr(), um nachzusehen, ob Attribute vorhanden sind. Das heißt, dass Deskriptoren und__getattr__()-Methoden beiisinstance()-Prüfungen gegen zur Laufzeit prüfbare Protokolle nicht mehr unerwartet ausgewertet werden. Es kann allerdings auch bedeuten, dass manche Objekte, die bisher als Instanzen eines zur Laufzeit prüfbaren Protokolls galten, in Python 3.12 und neuer nicht mehr als Instanzen dieses Protokolls gelten, und umgekehrt. Die meisten Anwender sind von dieser Änderung wahrscheinlich nicht betroffen. (Beigetragen von Alex Waygood in gh-102433.)Die Mitglieder eines zur Laufzeit prüfbaren Protokolls gelten zur Laufzeit jetzt als „eingefroren“, sobald die Klasse erzeugt ist. Attribute nachträglich an ein zur Laufzeit prüfbares Protokoll zu hängen funktioniert weiterhin, hat aber keine Wirkung 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) # unveraendert, obwohl HasX jetzt auch ein Attribut "y" hat True
Diese Änderung wurde vorgenommen, um
isinstance()-Prüfungen gegen zur Laufzeit prüfbare Protokolle zu beschleunigen.Das Geschwindigkeitsverhalten von
isinstance()-Prüfungen gegenzur Laufzeit prüfbare Protokollehat sich deutlich geändert. Die meistenisinstance()-Prüfungen gegen Protokolle mit nur wenigen Mitgliedern sollten mindestens doppelt so schnell sein wie in 3.11, manche zwanzigmal schneller oder mehr.isinstance()-Prüfungen gegen Protokolle mit vielen Mitgliedern können dagegen langsamer sein als in Python 3.11. (Beigetragen von Alex Waygood in gh-74690 und gh-103193.)Alle
typing.TypedDict- undtyping.NamedTuple-Klassen haben jetzt das Attribut__orig_bases__. (Beigetragen von Adrian Garcia Badaracco in gh-103699.)Der Parameter
frozen_defaultist zu@typing.dataclass_transformhinzugekommen. (Beigetragen von Erik De Bonte in gh-99957.)
unicodedata¶
Die Unicode-Datenbank ist auf Version 15.0.0 aktualisiert. (Beigetragen von Benjamin Peterson in gh-96734).
unittest¶
Eine Befehlszeilenoption --durations ist hinzugekommen, 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¶
Eine Befehlszeilenschnittstelle ist hinzugekommen. (Beigetragen von Adam Chhina in gh-88597.)
Optimierungen¶
Die Elemente
wstrundwstr_lengthsind aus den Unicode-Objekten entfernt. Das verkleinert die Objekte auf 64-Bit-Plattformen um 8 oder 16 Byte. (PEP 623) (Beigetragen von Inada Naoki in gh-92536.)Versuchsweise Unterstützung dafür, im Build-Prozess den Binäroptimierer BOLT zu verwenden, ist hinzugekommen. Er verbessert die Geschwindigkeit um 1 bis 5 %. (Beigetragen von Kevin Modzelewski in gh-90536 und abgestimmt von Donghee Na in gh-101525)
Das Ersetzen in regulären Ausdrücken (die Funktionen
re.sub()undre.subn()sowie die entsprechenden Methoden vonre.Pattern) ist bei Ersetzungszeichenketten mit Gruppenverweisen zwei- bis dreimal schneller. (Beigetragen von Serhiy Storchaka in gh-91524.)Das Erzeugen von
asyncio.Taskist schneller, weil aufwendige Zeichenkettenformatierung aufgeschoben wird. (Beigetragen von Itamar Oren in gh-103793.)Die Funktionen
tokenize.tokenize()undtokenize.generate_tokens()sind bis zu 64 % schneller, als Nebenwirkung der Änderungen, die nötig waren, um PEP 701 im Modultokenizeabzudecken. (Beigetragen von Marta Gómez Macías und Pablo Galindo in gh-102856.)super()-Methodenaufrufe und Attributzugriffe sind über die neue AnweisungLOAD_SUPER_ATTRschneller. (Beigetragen von Carl Meyer und Vladimir Matveev in gh-103497.)
CPython Bytecode Änderungen¶
Die Anweisung
LOAD_METHODist entfernt. Sie ist inLOAD_ATTRaufgegangen.LOAD_ATTRverhält sich jetzt wie die alte AnweisungLOAD_METHOD, wenn das niedrigste Bit seines Opargs gesetzt ist. (Beigetragen von Ken Jin in gh-93429.)Die Anweisungen
JUMP_IF_FALSE_OR_POPundJUMP_IF_TRUE_OR_POPsind entfernt. (Beigetragen von Irit Katriel in gh-102859.)Die Anweisung
PRECALList entfernt. (Beigetragen von Mark Shannon in gh-92925.)Die Anweisungen
BINARY_SLICEundSTORE_SLICEsind hinzugekommen. (Beigetragen von Mark Shannon in gh-94163.)Die Anweisungen
CALL_INTRINSIC_1sind hinzugekommen. (Beigetragen von Mark Shannon in gh-99005.)Die Anweisung
CALL_INTRINSIC_2ist hinzugekommen. (Beigetragen von Irit Katriel in gh-101799.)Die Anweisung
CLEANUP_THROWist hinzugekommen. (Beigetragen von Brandt Bucher in gh-90997.)Die Anweisung
END_SENDist hinzugekommen. (Beigetragen von Mark Shannon in gh-103082.)Die Anweisung
LOAD_FAST_AND_CLEARist als Teil der Umsetzung von PEP 709 hinzugekommen. (Beigetragen von Carl Meyer in gh-101441.)Die Anweisung
LOAD_FAST_CHECKist hinzugekommen. (Beigetragen von Dennis Sweeney in gh-93143.)Die Opcodes
LOAD_FROM_DICT_OR_DEREF,LOAD_FROM_DICT_OR_GLOBALSundLOAD_LOCALSsind als Teil der Umsetzung von PEP 695 hinzugekommen. Der OpcodeLOAD_CLASSDEREFist entfernt. Er lässt sich durchLOAD_LOCALSplusLOAD_FROM_DICT_OR_DEREFersetzen. (Beigetragen von Jelle Zijlstra in gh-103764.)Die Anweisung
LOAD_SUPER_ATTRist hinzugekommen. (Beigetragen von Carl Meyer und Vladimir Matveev in gh-103497.)Die Anweisung
RETURN_CONSTist hinzugekommen. (Beigetragen von Wenyang Wang in gh-101632.)
Demos und Werkzeuge¶
Das Verzeichnis
Tools/demo/mit alten Demo-Skripten ist entfernt. Eine Kopie findet sich im old-demos project. (Beigetragen von Victor Stinner in gh-97681.)Veraltete Beispielskripte aus dem Verzeichnis
Tools/scripts/sind entfernt. Eine Kopie findet sich im old-demos project. (Beigetragen von Victor Stinner in gh-97669.)
Als veraltet markiert¶
argparse: Die Parameter type, choices und metavar vonargparse.BooleanOptionalActionsind veraltet und werden in Version 3.14 entfernt. (Beitrag von Nikita Sobolev unter gh-92248.)ast: Die folgendenast-Features waren in der Dokumentation seit Python 3.8 als veraltet markiert, lösen beim Zugriff oder bei der Verwendung jetzt zur Laufzeit eineDeprecationWarningaus und werden in Python 3.14 entfernt:ast.Numast.Strast.Bytesast.NameConstantast.Ellipsis
Verwende stattdessen
ast.Constant. (Beigetragen von Serhiy Storchaka in gh-90953.)-
Die „Child-Watcher“-Klassen
asyncio.MultiLoopChildWatcher,asyncio.FastChildWatcher,asyncio.AbstractChildWatcherundasyncio.SafeChildWatchersind veraltet und werden in Python 3.14 entfernt. (Beitrag von Kumar Aditya unter gh-94597.)asyncio.set_child_watcher(),asyncio.get_child_watcher(),asyncio.AbstractEventLoopPolicy.set_child_watcher()undasyncio.AbstractEventLoopPolicy.get_child_watcher()sind veraltet und werden in Python 3.14 entfernt. (Beitrag von Kumar Aditya unter gh-94597.)Die Methode „
get_event_loop()“ der Standard-Ereignisschleifenrichtlinie löst nun eine „DeprecationWarning“ aus, wenn derzeit keine Ereignisschleife festgelegt ist und sie beschließt, eine solche zu erstellen. (Beitrag von Serhiy Storchaka und Guido van Rossum unter gh-100160.)
calendar: Die Konstantencalendar.Januaryundcalendar.Februarysind veraltet und werden durchcalendar.JANUARYundcalendar.FEBRUARYersetzt. (Beigetragen von Prince Roshan in gh-103636.)collections.abc:collections.abc.ByteStringist als veraltet markiert.Verwende
isinstance(obj, collections.abc.Buffer), um zur Laufzeit zu prüfen, obobjdas Buffer-Protokoll implementiert. Für Typannotationen verwende entwederBufferoder eine Union, die explizit die von deinem Code unterstützten Typen angibt (z. B.bytes | bytearray | memoryview).ByteStringwar ursprünglich als abstrakte Klasse gedacht, die als Obertyp sowohl vonbytesals auch vonbytearraydienen sollte. Da die ABC jedoch nie Methoden hatte, sagte das Wissen, dass ein Objekt eine Instanz vonByteStringist, nie etwas Nützliches über das Objekt aus. Andere gängige Puffertypen wiememoryviewwurden ebenfalls nie als Untertypen vonByteStringverstanden (weder zur Laufzeit noch von statischen Typprüfern).Weitere Details findest du in PEP 688. (Beigetragen von Shantanu Jain in gh-91896.)
datetime: Die Methodenutcnow()undutcfromtimestamp()vondatetime.datetimesind als veraltet markiert und werden in einer künftigen Version entfernt. Verwende stattdessen zeitzonenbewusste Objekte, um Zeitpunkte in UTC darzustellen: rufe alsonow()beziehungsweisefromtimestamp()mit dem Parameter tz aufdatetime.UTCgesetzt auf. (Beigetragen von Paul Ganssle in gh-103857.)email: Der Parameter isdst inemail.utils.localtime()ist als veraltet markiert. (Beigetragen von Alan Williams in gh-72346.)importlib.abc: Die folgenden Klassen sind als veraltet markiert, die Entfernung ist für Python 3.14 geplant:importlib.abc.ResourceReaderimportlib.abc.Traversableimportlib.abc.TraversableResources
Verwende stattdessen
importlib.resources.abcKlassen:(Beigetragen von Jason R. Coombs und Hugo van Kemenade in gh-93963.)
itertools: Die Unterstützung für die Operationen copy, deepcopy und pickle ist als veraltet markiert. Sie ist nicht dokumentiert, ineffizient, seit je fehlerhaft und uneinheitlich. Sie wird in 3.14 entfernt, was den Codeumfang und den Pflegeaufwand deutlich senkt. (Beigetragen von Raymond Hettinger in gh-101588.)multiprocessing: In Python 3.14 wechselt die voreingestellte Startmethode vonmultiprocessingunter Linux, den BSDs und anderen POSIX-Plattformen außer macOS, wo derzeit'fork'die Voreinstellung ist, auf eine sicherere (gh-84559). Eine Warnung dazu zur Laufzeit erschien als zu störend, denn der größte Teil des Codes dürfte davon unberührt bleiben. Verwende die APIsget_context()oderset_start_method(), um ausdrücklich anzugeben, wann dein Code'fork'benötigt. Siehe Kontexte und Startmethoden.pkgutil:pkgutil.find_loader()undpkgutil.get_loader()sind als veraltet markiert und werden in Python 3.14 entfernt. Verwende stattdessenimportlib.util.find_spec(). (Beigetragen von Nikita Sobolev in gh-97850.)pty: Das Modul hat zwei nicht dokumentierte Funktionenmaster_open()undslave_open(), die seit Python 2 als veraltet gelten, aber erst in 3.12 eine richtigeDeprecationWarningbekommen haben. Entfernt werden sie in 3.14. (Beigetragen von Soumendra Ganguly und Gregory P. Smith in gh-85984.)os:Die Felder
st_ctime, dieos.stat()undos.lstat()unter Windows zurückgeben, sind als veraltet markiert. In einer künftigen Ausgabe enthalten sie die Zeit der letzten Änderung der Metadaten, in Übereinstimmung mit anderen Plattformen. Bis dahin enthalten sie weiterhin die Erstellungszeit, die auch im neuen Feldst_birthtimesteht. (Beigetragen von Steve Dower in gh-99726.)Auf POSIX-Plattformen kann
os.fork()jetzt eineDeprecationWarningauslösen, wenn es erkennen kann, dass es aus einem Prozess mit mehreren Threads aufgerufen wird. Das war auf der POSIX-Plattform immer schon von Grund auf unverträglich – selbst wenn solcher Code zu funktionieren schien. Wir haben die Warnung hinzugefügt, um dafür zu sensibilisieren, denn Probleme bei Code, der das tut, treten immer häufiger auf. Weitere Einzelheiten stehen in der Dokumentation zuos.fork(), und diese Diskussion darüber, dass fork mit Threads unverträglich ist erklärt, warum wir dieses lange bestehende Verträglichkeitsproblem der Plattform jetzt für Entwickler sichtbar machen.
Erscheint diese Warnung durch die Verwendung von
multiprocessingoderconcurrent.futures, besteht die Lösung darin, eine andere Startmethode vonmultiprocessingzu verwenden, etwa"spawn"oder"forkserver".shutil: Das Argument onerror vonshutil.rmtree()ist als veraltet markiert. Verwende stattdessen onexc. (Beigetragen von Irit Katriel in gh-102828.)-
Die voreingestellten Adapter und Konverter sind jetzt als veraltet markiert. Verwende stattdessen die Adapter and converter recipes und passe sie an deine Bedürfnisse an. (Beigetragen von Erlend E. Aasland in gh-90016.)
In
execute()wird jetzt eineDeprecationWarningausgegeben, wenn benannte Platzhalter zusammen mit Parametern verwendet werden, die als Folge statt alsdictübergeben werden. Ab Python 3.14 löst es einenProgrammingErroraus, benannte Platzhalter mit als Folge übergebenen Parametern zu verwenden. (Beigetragen von Erlend E. Aasland in gh-101698.)
sys: Die Feldersys.last_type,sys.last_valueundsys.last_tracebacksind als veraltet markiert. Verwende stattdessensys.last_exc. (Beigetragen von Irit Katriel in gh-102778.)tarfile: tar-Archive ohne Angabe von filter zu entpacken ist bis Python 3.14 als veraltet markiert. Dann wird der Filter'data'zur Voreinstellung. Einzelheiten unter Extraction filters.-
typing.Hashableundtyping.Sized, andere Namen fürcollections.abc.Hashablebeziehungsweisecollections.abc.Sized, sind als veraltet markiert. (gh-94309.)typing.ByteString, seit Python 3.9 als veraltet markiert, löst bei der Verwendung jetzt eineDeprecationWarningaus. (Beigetragen von Alex Waygood in gh-91896.)
xml.etree.ElementTree: Das Modul gibt jetzt eineDeprecationWarningaus, wenn der Wahrheitswert einesxml.etree.ElementTree.Elementgeprüft wird. Vorher gab die Python-Umsetzung eineFutureWarningaus und die C-Umsetzung gar nichts. (Beigetragen von Jacob Walls in gh-83122.)Die Signaturen mit drei Argumenten (type, value, traceback) von
coroutine throw(),generator throw()undasync generator throw()sind als veraltet markiert und können in einer künftigen Python-Version entfernt werden. Verwende stattdessen die Fassungen dieser Funktionen mit einem Argument. (Beigetragen von Ofey Chan in gh-89874.)Eine
DeprecationWarningwird jetzt ausgelöst, wenn__package__an einem Modul von__spec__.parentabweicht (vorher war es eineImportWarning). (Beigetragen von Brett Cannon in gh-65961.)__package__oder__cached__an einem Modul zu setzen ist als veraltet markiert. In Python 3.14 wird es vom Importsystem nicht mehr gesetzt und nicht mehr berücksichtigt. (Beigetragen von Brett Cannon in gh-65961.)Der bitweise Inversionsoperator (
~) auf bool ist als veraltet markiert. In Python 3.16 löst er einen Fehler aus. Verwende für die logische Negation von Wahrheitswerten stattdessennot. In dem seltenen Fall, dass du wirklich die bitweise Inversion des zugrunde liegendenintbrauchst, wandle ausdrücklich in int um:~int(x). (Beigetragen von Tim Hoffmann in gh-103487.)Der Zugriff auf
codeobject.co_lnotaban Codeobjekten wurde in Python 3.10 mit PEP 626 als veraltet markiert, bekam aber erst in 3.12 eine richtigeDeprecationWarning. Entfernt werden kann er in 3.15. (Beigetragen von Nikita Sobolev in gh-101866.)
Geplante Entfernung in Python 3.13¶
Module (siehe PEP 594):
aifcaudioopcgicgitbchunkcryptimghdrmailcapmsilibnisnntplibossaudiodevpipessndhdrspwdsunautelnetlibuuxdrlib
Weitere 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)
Geplante Entfernung in Python 3.14¶
argparse: Die Parameter type, choices und metavar vonargparse.BooleanOptionalActionsind veraltet und werden in Version 3.14 entfernt. (Beitrag von Nikita Sobolev unter gh-92248.)ast: Die folgenden Funktionen sind seit Python 3.8 in der Dokumentation als veraltet gekennzeichnet, lösen nun bei Zugriff oder Verwendung zur Laufzeit eine „DeprecationWarning“ aus und werden in Python 3.14 entfernt:ast.Numast.Strast.Bytesast.NameConstantast.Ellipsis
Verwende stattdessen
ast.Constant. (Beigetragen von Serhiy Storchaka in gh-90953.)-
Die „Child-Watcher“-Klassen
asyncio.MultiLoopChildWatcher,asyncio.FastChildWatcher,asyncio.AbstractChildWatcherundasyncio.SafeChildWatchersind veraltet und werden in Python 3.14 entfernt. (Beitrag von Kumar Aditya unter gh-94597.)asyncio.set_child_watcher(),asyncio.get_child_watcher(),asyncio.AbstractEventLoopPolicy.set_child_watcher()undasyncio.AbstractEventLoopPolicy.get_child_watcher()sind veraltet und werden in Python 3.14 entfernt. (Beitrag von Kumar Aditya unter gh-94597.)Die Methode „
get_event_loop()“ der Standard-Ereignisschleifenrichtlinie löst nun eine „DeprecationWarning“ aus, wenn derzeit keine Ereignisschleife festgelegt ist und sie beschließt, eine solche zu erstellen. (Beitrag von Serhiy Storchaka und Guido van Rossum unter gh-100160.)
email: Der Parameter isdst inemail.utils.localtime()wurde als veraltet markiert. (Beitrag von Alan Williams unter gh-72346.)importlib.abcveraltete Klassen:importlib.abc.ResourceReaderimportlib.abc.Traversableimportlib.abc.TraversableResources
Verwende stattdessen
importlib.resources.abcKlassen:(Beigetragen von Jason R. Coombs und Hugo van Kemenade in gh-93963.)
itertoolsboten eine undokumentierte, ineffiziente, seit jeher fehleranfällige und inkonsistente Unterstützung für copy-, deepcopy- und pickle-Operationen. Diese wird in Version 3.14 entfernt, um den Codeumfang und den Wartungsaufwand deutlich zu reduzieren. (Beitrag von Raymond Hettinger unter gh-101588.)multiprocessing: Die Standard-Startmethode wird unter Linux, BSD und anderen POSIX-Plattformen, die nicht macOS sind, auf eine sicherere Variante umgestellt, sofern dort derzeit „'fork'“ als Standard eingestellt ist (gh-84559). Das Hinzufügen einer Laufzeitwarnung hierzu wurde als zu störend erachtet, da davon ausgegangen wird, dass dies für den Großteil des Codes keine Rolle spielt. Verwende die APIs „get_context()“ oder „set_start_method()“, um explizit anzugeben, wann dein Code „'fork'“ erfordert. Siehe Contexts and start methods.pathlib:is_relative_to()undrelative_to(): Die Übergabe zusätzlicher Argumente ist veraltet.pkgutil: „pkgutil.find_loader()“ und „pkgutil.get_loader()“ lösen nun eine „DeprecationWarning“-Fehlermeldung aus. Verwende stattdessen „importlib.util.find_spec()“. (Beitrag von Nikita Sobolev unter gh-97850.)pty:master_open(): Verwendepty.openpty().slave_open(): Verwendepty.openpty().
-
versionundversion_info.execute()undexecutemany(), wenn benannte Platzhalter verwendet werden und parameters eine Sequenz anstelle einesdictist.
urllib: „urllib.parse.Quoter“ ist veraltet: Es war nicht als öffentliche API vorgesehen. (Beitrag von Gregory P. Smith unter gh-88168.)
Geplante Entfernung in Python 3.15¶
Das Importsystem:
__cached__an einem Modul zu setzen, ohne__spec__.cachedzu setzen, ist als veraltet markiert. In Python 3.15 wird__cached__vom Importsystem und von der Standardbibliothek nicht mehr gesetzt und nicht mehr berücksichtigt. (gh-97879)__package__an einem Modul zu setzen, ohne__spec__.parentzu setzen, ist als veraltet markiert. In Python 3.15 wird__package__vom Importsystem und von der Standardbibliothek nicht mehr gesetzt und nicht mehr berücksichtigt. (gh-97879)
-
Die nicht dokumentierte Funktion
ctypes.SetPointerType()ist seit Python 3.13 als veraltet markiert.
-
Die überholte und selten verwendete Klasse
CGIHTTPRequestHandlerist seit Python 3.13 als veraltet markiert. Es gibt keinen unmittelbaren Ersatz. Alles ist besser als CGI, um einen Webserver an einen Request-Handler anzubinden.Der Schalter
--cgider Befehlszeilenschnittstelle python -m http.server ist seit Python 3.13 als veraltet markiert.
-
Methode
load_module(): verwende stattdessenexec_module().
-
.PurePath.is_reserved()ist seit Python 3.13 als veraltet markiert. Verwendeos.path.isreserved(), um unter Windows vorbehaltene Pfade zu erkennen.
-
platform.java_ver()ist seit Python 3.13 als veraltet markiert. Diese Funktion ist nur für die Unterstützung von Jython nützlich, hat eine verwirrende API und ist kaum getestet.
-
Das Argument check_home von
sysconfig.is_python_build()ist seit Python 3.12 als veraltet markiert.
-
RLock()nimmt in Python 3.15 keine Argumente mehr an. Argumente zu übergeben ist seit Python 3.14 als veraltet markiert, denn die Python-Fassung erlaubt keine Argumente, während die C-Fassung beliebig viele positionsbezogene oder Schlüsselwortargumente annimmt und sie alle übergeht.
-
types.CodeType: Der Zugriff aufcodeobject.co_lnotabwurde in PEP 626 seit 3.10 als veraltet markiert und sollte in 3.12 entfernt werden, bekam dort aber erst eine richtigeDeprecationWarning. Entfernt werden kann er in 3.15. (Beigetragen von Nikita Sobolev in gh-101866.)
-
Die nicht dokumentierte Schreibweise mit Schlüsselwortargumenten, um
NamedTuple-Klassen zu erzeugen (zum BeispielPoint = NamedTuple("Point", x=int, y=int)), ist seit Python 3.13 als veraltet markiert. Verwende stattdessen die klassenbasierte oder die funktionale Schreibweise.Bei der funktionalen Schreibweise von
TypedDicts ist es seit Python 3.13 als veraltet markiert, dem Parameter fields keinen Wert zu übergeben (TD = TypedDict("TD")) oderNonezu übergeben (TD = TypedDict("TD", None)). Verwendeclass TD(TypedDict): passoderTD = TypedDict("TD", {}), um ein TypedDict ohne Felder zu erzeugen.Die Dekoratorfunktion
@typing.no_type_check_decoratorist seit Python 3.13 als veraltet markiert. Nach acht Jahren im Modultypingwird sie noch von keinem größeren Typprüfer unterstützt.
Module
sre_compile,sre_constantsundsre_parse.wave:Die Methoden
getmark(),setmark()undgetmarkers()der KlassenWave_readundWave_writesind seit Python 3.13 als veraltet markiert.
-
zipimport.zipimporter.load_module()ist seit Python 3.10 als veraltet markiert. Verwende stattdessenexec_module(). (gh-125746.)
Geplante Entfernung in Python 3.16¶
Das Importsystem:
Das Setzen von
__loader__für ein Modul, ohne__spec__.loaderzu setzen, ist veraltet. In Python 3.16 wird__loader__vom Importsystem und der Standardbibliothek weder gesetzt noch berücksichtigt.
-
Das Formatzeichen
'u'(wchar_t) ist seit Python 3.3 in der Dokumentation und seit Python 3.13 zur Laufzeit veraltet. Verwende für Unicode-Zeichen stattdessen das Formatzeichen'w'(Py_UCS4).
-
asyncio.iscoroutinefunction()ist veraltet und wird in Python 3.16 entfernt. Verwende stattdesseninspect.iscoroutinefunction(). (Beigetragen von Jiahao Li und Kumar Aditya in gh-122875.)Das Policy-System von
asyncioist veraltet und wird in Python 3.16 entfernt. Insbesondere die folgenden Klassen und Funktionen sind veraltet:Verwende
asyncio.run()oderasyncio.Runnermit loop_factory, um die gewünschte Implementierung der Ereignisschleife zu verwenden.Zum Beispiel, um
asyncio.SelectorEventLoopunter Windows zu verwenden:import asyncio async def main(): ... asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
(Beigetragen von Kumar Aditya in gh-127949.)
-
Die bitweise Invertierung boolescher Typen,
~Trueoder~False, ist seit Python 3.12 veraltet, da sie überraschende und unintuitive Ergebnisse liefert (-2und-1). Verwende stattdessennot xfür die logische Negation eines booleschen Werts. In dem seltenen Fall, dass du die bitweise Invertierung der zugrunde liegenden Ganzzahl benötigst, konvertiere explizit nachint(~int(x)).
-
Der Aufruf der Python-Implementierung von
functools.reduce()mit function oder sequence als Schlüsselwortargumenten ist seit Python 3.14 veraltet.
-
Die Unterstützung eigener Logging-Handler mit dem Argument strm ist veraltet und soll in Python 3.16 entfernt werden. Definiere Handler stattdessen mit dem Argument stream. (Beigetragen von Mariusz Felisiak in gh-115032.)
-
Gültige Endungen für
mimetypes.MimeTypes.add_type()beginnen mit einem „.“ oder sind leer. Endungen ohne Punkt 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 wird seit Python 3.4 von keiner Funktion inshutilmehr verwendet und ist jetzt ein Alias vonRuntimeError.
-
Die Methode
Class.get_methodsist seit Python 3.14 veraltet.
sys:Die Funktion
_enablelegacywindowsfsencoding()ist seit Python 3.13 veraltet. Verwende stattdessen die UmgebungsvariablePYTHONLEGACYWINDOWSFSENCODING.
-
Die Funktion
sysconfig.expand_makefile_vars()ist seit Python 3.14 veraltet. Verwende stattdessen das Argumentvarsvonsysconfig.get_paths().
-
Das undokumentierte und ungenutzte Attribut
TarFile.tarfileist seit Python 3.13 veraltet.
Geplante Entfernung in Python 3.17¶
-
Aufrufe von
strptime()mit einer Formatzeichenkette, die%e(Tag des Monats) ohne Jahr enthält. Dies ist seit Python 3.15 veraltet. (Beigetragen von Stan Ulbrych in gh-70647.)
-
collections.abc.ByteStringsoll in Python 3.17 entfernt werden.Verwende
isinstance(obj, collections.abc.Buffer), um zur Laufzeit zu prüfen, obobjdas Buffer-Protokoll implementiert. Für Typannotationen verwende entwederBufferoder eine Union, die explizit die von deinem Code unterstützten Typen angibt (z. B.bytes | bytearray | memoryview).ByteStringwar ursprünglich als abstrakte Klasse gedacht, die als Obertyp sowohl vonbytesals auch vonbytearraydienen sollte. Da die ABC jedoch nie Methoden hatte, sagte das Wissen, dass ein Objekt eine Instanz vonByteStringist, nie etwas Nützliches über das Objekt aus. Andere gängige Puffertypen wiememoryviewwurden ebenfalls nie als Untertypen vonByteStringverstanden (weder zur Laufzeit noch von statischen Typprüfern).Weitere Details findest du in PEP 688. (Beigetragen von Shantanu Jain in gh-91896.)
-
Die Übergabe von Namen für encoding, die nicht ASCII sind, an
encodings.normalize_encoding()ist veraltet und soll in Python 3.17 entfernt werden. (Beigetragen von Stan Ulbrych in gh-136702.)
-
Das Modul
profileist veraltet und wird in Python 3.17 entfernt. Verwende stattdessenprofiling.tracing, das eine kompatible API bietet. Details findest du in PEP 799. (Beigetragen von Pablo Galindo und László Kiss Kollár in gh-138122.)
-
webbrowser.MacOSXOSAScriptist zugunsten vonwebbrowser.MacOSveraltet. (gh-137586)
-
Vor Python 3.14 wurden Unions im alten Stil mit der privaten Klasse
typing._UnionGenericAliasimplementiert. Diese Klasse wird für die Implementierung nicht mehr benötigt, wurde aber aus Gründen der Abwärtskompatibilität beibehalten. Ihre Entfernung ist für Python 3.17 geplant. Verwende dokumentierte Hilfsfunktionen zur Introspektion wietyping.get_origin()undtyping.get_args(), statt dich auf private Implementierungsdetails zu verlassen.typing.ByteString, seit Python 3.9 veraltet, soll in Python 3.17 entfernt werden.Verwende
isinstance(obj, collections.abc.Buffer), um zur Laufzeit zu prüfen, obobjdas Buffer-Protokoll implementiert. Für Typannotationen verwende entwederBufferoder eine Union, die explizit die von deinem Code unterstützten Typen angibt (z. B.bytes | bytearray | memoryview).ByteStringwar ursprünglich als abstrakte Klasse gedacht, die als Obertyp sowohl vonbytesals auch vonbytearraydienen sollte. Da die ABC jedoch nie Methoden hatte, sagte das Wissen, dass ein Objekt eine Instanz vonByteStringist, nie etwas Nützliches über das Objekt aus. Andere gängige Puffertypen wiememoryviewwurden ebenfalls nie als Untertypen vonByteStringverstanden (weder zur Laufzeit noch von statischen Typprüfern).Weitere Details findest du in PEP 688. (Beigetragen von Shantanu Jain in gh-91896.)
-
Bei
tkinter.Variablesollen die seit Python 3.14 veralteten Methodentrace_variable(),trace()(ein Alias vontrace_variable()),trace_vdelete()undtrace_vinfo()in Python 3.17 entfernt werden. Verwende stattdessentrace_add(),trace_remove()undtrace_info(). (Beigetragen von Serhiy Storchaka in gh-120220.)
Geplante Entfernung in Python 3.19¶
-
Bei Konstruktoren von Hash-Funktionen wie
new()oder den direkt nach dem Hash benannten Konstruktoren wiemd5()undsha256()konnte dem optionalen Parameter für die Anfangsdaten in verschiedenen Implementierungen vonhashlibauch ein Schlüsselwortargument namensdata=oderstring=übergeben werden.Die Unterstützung des Schlüsselwortarguments
stringist jetzt veraltet und soll in Python 3.19 entfernt werden.Vor Python 3.13 wurde der Schlüsselwortparameter
stringje nach Backend-Implementierung der Hash-Funktionen nicht korrekt unterstützt. Übergib die Anfangsdaten für die größtmögliche Abwärtskompatibilität am besten als Positionsargument.
-
http.cookies.Morsel.js_output()ist veraltet und wird in Python 3.19 entfernt.http.cookies.BaseCookie.js_output()ist veraltet und wird in Python 3.19 entfernt.
-
Das Ändern von
IMAP4.fileist jetzt veraltet und soll in Python 3.19 entfernt werden. Diese Eigenschaft wird nicht mehr verwendet, und das Ändern ihres Werts schließt die aktuelle Datei nicht automatisch.Vor Python 3.14 wurde diese Eigenschaft verwendet, um die entsprechenden Methoden
read()undreadline()vonIMAP4zu implementieren. Das ist seitdem nicht mehr der Fall.
Geplante Entfernung in Python 3.20¶
Der Aufruf der Methode
__new__()vonstruct.Structohne das Argument format ist veraltet und wird in Python 3.20 entfernt. Der Aufruf der Methode__init__()auf bereits initialisierten Objekten vom TypStructist veraltet und wird in Python 3.20 entfernt.(Beigetragen von Sergey B Kirpichev und Serhiy Storchaka in gh-143715.)
Die Attribute
__version__,versionundVERSIONsind in diesen Modulen der Standardbibliothek veraltet und werden in Python 3.20 entfernt. Verwende stattdessensys.version_info.ctypes.macholibdecimal(stattdessendecimal.SPEC_VERSIONverwenden)logging(__date__ist ebenfalls veraltet)xml.sax.expatreader
(Beigetragen von Hugo van Kemenade und Stan Ulbrych in gh-76007.)
Durch PEP 829 festgelegte Abkündigungen:
Für Zeilen mit
importin Dateien vom Typname.pthwerden Warnungen ausgegeben.Dateien vom Typ
name.pthwerden standardmäßig nicht mehr in der Kodierung des Gebietsschemas dekodiert. Sie MÜSSEN inutf-8-sigkodiert sein.
(Beigetragen von Barry Warsaw in gh-148641.)
ast:Das Erzeugen von Instanzen abstrakter AST-Knoten (etwa
ast.ASToderast.expr) ist veraltet und wird in Python 3.20 einen Fehler auslösen.
-
Es ist veraltet, Prüfungen mit
isinstance()undissubclass()auf Protokollklassen anzuwenden, die nicht explizit mitruntime_checkable()dekoriert sind, aber von einer zur Laufzeit prüfbaren Protokollklasse erben. In Python 3.20 wird dies einenTypeErrorauslösen.(Beigetragen von Bartosz Sławecki in gh-132604.)
Geplante Entfernung in zukünftigen Versionen¶
Die folgenden APIs werden in Zukunft entfernt, auch wenn derzeit noch kein Termin für ihre Entfernung feststeht.
-
Das Verschachteln von Argumentgruppen und von sich gegenseitig ausschließenden Gruppen ist veraltet.
Die Übergabe des undokumentierten Schlüsselwortarguments prefix_chars an
add_argument_group()ist jetzt veraltet.Der Typkonverter
argparse.FileTypeist veraltet.
-
Generatoren: Die Signatur
throw(type, exc, tb)undathrow(type, exc, tb)ist veraltet: Verwende stattdessenthrow(exc)undathrow(exc), die Signatur mit einem einzigen Argument.Derzeit akzeptiert Python numerische Literale, auf die unmittelbar Schlüsselwörter folgen, zum Beispiel
0in x,1or x,0if 1else 2. Das ermöglicht verwirrende und mehrdeutige Ausdrücke wie[0x1for x in y](was als[0x1 for x in y]oder als[0x1f or x in y]interpretiert werden kann). Eine Syntaxwarnung wird ausgelöst, wenn auf das numerische Literal unmittelbar eines der Schlüsselwörterand,else,for,if,in,isundorfolgt. In einer künftigen Version wird daraus ein Syntaxfehler. (gh-87999)Unterstützung dafür, dass die Methoden
__index__()und__int__()einen Typ zurückgeben, der kein int ist: Diese Methoden müssen künftig eine Instanz einer strikten Unterklasse vonintzurückgeben.Unterstützung dafür, dass die Methode
__float__()eine strikte Unterklasse vonfloatzurückgibt: Diese Methoden müssen künftig eine Instanz vonfloatzurückgeben.Unterstützung dafür, dass die Methode
__complex__()eine strikte Unterklasse voncomplexzurückgibt: Diese Methoden müssen künftig eine Instanz voncomplexzurückgeben.Die Übergabe einer komplexen Zahl als Argument real oder imag an den Konstruktor
complex()ist jetzt veraltet. Sie sollte nur als einziges Positionsargument übergeben werden. (Beigetragen von Serhiy Storchaka in gh-109218.)
calendar: Die Konstantencalendar.Januaryundcalendar.Februarysind veraltet und werden durchcalendar.JANUARYundcalendar.FEBRUARYersetzt. (Beigetragen von Prince Roshan in gh-103636.)codecs: Verwendeopen()stattcodecs.open(). (gh-133038)codeobject.co_lnotab: Verwende stattdessen die Methodecodeobject.co_lines().-
utcnow(): Verwendedatetime.datetime.now(tz=datetime.UTC).utcfromtimestamp(): Verwendedatetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC).
gettext: Der Pluralwert muss eine Ganzzahl sein.-
cache_from_source(): Der Parameter debug_override ist veraltet: Verwende stattdessen den Parameter optimization.
-
Die Tupel-Schnittstelle von
EntryPoints.Implizites
Nonebei Rückgabewerten.
logging: Die Methodewarn()ist seit Python 3.3 veraltet, verwende stattdessenwarning().mailbox: Die Verwendung von StringIO-Eingaben und Textmodus ist veraltet, verwende stattdessen BytesIO und Binärmodus.os: Der Aufruf vonos.register_at_fork()in einem Prozess mit mehreren Threads.os.path:os.path.commonprefix()ist veraltet, verwendeos.path.commonpath()für Pfadpräfixe. Die Funktionos.path.commonprefix()wird als veraltet markiert, weil ihr Name und ihr Modul irreführend sind. Die Funktion ist für Pfadpräfixe nicht sicher, obwohl sie in einem Modul zur Pfadbearbeitung enthalten ist. Dadurch lassen sich mit ihr leicht versehentlich Path-Traversal-Schwachstellen in Python-Programme einbauen.pydoc.ErrorDuringImport: Ein Tupelwert für den Parameter exc_info ist veraltet, verwende eine Ausnahmeinstanz.re: Für numerische Gruppenreferenzen und Gruppennamen in regulären Ausdrücken gelten jetzt strengere Regeln. Als numerische Referenz wird jetzt nur noch eine Folge von ASCII-Ziffern akzeptiert. Der Gruppenname in Bytes-Mustern und Ersetzungszeichenketten darf jetzt nur noch ASCII-Buchstaben, Ziffern und Unterstriche enthalten. (Beigetragen von Serhiy Storchaka in gh-91760.)shutil: Der Parameter onerror vonrmtree()ist seit Python 3.12 veraltet. Verwende stattdessen den Parameter onexc.Optionen und Protokolle von
ssl:ssl.SSLContextohne Protokollargument ist veraltet.ssl.SSLContext:set_npn_protocols()undselected_npn_protocol()sind veraltet: Verwende 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
threading:threading.Condition.notifyAll(): Verwendenotify_all().threading.Event.isSet(): Verwendeis_set().threading.Thread.isDaemon(),threading.Thread.setDaemon(): Verwende das Attributthreading.Thread.daemon.threading.Thread.getName(),threading.Thread.setName(): Verwende das Attributthreading.Thread.name.threading.currentThread(): Verwendethreading.current_thread().threading.activeCount(): Verwendethreading.active_count().
Die interne Klasse
typing._UnionGenericAliaswird nicht mehr zur Implementierung vontyping.Unionverwendet. Um die Kompatibilität mit Benutzern dieser privaten Klasse zu wahren, wird bis mindestens Python 3.17 ein Kompatibilitäts-Shim bereitgestellt. (Beigetragen von Jelle Zijlstra in gh-105499.)unittest.IsolatedAsyncioTestCase: Es ist veraltet, aus einem Testfall einen Wert zurückzugeben, der nichtNoneist.Veraltete Funktionen in
urllib.parse: Verwende stattdessenurlparse()splitattr()splithost()splitnport()splitpasswd()splitport()splitquery()splittag()splittype()splituser()splitvalue()to_bytes()
wsgiref:SimpleHandler.stdout.write()sollte keine teilweisen Schreibvorgänge durchführen.xml.etree.ElementTree: Das Prüfen des Wahrheitswerts einesElementist veraltet. In einer künftigen Version wird es immerTruezurückgeben. Verwende stattdessen explizite Prüfungen mitlen(elem)oderelem is not None.sys._clear_type_cache()ist veraltet: Verwende stattdessensys._clear_internal_caches().
Entfernt¶
asynchat und asyncore¶
configparser¶
Mehrere Namen, die in
configparserschon in 3.2 als veraltet markiert wurden, sind mit gh-89336 entfernt:configparser.ParsingErrorhat kein Attribut und kein Argumentfilenamemehr. Verwende stattdessen das Attribut und Argumentsource.configparserhat keine KlasseSafeConfigParsermehr. Verwende stattdessen den kürzeren NamenConfigParser.configparser.ConfigParserhat keine Methodereadfpmehr. Verwende stattdessenread_file().
distutils¶
Das Paket
distutilsist entfernt. Es war in Python 3.10 mit PEP 632 „Deprecate distutils module“ als veraltet markiert worden. Für Projekte, die weiterhindistutilsverwenden und nicht auf etwas anderes umgestellt werden können, lässt sich das Projektsetuptoolsinstallieren: Es stelltdistutilsweiterhin bereit. (Beigetragen von Victor Stinner in gh-92584.)
ensurepip¶
Das mitgelieferte setuptools-Wheel ist aus
ensurepipentfernt, und setuptools wird in Umgebungen, die mitvenverzeugt werden, nicht mehr installiert.pip (>= 22.1)verlangt nicht, dass setuptools in der Umgebung installiert ist. Pakete auf Grundlage vonsetuptools(und vondistutils) lassen sich weiterhin mitpip installverwenden, denn pip stelltsetuptoolsin der Build-Umgebung bereit, die es zum Bauen eines Pakets verwendet.easy_install,pkg_resources,setuptoolsunddistutilswerden in Umgebungen, die mitvenverzeugt oder mitensurepipaufgesetzt werden, nicht mehr von sich aus bereitgestellt, denn sie gehören zum Paketsetuptools. Projekte, die sich zur Laufzeit darauf verlassen, sollten das Projektsetuptoolsals Abhängigkeit angeben und es gesondert installieren (üblicherweise mit pip).(Beigtragen von Pradyun Gedam in gh-95299.)
enum¶
ftplib¶
gzip¶
Das Attribut
filenamevongzip.GzipFileausgzip, seit Python 2.6 als veraltet markiert, ist entfernt. Verwende stattdessen das Attributname. Im Schreibmodus hat das Attributfilenamedie Dateiendung'.gz'ergänzt, wenn sie nicht vorhanden war. (Beigetragen von Victor Stinner in gh-94196.)
hashlib¶
Die reine Python-Umsetzung von
hashlib.pbkdf2_hmac()aushashlib, in Python 3.10 als veraltet markiert, ist entfernt. Python 3.10 und neuer setzt OpenSSL 1.1.1 voraus (PEP 644): Diese OpenSSL-Version bietet eine C-Umsetzung vonpbkdf2_hmac(), die schneller ist. (Beigetragen von Victor Stinner in gh-94199.)
importlib¶
Viele schon länger als veraltet markierte Aufräumarbeiten in
importlibsind jetzt abgeschlossen:Verweise auf
module_repr()und die Unterstützung dafür sind entfernt. (Beigetragen von Barry Warsaw in gh-97850.)importlib.util.set_package,importlib.util.set_loaderundimportlib.util.module_for_loadersind alle entfernt. (Beigetragen von Brett Cannon und Nikita Sobolev in gh-65961 und gh-97850.)Die Unterstützung für die APIs
find_loader()undfind_module()ist entfernt. (Beigetragen von Barry Warsaw in gh-98040.)importlib.abc.Finder,pkgutil.ImpImporterundpkgutil.ImpLoadersind entfernt. (Beigetragen von Barry Warsaw in gh-98040.)
imp¶
Das Modul
impist entfernt. (Beigetragen von Barry Warsaw in gh-98040.)Zum Umstieg hilft die folgende Zuordnungstabelle:
imp
importlib
imp.NullImporterNoneinsys.path_importer_cacheeinfügenimp.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
Ersetze
imp.load_source()durch:import importlib.util import importlib.machinery def load_source(modname, filename): loader = importlib.machinery.SourceFileLoader(modname, filename) spec = importlib.util.spec_from_file_location(modname, filename, loader=loader) module = importlib.util.module_from_spec(spec) # Das Modul wird immer ausgeführt und nicht in sys.modules zwischengespeichert. # Entferne das Kommentarzeichen der folgenden Zeile, um das Modul zwischenzuspeichern. # sys.modules[module.__name__] = module loader.exec_module(module) return module
Funktionen und Attribute aus
imp, für die es keinen Ersatz gibt, sind entfernt:Nicht dokumentierte Funktionen:
imp.init_builtin()imp.load_compiled()imp.load_dynamic()imp.load_package()
imp.lock_held(),imp.acquire_lock(),imp.release_lock(): Das Sperrverfahren hat sich in Python 3.3 auf Sperren je Modul geändert.Die 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¶
locale¶
Die Funktion
locale.format()auslocale, in Python 3.7 als veraltet markiert, ist entfernt: verwende stattdessenlocale.format_string(). (Beigetragen von Victor Stinner in gh-94226.)
smtpd¶
sqlite3¶
Die folgenden nicht dokumentierten
sqlite3-Features, in Python 3.10 als veraltet markiert, sind jetzt entfernt:sqlite3.enable_shared_cache()sqlite3.OptimizedUnicode
Muss ein gemeinsamer Zwischenspeicher verwendet werden, öffne die Datenbank im URI-Modus mit dem Abfrageparameter
cache=shared.Die Textfabrik
sqlite3.OptimizedUnicodeist seit Python 3.3 ein anderer Name fürstr. Code, der die Textfabrik bisher aufOptimizedUnicodegesetzt hat, kann entweder ausdrücklichstrverwenden oder sich auf die Voreinstellung verlassen, die ebenfallsstrist.(Beigetragen von Erlend E. Aasland in gh-92548.)
ssl¶
Die Funktion
ssl.RAND_pseudo_bytes()ausssl, in Python 3.6 als veraltet markiert, ist entfernt: verwende stattdessenos.urandom()oderssl.RAND_bytes(). (Beigetragen von Victor Stinner in gh-94199.)Die Funktion
ssl.match_hostname()ist entfernt. Sie war in Python 3.7 als veraltet markiert worden. Seit Python 3.7 übernimmt OpenSSL den Abgleich des Rechnernamens, Python verwendet die Funktionssl.match_hostname()nicht mehr. (Beigetragen von Victor Stinner in gh-94199.)Die Funktion
ssl.wrap_socket(), in Python 3.7 als veraltet markiert, ist entfernt: erzeuge stattdessen einssl.SSLContext-Objekt und rufe seine Methodessl.SSLContext.wrap_socketauf. Jedes Paket, das nochssl.wrap_socket()verwendet, ist fehlerhaft und unsicher. Die Funktion sendet weder eine SNI-TLS-Erweiterung, noch prüft sie den Rechnernamen des Servers. Solcher Code unterliegt CWE 295 (Improper Certificate Validation). (Beigetragen von Victor Stinner in gh-94199.)
unittest¶
Viele längst als veraltet markierte
unittest-Features sind entfernt:Mehrere andere Namen für Methoden von
TestCase:Veraltetes Alias
Methodenname
Als veraltet markiert 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
Du kannst https://github.com/isidentical/teyit für das automatische modernisieren deiner Unit Tests nutzen.
Die nicht dokumentierte und fehlerhafte
TestCase-MethodeassertDictContainsSubset(in Python 3.2 als veraltet markiert).Der nicht dokumentierte Parameter use_load_tests von
TestLoader.loadTestsFromModule(seit Python 3.5 als veraltet markiert und übergangen).Ein anderer Name für die Klasse
TextTestResult:_TextTestResult(in Python 3.2 als veraltet markiert).
(Beigetragen von Serhiy Storchaka in gh-89325.)
webbrowser¶
Die Unterstützung für überholte Browser ist aus
webbrowserentfernt. Zu den entfernten Browsern gehören Grail, Mosaic, Netscape, Galeon, Skipstone, Iceape, Firebird und Firefox in Version 35 und älter (gh-102871).
xml.etree.ElementTree¶
Die Methode
ElementTree.Element.copy()der reinen Python-Umsetzung, in Python 3.10 als veraltet markiert, ist entfernt. Verwende stattdessen die Funktioncopy.copy(). Die C-Umsetzung vonxml.etree.ElementTreehat keine Methodecopy(), nur eine Methode__copy__(). (Beigetragen von Victor Stinner in gh-94383.)
zipimport¶
Weiteres¶
Die Regel
suspiciousist aus demMakefileder Dokumentation und ausDoc/tools/rstlint.pyentfernt, beides zugunsten von sphinx-lint. (Beigetragen von Julien Palard in gh-98179.)Die Parameter keyfile und certfile sind aus den Modulen
ftplib,imaplib,poplibundsmtplibentfernt, ebenso die Parameter key_file, cert_file und check_hostname aus dem Modulhttp.client. Alle waren seit Python 3.6 als veraltet markiert. Verwende stattdessen den Parameter context (ssl_context inimaplib). (Beigetragen von Victor Stinner in gh-94172.)Behelfslösungen für die Verträglichkeit mit
Jythonsind aus mehreren Modulen und Tests der Standardbibliothek entfernt. (Beigetragen von Nikita Sobolev in gh-99482.)Der Schalter
_use_broken_old_ctypes_structure_semantics_ist aus dem Modulctypesentfernt. (Beigetragen von Nikita Sobolev in gh-99285.)
Portierung auf Python 3.12¶
Dieser Abschnitt listet bereits beschriebene Änderungen und weitere Fehlerbehebungen auf, die Änderungen an deinem Code erfordern können.
Änderungen in der Python API¶
Für Verweise auf Gruppennummern und für Gruppennamen in regulären Ausdrücken gelten jetzt strengere Regeln. Als Verweis über eine Nummer wird jetzt nur noch eine Folge von ASCII-Ziffern angenommen. Der Gruppenname in Mustern und Ersetzungszeichenketten aus Bytes darf jetzt nur noch ASCII-Buchstaben, ASCII-Ziffern und Unterstriche enthalten. (Beigetragen von Serhiy Storchaka in gh-91760.)
Die seit Python 3.10 als veraltet markierte Funktionalität von
randrange()ist entfernt. Früher wurderandrange(10.0)verlustfrei inrandrange(10)umgewandelt. Jetzt löst das einenTypeErroraus. Außerdem hat sich die Ausnahme für nicht ganzzahlige Werte wierandrange(10.5)oderrandrange('10')vonValueErroraufTypeErrorgeändert. Das verhindert auch Fehler, bei denenrandrange(1e25)stillschweigend aus einem größeren Bereich gewählt hat alsrandrange(10**25). (Ursprünglich vorgeschlagen von Serhiy Storchaka, gh-86388.)argparse.ArgumentParserhat die Kodierung und die Fehlerbehandlung beim Lesen von Argumenten aus einer Datei (etwa über die Optionfromfile_prefix_chars) von der voreingestellten Textkodierung (etwalocale.getpreferredencoding(False)) auf die Dateisystemkodierung und Fehlerbehandlung umgestellt. Argumentdateien sollten unter Windows in UTF-8 statt in der ANSI-Codepage kodiert sein.Das auf
asyncoreaufbauende Modulsmtpd, in Python 3.4.7 und 3.5.4 als veraltet markiert, ist entfernt. Als Ersatz empfohlen wird das aufasyncioaufbauende PyPI-Modul aiosmtpd.shlex.split():Noneals Argument s zu übergeben löst jetzt eine Ausnahme aus, stattsys.stdinzu lesen. Das Feature war in Python 3.9 als veraltet markiert worden. (Beigetragen von Victor Stinner in gh-94352.)Das Modul
osnimmt keine bytes-ähnlichen Pfade mehr an, etwa die Typenbytearrayundmemoryview: für Bytezeichenketten wird nur noch genau der Typbytesangenommen. (Beigetragen von Victor Stinner in gh-98393.)syslog.openlog()undsyslog.closelog()scheitern jetzt, wenn sie in Subinterpretern verwendet werden.syslog.syslog()darf in Subinterpretern weiterhin verwendet werden, jetzt aber nur, wennsyslog.openlog()schon im Hauptinterpreter aufgerufen wurde. Diese neuen Einschränkungen gelten nicht für den Hauptinterpreter, sodass nur ein sehr kleiner Teil der Anwender betroffen sein dürfte. Diese Änderung hilft bei der Abschirmung der Interpreter voneinander. Außerdem istsyslogeine Hülle um prozessweite Ressourcen, die sich am besten vom Hauptinterpreter aus verwalten lassen. (Beigetragen von Donghee Na in gh-99127.)Das nicht dokumentierte Sperrverhalten von
@~functools.cached_propertyist entfernt, denn es sperrte über alle Instanzen der Klasse hinweg und führte so zu starkem Gedränge an der Sperre. Das heißt, dass die Getter-Funktion einer zwischengespeicherten Eigenschaft für eine einzelne Instanz jetzt mehr als einmal laufen kann, wenn zwei Threads sich ins Gehege kommen. Für die meisten einfachen zwischengespeicherten Eigenschaften (etwa solche, die idempotent sind und einfach einen Wert aus anderen Attributen der Instanz berechnen) ist das unbedenklich. Wird Synchronisierung gebraucht, setze das Sperren innerhalb der Getter-Funktion oder um die Zugriffsstellen aus mehreren Threads herum selbst um.sys._current_exceptions()gibt jetzt eine Zuordnung von Thread-Kennung auf eine Ausnahmeinstanz zurück statt auf ein Tupel(typ, exc, tb). (Beigetragen von Irit Katriel in gh-103176.)Übergib beim Entpacken von tar-Dateien mit
tarfileodershutil.unpack_archive()das Argument filter, um Features einzuschränken, die überraschend oder gefährlich sein können. Einzelheiten unter Extraction filters.Die Ausgabe der Funktionen
tokenize.tokenize()undtokenize.generate_tokens()hat sich wegen der Änderungen aus PEP 701 geändert. Das heißt, dass für f-Strings keineSTRING-Token mehr ausgegeben werden. Stattdessen entstehen jetzt die in PEP 701 beschriebenen Token:FSTRING_START,FSTRING_MIDDLEundFSTRING_ENDwerden jetzt für die „Zeichenketten“-Teile eines f-Strings ausgegeben, zusätzlich zu den passenden Token für die Tokenisierung in den Ausdrucksbestandteilen. Für den f-Stringf"start {1+1} end"gab die alte Fassung des Tokenizers zum Beispiel aus:1,0-1,18: STRING 'f"start {1+1} end"'
während die neue Version Folgendes 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 '"'
Darüber hinaus kann es wegen der Änderungen, die zur Unterstützung von PEP 701 nötig waren, zu einigen kleineren Verhaltensänderungen kommen. Dazu gehören:
Das Attribut
typeder Token, die beim Tokenisieren einiger ungültiger Python-Zeichen wie!ausgegeben werden, hat sich vonERRORTOKENaufOPgeändert.Unvollständige einzeilige Zeichenketten lösen jetzt ebenfalls einen
tokenize.TokenErroraus, wie es unvollständige mehrzeilige Zeichenketten schon tun.Mancher unvollständige oder ungültige Python-Code löst beim Tokenisieren jetzt einen
tokenize.TokenErroraus, statt beliebigeERRORTOKEN-Token zurückzugeben.Tabulatoren und Leerzeichen in derselben Datei gemischt zur Einrückung zu verwenden wird nicht mehr unterstützt und löst einen
TabErroraus.
Das Modul
threadingerwartet jetzt, dass das Modul_threadein Attribut_is_main_interpreterhat. Das ist eine Funktion ohne Argumente, dieTruezurückgibt, wenn der aktuelle Interpreter der Hauptinterpreter ist.Jede Bibliothek und jede Anwendung, die ein eigenes Modul
_threadbereitstellt, sollte_is_main_interpreter()anbieten. (Siehe gh-112826.)
Build Änderungen¶
Python verwendet nicht mehr
setup.py, um gemeinsam genutzte C-Erweiterungsmodule zu bauen. Build-Parameter wie Header und Bibliotheken werden im Skriptconfigureermittelt. Erweiterungen werden über dasMakefilegebaut. Die meisten Erweiterungen verwendenpkg-configund fallen auf eine Ermittlung von Hand zurück. (Beigetragen von Christian Heimes in gh-93939.)Um Python zu bauen, wird jetzt
va_start()mit zwei Parametern wie inva_start(args, format),verlangt.va_start()wird nicht mehr mit einem einzigen Parameter aufgerufen. (Beigetragen von Kumar Aditya in gh-93207.)CPython verwendet jetzt die Option ThinLTO als voreingestellte Strategie für die Optimierung beim Binden, sofern der Clang-Compiler den Schalter annimmt. (Beigetragen von Donghee Na in gh-89536.)
Die Variable
COMPILEALL_OPTSist imMakefilehinzugekommen, um diecompileall-Optionen (Voreinstellung:-j0) beimake installzu überschreiben. Außerdem sind die dreicompileall-Befehle zu einem einzigen zusammengefasst, der die .pyc-Dateien für alle Optimierungsstufen (0, 1, 2) auf einmal erzeugt. (Beigetragen von Victor Stinner in gh-99289.)Platform-Triplets für 64-Bit LoongArch hinzufügen:
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.Um
configureneu zu erzeugen, werden jetzt Autoconf 2.71 und aclocal 1.16.4 benötigt. (Beigetragen von Christian Heimes in gh-89886.)Die Windows-Builds und die macOS-Installationsprogramme von python.org verwenden jetzt OpenSSL 3.0.
C API Änderungen¶
Neue Funktionen¶
PEP 697: Die Stufe der instabilen C-API ist eingeführt, gedacht für Werkzeuge auf niedriger Ebene wie Debugger und JIT-Compiler. Diese API darf sich in jeder Nebenversion von CPython ohne Warnung über eine Abkündigung ändern. Ihre Bestandteile sind durch das Namenspräfix
PyUnstable_gekennzeichnet.Code-Objekt-Konstruktoren:
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 verfügbar, bis sich die jeweilige API ändert.
(Beigetragen von Petr Viktorin in gh-101101.)
PEP 697: Eine API ist hinzugekommen, um Typen zu erweitern, deren Speicherlayout je Instanz undurchsichtig ist:
PyType_Spec.basicsizedarf null oder negativ sein, um anzugeben, dass die Größe der Basisklasse geerbt oder erweitert wird.PyObject_GetTypeData()undPyType_GetTypeDataSize()sind hinzugekommen, um Zugriff auf die instanzbezogenen Daten einer Unterklasse zu ermöglichen.Py_TPFLAGS_ITEMS_AT_ENDundPyObject_GetItemData()sind hinzugekommen, um bestimmte Typen mit veränderlicher Größe gefahrlos erweitern zu können, darunterPyType_Type.Py_RELATIVE_OFFSETist hinzugekommen, umElementebezogen auf eine unterklassenbezogene Struktur definieren zu können.
(Beigetragen von Petr Viktorin in gh-103509.)
Die neue Funktion
PyType_FromMetaclass()ist in der eingeschränkten C-API hinzugekommen. Sie verallgemeinert das bestehendePyType_FromModuleAndSpec()um ein zusätzliches Metaklassen-Argument. (Beigetragen von Wenzel Jakob in gh-93012.)Eine API, um Objekte zu erzeugen, die sich über das Vectorcall-Protokoll aufrufen lassen, ist in der eingeschränkten API hinzugekommen:
Der Schalter
Py_TPFLAGS_HAVE_VECTORCALLwird jetzt von einer Klasse entfernt, wenn deren Methode__call__()neu zugewiesen wird. Damit lässt sich Vectorcall gefahrlos mit veränderlichen Typen verwenden (also mit Heap-Typen ohne den Schalter für Unveränderlichkeit,Py_TPFLAGS_IMMUTABLETYPE). Veränderliche Typen, dietp_callnicht überschreiben, erben jetzt den SchalterPy_TPFLAGS_HAVE_VECTORCALL. (Beigetragen von Petr Viktorin in gh-93274.)Die Schalter
Py_TPFLAGS_MANAGED_DICTundPy_TPFLAGS_MANAGED_WEAKREFsind hinzugekommen. Damit können Erweiterungsklassen das__dict__eines Objekts und schwache Referenzen mit weniger Verwaltungsaufwand, geringerem Speicherverbrauch und schnellerem Zugriff unterstützen.Eine API, um Aufrufe über das Vectorcall-Protokoll auszuführen, ist in der eingeschränkten API hinzugekommen:
Damit sind jetzt beide Enden des Vectorcall-Protokolls, das eingehende und das ausgehende, in der eingeschränkten API verfügbar. (Beigetragen von Wenzel Jakob in gh-98586.)
Zwei neue öffentliche Funktionen,
PyEval_SetProfileAllThreads()undPyEval_SetTraceAllThreads(), sind hinzugekommen, mit denen sich Funktionen für Tracing und Profiling in allen laufenden Threads setzen lassen, nicht nur im aufrufenden. (Beigetragen von Pablo Galindo in gh-93503.)Die neue Funktion
PyFunction_SetVectorcall()ist in der C-API hinzugekommen. Sie setzt das Vectorcall-Feld eines angegebenenPyFunctionObject. (Beigetragen von Andrew Frost in gh-92257.)Die C-API erlaubt es jetzt, über
PyDict_AddWatcher(),PyDict_Watch()und verwandte APIs Rückruffunktionen anzumelden, die bei jeder Änderung an einem Dictionary aufgerufen werden. Gedacht ist das für optimierende Interpreter, JIT-Compiler oder Debugger. (Beigetragen von Carl Meyer in gh-91052.)Die APIs
PyType_AddWatcher()undPyType_Watch()sind hinzugekommen, um Rückruffunktionen anzumelden, die über Änderungen an einem Typ benachrichtigt werden. (Beigetragen von Carl Meyer in gh-91051.)Die APIs
PyCode_AddWatcher()undPyCode_ClearWatcher()sind hinzugekommen, um Rückruffunktionen anzumelden, die über das Erzeugen und Zerstören von Codeobjekten benachrichtigt werden. (Beigetragen von Itamar Oren in gh-91054.)Die Funktionen
PyFrame_GetVar()undPyFrame_GetVarString()sind hinzugekommen, um eine Rahmenvariable über ihren Namen zu holen. (Beigetragen von Victor Stinner in gh-91248.)PyErr_GetRaisedException()undPyErr_SetRaisedException()sind hinzugekommen, um die aktuelle Ausnahme zu sichern und wiederherzustellen. Diese Funktionen geben ein einzelnes Ausnahmeobjekt zurück und nehmen eines an, statt der drei Argumente der nun als veraltet markiertenPyErr_Fetch()undPyErr_Restore(). Das ist weniger fehleranfällig und etwas effizienter. (Beigetragen von Mark Shannon in gh-101578.)_PyErr_ChainExceptions1ist hinzugekommen. Es nimmt eine Ausnahmeinstanz an und ersetzt das alte_PyErr_ChainExceptions, das jetzt als veraltet markiert ist. (Beigetragen von Mark Shannon in gh-101578.)PyException_GetArgs()undPyException_SetArgs()sind als praktische Funktionen hinzugekommen, um die an den Konstruktor der Ausnahme übergebenenargsabzurufen und zu ändern. (Beigetragen von Mark Shannon in gh-101578.)PyErr_DisplayException()ist hinzugekommen. Es nimmt eine Ausnahmeinstanz an und ersetzt das altePyErr_Display(). (Beigetragen von Irit Katriel in gh-102755).
PEP 683: Unsterbliche Objekte sind eingeführt, die es Objekten erlauben, das Zählen von Referenzen zu umgehen, dazu die zugehörigen Änderungen an der C-API:
_Py_IMMORTAL_REFCNT: Der Referenzzähler, der ein Objektals unsterblich kennzeichnet.
_Py_IsImmortalprüft, ob ein Objekt den Referenzzähler für Unsterblichkeit hat.PyObject_HEAD_INITsetzt den Referenzzähler jetzt auf_Py_IMMORTAL_REFCNT, wenn es mitPy_BUILD_COREverwendet wird.
SSTATE_INTERNED_IMMORTALeine Kennzeichnung für internierte Unicode-Objekte,die unsterblich sind.
SSTATE_INTERNED_IMMORTAL_STATICeine Kennzeichnung für internierteUnicode-Objekte, die unsterblich und statisch sind
sys.getunicodeinternedsizegibt die Gesamtzahl der Unicode-Objektezurück, die interniert wurden. Das wird jetzt gebraucht, damit
refleak.pyReferenzzähler und angeforderte Speicherblöcke richtig verfolgen kann
(Beigetragen von Eddie Elizondo in gh-84436.)
PEP 684: Die neue Funktion
Py_NewInterpreterFromConfig()undPyInterpreterConfigsind hinzugekommen, mit denen sich Subinterpreter mit eigenem GIL erzeugen lassen. (Mehr dazu unter PEP 684: Ein GIL je Interpreter.) (Beigetragen von Eric Snow in gh-104110.)In Version 3.12 der eingeschränkten C-API sind die Funktionen
Py_INCREF()undPy_DECREF()jetzt als undurchsichtige Funktionsaufrufe umgesetzt, um Umsetzungsdetails zu verbergen. (Beigetragen von Victor Stinner in gh-105387.)
Portierung auf Python 3.12¶
Die alten Unicode-APIs auf Grundlage der
Py_UNICODE*-Darstellung sind entfernt. Steige bitte auf APIs um, die auf UTF-8 oderwchar_t*aufbauen.Funktionen zum Auswerten von Argumenten wie
PyArg_ParseTuple()unterstützen Formate auf Grundlage vonPy_UNICODE*(zum Beispielu,Z) nicht mehr. Steige bitte auf andere Formate für Unicode um, etwas,z,esundU.tp_weaklistist für alle statischen eingebauten Typen immerNULL. Das ist ein ausschließlich internes Feld anPyTypeObject, aber wir weisen auf die Änderung hin, falls doch jemand unmittelbar darauf zugreift. Um Brüche zu vermeiden, verwende besser die bestehende öffentliche C-API oder, falls nötig, das (ausschließlich interne) Makro_PyObject_GET_WEAKREFS_LISTPTR().Dieses ausschließlich interne
PyTypeObject.tp_subclassesist jetzt unter Umständen kein gültiger Objektzeiger mehr. Sein Typ ist deshalb auf void* geändert. Wir erwähnen das, falls doch jemand unmittelbar auf das ausschließlich interne Feld zugreift.Um eine Liste der Unterklassen zu erhalten, rufe die Python-Methode
__subclasses__()auf (zum Beispiel überPyObject_CallMethod()).Unterstützung für weitere Formatierungsoptionen (Linksausrichtung, Oktalzahlen, Hexadezimalzahlen in Großbuchstaben,
intmax_t,ptrdiff_t, C-Zeichenketten auswchar_t, veränderliche Breite und Genauigkeit) ist inPyUnicode_FromFormat()undPyUnicode_FromFormatV()hinzugekommen. (Beigetragen von Serhiy Storchaka in gh-98836.)Ein unbekanntes Formatzeichen in
PyUnicode_FromFormat()undPyUnicode_FromFormatV()setzt jetzt einenSystemError. In früheren Versionen führte das dazu, dass der ganze Rest der Formatzeichenkette unverändert in die Ergebniszeichenkette kopiert und etwaige zusätzliche Argumente verworfen wurden. (Beigetragen von Serhiy Storchaka in gh-95781.)Die falsche Platzierung des Vorzeichens in
PyUnicode_FromFormat()undPyUnicode_FromFormatV()ist behoben. (Beigetragen von Philip Georgi in gh-95504.)Erweiterungsklassen, die einen Slot für
__dict__oder für schwache Referenzen hinzufügen wollen, solltenPy_TPFLAGS_MANAGED_DICTbeziehungsweisePy_TPFLAGS_MANAGED_WEAKREFverwenden statttp_dictoffsetundtp_weaklistoffset.tp_dictoffsetundtp_weaklistoffsetwerden weiterhin unterstützt, aber Mehrfachvererbung wird damit nicht vollständig unterstützt (gh-95589), und die Geschwindigkeit kann schlechter sein. Klassen, diePy_TPFLAGS_MANAGED_DICTangeben, müssen_PyObject_VisitManagedDict()und_PyObject_ClearManagedDict()aufrufen, um die Dictionaries ihrer Instanzen zu durchlaufen und zu leeren. Um schwache Referenzen zu leeren, rufe wie bisherPyObject_ClearWeakRefs()auf.Die Funktion
PyUnicode_FSDecoder()nimmt keine bytes-ähnlichen Pfade mehr an, etwa die Typenbytearrayundmemoryview: für Bytezeichenketten wird nur noch genau der Typbytesangenommen. (Beigetragen von Victor Stinner in gh-98393.)Die Makros
Py_CLEAR,Py_SETREFundPy_XSETREFwerten ihre Argumente jetzt nur noch einmal aus. Hat ein Argument Nebenwirkungen, treten diese Nebenwirkungen nicht mehr doppelt auf. (Beigetragen von Victor Stinner in gh-98724.)Die Fehleranzeige des Interpreters ist jetzt immer normalisiert. Das heißt, dass
PyErr_SetObject(),PyErr_SetString()und die anderen Funktionen, die die Fehleranzeige setzen, die Ausnahme jetzt normalisieren, bevor sie sie ablegen. (Beigetragen von Mark Shannon in gh-101578.)_Py_RefTotalist nicht mehr maßgeblich und bleibt nur noch aus Gründen der ABI-Verträglichkeit erhalten. Beachte, dass es eine interne globale Variable ist und nur in Debug-Builds verfügbar ist. Wenn du sie verwendest, musst du auf_Py_GetGlobalRefTotal()umsteigen.Die folgenden Funktionen wählen jetzt eine passende Metaklasse für den neu erzeugten Typ:
Klassen zu erzeugen, deren Metaklasse
tp_newüberschreibt, ist als veraltet markiert und wird ab Python 3.14 nicht mehr erlaubt sein. Beachte, dass diese Funktionentp_newder Metaklasse übergehen und damit möglicherweise eine unvollständige Initialisierung zulassen.Beachte, dass
PyType_FromMetaclass()(in Python 3.12 hinzugekommen) es schon jetzt nicht erlaubt, Klassen zu erzeugen, deren Metaklassetp_newüberschreibt (__new__()in Python).Da
tp_newfast alles überschreibt, was diePyType_From*-Funktionen tun, sind die beiden untereinander unverträglich. Das bisherige Verhalten – die Metaklasse bei mehreren Schritten der Typerzeugung zu übergehen – ist im Allgemeinen unsicher, denn (Meta-)Klassen nehmen an, dasstp_newaufgerufen wurde. Es gibt keine einfache allgemeine Behelfslösung. Eines der folgenden Vorgehen kann aber helfen:Wenn du Herr über die Metaklasse bist, vermeide
tp_newdarin:Wenn die Initialisierung übersprungen werden darf, lässt sie sich stattdessen in
tp_initerledigen.Wenn die Metaklasse nicht aus Python heraus erzeugt werden muss, setze ihr
tp_newmit dem SchalterPy_TPFLAGS_DISALLOW_INSTANTIATIONaufNULL. Damit ist sie für diePyType_From*-Funktionen annehmbar.
Vermeide die
PyType_From*-Funktionen: Wenn du keine C-eigenen Features brauchst (Slots oder das Festlegen der Instanzgröße), erzeuge Typen, indem du die Metaklasse aufrufst.Wenn du weißt, dass
tp_newgefahrlos übersprungen werden darf, filtere die Warnung über die Abkündigung aus Python heraus mitwarnings.catch_warnings()weg.
PyOS_InputHookundPyOS_ReadlineFunctionPointerwerden in Subinterpretern nicht mehr aufgerufen. Der Grund ist, dass sich Anwender in der Regel auf prozessweiten globalen Zustand verlassen (denn diese Rückruffunktionen haben keine Möglichkeit, den Zustand eines Erweiterungsmoduls zu ermitteln).Das verhindert auch Lagen, in denen Erweiterungen in einem Subinterpreter laufen, den sie nicht unterstützen (oder in dem sie noch nicht geladen wurden). Mehr dazu unter gh-104668.
Die Interna von
PyLongObjectsind für mehr Geschwindigkeit geändert. Die Interna vonPyLongObjectsind zwar privat, werden aber von einigen Erweiterungsmodulen verwendet. Auf die internen Felder sollte nicht mehr unmittelbar zugegriffen werden. Verwende stattdessen die API-Funktionen, die mitPyLong_...beginnen. Zwei neue instabile API-Funktionen stehen bereit, um effizient auf den Wert jenerPyLongObjects zuzugreifen, die in ein einzelnes Maschinenwort passen:Eigene Speicherverwalter, die über
PyMem_SetAllocator()gesetzt werden, müssen jetzt threadsicher sein, unabhängig von der Speicherdomäne. Speicherverwalter ohne eigenen Zustand, einschließlich „Hooks“, sind davon nicht betroffen. Ist dein eigener Speicherverwalter noch nicht threadsicher und du brauchst eine Orientierung, erstelle bitte ein neues GitHub-Issue und setze@ericsnowcurrentlyin CC.
Als veraltet markiert¶
Nach PEP 699 ist das Feld
ma_version_taginPyDictObjectfür Erweiterungsmodule als veraltet markiert. Ein Zugriff auf dieses Feld erzeugt beim Kompilieren eine Compiler-Warnung. Das Feld wird in Python 3.14 entfernt. (Beigetragen von Ramvikrams und Kumar Aditya in gh-101193. PEP von Ken Jin.)Globale Konfigurationsvariable als veraltet markiert:
Py_DebugFlag: verwendePyConfig.parser_debugPy_VerboseFlag: verwendePyConfig.verbosePy_QuietFlag: verwendePyConfig.quietPy_InteractiveFlag: verwendePyConfig.interactivePy_InspectFlag: verwendePyConfig.inspectPy_OptimizeFlag: verwendePyConfig.optimization_levelPy_NoSiteFlag: verwendePyConfig.site_importPy_BytesWarningFlag: verwendePyConfig.bytes_warningPy_FrozenFlag: verwendePyConfig.pathconfig_warningsPy_NoUserSiteDirectory: verwendePyConfig.user_site_directoryPy_HashRandomizationFlag: verwendePyConfig.use_hash_seedundPyConfig.hash_seedPy_IsolatedFlag: verwendePyConfig.isolatedPy_LegacyWindowsFSEncodingFlag: verwendePyPreConfig.legacy_windows_fs_encodingPy_LegacyWindowsStdioFlag: verwendePyConfig.legacy_windows_stdioPy_FileSystemDefaultEncoding: verwendePyConfig.filesystem_encodingPy_HasFileSystemDefaultEncoding: verwendePyConfig.filesystem_encodingPy_FileSystemDefaultEncodeErrors: verwendePyConfig.filesystem_errorsPy_UTF8Mode: verwendePyPreConfig.utf8_mode(siehePy_PreInitialize())
Die
Py_InitializeFromConfig()API sollte stattdessen mitPyConfiggenutzt werden. (Beigetragen von Victor Stinner in gh-77782.)Unveränderliche Typenmit veränderlichen Basisklassen zu erzeugen ist als veraltet markiert und wird in Python 3.14 abgeschaltet. (gh-95388)Die Header-Datei
structmember.hist als veraltet markiert, bleibt aber verfügbar, und es ist nicht geplant, sie zu entfernen.Ihre Inhalte sind jetzt schon dadurch verfügbar, dass man
Python.heinbindet, mit einem vorangestelltenPy, wo es fehlte:Typmakros wie
Py_T_INT,Py_T_DOUBLEund so weiter (vorherT_INT,T_DOUBLEund so weiter)Die Schalter
Py_READONLY(vorherREADONLY) undPy_AUDIT_READ(vorher ganz in Großbuchstaben)
Mehrere Dinge sind über
Python.hnicht zugänglich:T_OBJECT(verwendePy_T_OBJECT_EX)T_NONE(vorher nicht dokumentiert und recht eigenwillig)Das Makro
WRITE_RESTRICTED, das nichts tut.Die Makros
RESTRICTEDundREAD_RESTRICTED, diePy_AUDIT_READentsprechen.In manchen Konfigurationen wird
<stddef.h>vonPython.hnicht eingebunden. Es sollte von Hand eingebunden werden, wennoffsetof()verwendet wird.
Die als veraltet markierte Header-Datei stellt ihre ursprünglichen Inhalte weiterhin unter den ursprünglichen Namen bereit. Dein alter Code kann unverändert bleiben, sofern dich das zusätzliche Einbinden und die Makros ohne Namensraum nicht sehr stören.
(Beigetragen in gh-47146 von Petr Viktorin, auf Grundlage früherer Arbeit von Alexander Belopolsky und Matthias Braun.)
PyErr_Fetch()undPyErr_Restore()sind als veraltet markiert. Verwende stattdessenPyErr_GetRaisedException()undPyErr_SetRaisedException(). (Beigetragen von Mark Shannon in gh-101578.)PyErr_Display()ist als veraltet markiert. Verwende stattdessenPyErr_DisplayException(). (Beigetragen von Irit Katriel in gh-102755)._PyErr_ChainExceptionsist als veraltet markiert. Verwende stattdessen_PyErr_ChainExceptions1. (Beigetragen von Irit Katriel in gh-102192.)PyType_FromSpec(),PyType_FromSpecWithBases()oderPyType_FromModuleAndSpec()zu verwenden, um eine Klasse zu erzeugen, deren Metaklassetp_newüberschreibt, ist als veraltet markiert. Rufe stattdessen die Metaklasse auf.
Geplante Entfernung in Python 3.14¶
Das Feld
ma_version_taginPyDictObjectfür Erweiterungsmodule (PEP 699; gh-101193).Unveränderliche Typenmit veränderlichen Basisklassen zu erzeugen (gh-95388).
Geplante Entfernung in Python 3.15¶
PyImport_ImportModuleNoBlock(): Verwende stattdessenPyImport_ImportModule().PyWeakref_GetObject()undPyWeakref_GET_OBJECT(): Verwende stattdessenPyWeakref_GetRef(). Mit dem Projekt pythoncapi-compat lässt sichPyWeakref_GetRef()auch unter Python 3.12 und älter nutzen.PyUnicode_AsDecodedObject(): Verwende stattdessenPyCodec_Decode().PyUnicode_AsDecodedUnicode(): Verwende stattdessenPyCodec_Decode(). Beachte, dass manche Codecs (zum Beispiel „base64“) einen anderen Typ alsstrzurückgeben können, etwabytes.PyUnicode_AsEncodedObject(): Verwende stattdessenPyCodec_Encode().PyUnicode_AsEncodedUnicode(): Verwende stattdessenPyCodec_Encode(). Beachte, dass manche Codecs (zum Beispiel „base64“) einen anderen Typ alsbyteszurückgeben können, etwastr.Funktionen zur Initialisierung von Python, in Python 3.13 als veraltet markiert:
Py_GetPath(): Verwende stattdessenPyConfig_Get("module_search_paths")(sys.path).Py_GetPrefix(): Verwende stattdessenPyConfig_Get("base_prefix")(sys.base_prefix). VerwendePyConfig_Get("prefix")(sys.prefix), wenn virtuelle Umgebungen zu berücksichtigen sind.Py_GetExecPrefix(): Verwende stattdessenPyConfig_Get("base_exec_prefix")(sys.base_exec_prefix). VerwendePyConfig_Get("exec_prefix")(sys.exec_prefix), wenn virtuelle Umgebungen zu berücksichtigen sind.Py_GetProgramFullPath(): Verwende stattdessenPyConfig_Get("executable")(sys.executable).Py_GetProgramName(): Verwende stattdessenPyConfig_Get("executable")(sys.executable).Py_GetPythonHome(): Verwende stattdessenPyConfig_Get("home")oder die UmgebungsvariablePYTHONHOME.
Mit dem Projekt pythoncapi-compat lässt sich
PyConfig_Get()auch unter Python 3.13 und älter nutzen.Funktionen, um die Initialisierung von Python einzustellen, in Python 3.11 als veraltet markiert:
PySys_SetArgvEx(): Setze stattdessenPyConfig.argv.PySys_SetArgv(): Setze stattdessenPyConfig.argv.Py_SetProgramName(): Setze stattdessenPyConfig.program_name.Py_SetPythonHome(): Setze stattdessenPyConfig.home.PySys_ResetWarnOptions(): Leere stattdessensys.warnoptionsundwarnings.filters.
Stattdessen sollte die API
Py_InitializeFromConfig()mitPyConfigverwendet werden.Globale Konfigurationsvariablen:
Py_DebugFlag: Verwende stattdessenPyConfig.parser_debugoderPyConfig_Get("parser_debug").Py_VerboseFlag: Verwende stattdessenPyConfig.verboseoderPyConfig_Get("verbose").Py_QuietFlag: Verwende stattdessenPyConfig.quietoderPyConfig_Get("quiet").Py_InteractiveFlag: Verwende stattdessenPyConfig.interactiveoderPyConfig_Get("interactive").Py_InspectFlag: Verwende stattdessenPyConfig.inspectoderPyConfig_Get("inspect").Py_OptimizeFlag: Verwende stattdessenPyConfig.optimization_leveloderPyConfig_Get("optimization_level").Py_NoSiteFlag: Verwende stattdessenPyConfig.site_importoderPyConfig_Get("site_import").Py_BytesWarningFlag: Verwende stattdessenPyConfig.bytes_warningoderPyConfig_Get("bytes_warning").Py_FrozenFlag: Verwende stattdessenPyConfig.pathconfig_warningsoderPyConfig_Get("pathconfig_warnings").Py_IgnoreEnvironmentFlag: Verwende stattdessenPyConfig.use_environmentoderPyConfig_Get("use_environment").Py_DontWriteBytecodeFlag: Verwende stattdessenPyConfig.write_bytecodeoderPyConfig_Get("write_bytecode").Py_NoUserSiteDirectory: Verwende stattdessenPyConfig.user_site_directoryoderPyConfig_Get("user_site_directory").Py_UnbufferedStdioFlag: Verwende stattdessenPyConfig.buffered_stdiooderPyConfig_Get("buffered_stdio").Py_HashRandomizationFlag: Verwende stattdessenPyConfig.use_hash_seedundPyConfig.hash_seedoderPyConfig_Get("hash_seed").Py_IsolatedFlag: Verwende stattdessenPyConfig.isolatedoderPyConfig_Get("isolated").Py_LegacyWindowsFSEncodingFlag: Verwende stattdessenPyPreConfig.legacy_windows_fs_encodingoderPyConfig_Get("legacy_windows_fs_encoding").Py_LegacyWindowsStdioFlag: Verwende stattdessenPyConfig.legacy_windows_stdiooderPyConfig_Get("legacy_windows_stdio").Py_FileSystemDefaultEncoding,Py_HasFileSystemDefaultEncoding: Verwende stattdessenPyConfig.filesystem_encodingoderPyConfig_Get("filesystem_encoding").Py_FileSystemDefaultEncodeErrors: Verwende stattdessenPyConfig.filesystem_errorsoderPyConfig_Get("filesystem_errors").Py_UTF8Mode: Verwende stattdessenPyPreConfig.utf8_modeoderPyConfig_Get("utf8_mode"). (siehePy_PreInitialize())
Um diese Optionen zu setzen, sollte die API
Py_InitializeFromConfig()mitPyConfigverwendet werden. Oder man liest diese Optionen zur Laufzeit mitPyConfig_Get()aus.
Geplante Entfernung in Python 3.16¶
Die mitgelieferte Kopie von
libmpdec.
Geplante Entfernung in zukünftigen Versionen¶
Die folgenden APIs sind als veraltet markiert und werden entfernt, auch wenn für die Entfernung derzeit kein Zeitpunkt festgelegt ist.
Py_TPFLAGS_HAVE_FINALIZE: seit Python 3.8 nicht mehr nötig.PyErr_Fetch(): Verwende stattdessenPyErr_GetRaisedException().PyErr_NormalizeException(): Verwende stattdessenPyErr_GetRaisedException().PyErr_Restore(): Verwende stattdessenPyErr_SetRaisedException().PyModule_GetFilename(): Verwende stattdessenPyModule_GetFilenameObject().PyOS_AfterFork(): Verwende stattdessenPyOS_AfterFork_Child().PySlice_GetIndicesEx(): Verwende stattdessenPySlice_Unpack()undPySlice_AdjustIndices().PyUnicode_READY(): seit Python 3.12 nicht mehr nötigPyErr_Display(): Verwende stattdessenPyErr_DisplayException()._PyErr_ChainExceptions(): Verwende stattdessen_PyErr_ChainExceptions1().Element
PyBytesObject.ob_shash: rufe stattdessenPyObject_Hash()auf.API für Thread Local Storage (TLS):
PyThread_create_key(): Verwende stattdessenPyThread_tss_alloc().PyThread_delete_key(): Verwende stattdessenPyThread_tss_free().PyThread_set_key_value(): Verwende stattdessenPyThread_tss_set().PyThread_get_key_value(): Verwende stattdessenPyThread_tss_get().PyThread_delete_key_value(): Verwende stattdessenPyThread_tss_delete().PyThread_ReInitTLS(): seit Python 3.7 nicht mehr nötig.
Entfernt¶
Die Header-Datei
token.hist entfernt. Es gab nie eine öffentliche C-API für den Tokenizer. Die Header-Dateitoken.hwar nur für die Verwendung durch Python-Interna gedacht. (Beigetragen von Victor Stinner in gh-92651.)Die alten Unicode-APIs sind entfernt. Einzelheiten unter 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()
Das Funktionsmakro
PyUnicode_InternImmortal()ist entfernt. (Beigetragen von Victor Stinner in gh-85858.)