Was ist neu in Python 3.12

Editor:

Adam Turner

Dieser Artikel erklärt die neuen Funktionen in Python 3.12 im Vergleich zu 3.11. Python 3.12 wurde am 2. Oktober 2023 veröffentlicht. Vollständige Details finden Sie im Changelog.

Siehe auch

PEP 693 – Python 3.12 Release Schedule

Zusammenfassung – Release-Highlights

Python 3.12 ist eine stabile Version der Python-Programmiersprache mit einer Mischung aus Änderungen an der Sprache und der Standardbibliothek. Die Änderungen an der Bibliothek konzentrieren sich auf die Bereinigung veralteter APIs, Benutzerfreundlichkeit und Korrektheit. Bemerkenswert ist, dass das distutils-Paket aus der Standardbibliothek entfernt wurde. Die Dateisystemunterstützung in os und pathlib wurde verbessert, und mehrere Module weisen eine bessere Leistung auf.

Die Sprachänderungen konzentrieren sich auf die Benutzerfreundlichkeit, da viele Einschränkungen für f-Strings entfernt wurden und die Vorschläge „Did you mean …“ weiterhin verbessert werden. Die neue Typ-Parameter-Syntax und die type-Anweisung verbessern die Ergonomie für die Verwendung von generischen Typen und Typ-Aliassen mit statischen Typprüfern.

Dieser Artikel versucht nicht, eine vollständige Spezifikation aller neuen Funktionen zu bieten, sondern gibt stattdessen einen praktischen Überblick. Für vollständige Details sollten Sie die Dokumentation konsultieren, wie z. B. die Library Reference und die Language Reference. Wenn Sie die vollständige Implementierung und die Begründung für eine Änderung verstehen möchten, ziehen Sie das PEP für eine bestimmte neue Funktion hinzu; beachten Sie jedoch, dass PEPs in der Regel nicht auf dem neuesten Stand gehalten werden, sobald eine Funktion vollständig implementiert ist.


Neue Syntaxfunktionen

Neue Grammatikfunktionen

Interpreter-Verbesserungen

Verbesserungen am Python-Datenmodell

Signifikante Verbesserungen in der Standardbibliothek

  • Die Klasse pathlib.Path unterstützt jetzt Unterklassenbildung

  • Das Modul os erhielt mehrere Verbesserungen für die Windows-Unterstützung

  • Ein Kommandozeilen-Interface wurde zum Modul sqlite3 hinzugefügt

  • `isinstance()`-Prüfungen gegen runtime-checkable protocols sind zwei- bis zwanzigmal schneller geworden

  • Das Paket asyncio hat eine Reihe von Leistungsverbesserungen erfahren, wobei einige Benchmarks eine Beschleunigung von 75 % zeigen.

  • Ein Kommandozeilen-Interface wurde zum Modul uuid hinzugefügt

  • Aufgrund der Änderungen in PEP 701 ist die Erzeugung von Tokens über das Modul tokenize bis zu 64 % schneller.

Sicherheitsverbesserungen

  • Ersetzen Sie die integrierten hashlib-Implementierungen von SHA1, SHA3, SHA2-384, SHA2-512 und MD5 durch formal verifizierten Code aus dem HACL*-Projekt. Diese integrierten Implementierungen bleiben als Fallbacks erhalten, die nur verwendet werden, wenn OpenSSL sie nicht bereitstellt.

C-API-Verbesserungen

CPython-Implementierungsverbesserungen

  • PEP 709, Inlining von Comprehensions

  • CPython-Unterstützung für den Linux perf-Profiler

  • Implementieren Sie Stack-Overflow-Schutz auf unterstützten Plattformen

Neue Typ-Annotation-Funktionen

Wichtige Verwarnungen, Entfernungen oder Einschränkungen

  • PEP 623: Entfernung von wstr aus Unicode-Objekten in Pythons C-API, wodurch die Größe jedes str-Objekts um mindestens 8 Bytes reduziert wird.

  • PEP 632: Entfernung des distutils-Pakets. Weitere Hinweise zur Migration von den von ihm bereitgestellten APIs finden Sie im Migrationsleitfaden. Das Drittanbieter-Paket Setuptools bietet weiterhin distutils, wenn Sie es in Python 3.12 und darüber hinaus noch benötigen.

  • gh-95299: setuptools wird nicht mehr standardmäßig in virtuellen Umgebungen installiert, die mit venv erstellt wurden. Dies bedeutet, dass distutils, setuptools, pkg_resources und easy_install nicht mehr standardmäßig verfügbar sind; um darauf zuzugreifen, führen Sie pip install setuptools in der aktivierten virtuellen Umgebung aus.

  • Die Module asynchat, asyncore und imp wurden zusammen mit mehreren unittest.TestCase-Methoden-Aliassen entfernt.

Neue Funktionen

PEP 695: Typ-Parameter-Syntax

Generische Klassen und Funktionen gemäß PEP 484 wurden mit einer umständlichen Syntax deklariert, die den Geltungsbereich von Typ-Parametern unklar ließ und explizite Varianzdeklarationen erforderte.

PEP 695 führt eine neue, kompaktere und explizitere Methode zur Erstellung von generischen Klassen und Funktionen ein

def max[T](args: Iterable[T]) -> T:
    ...

class list[T]:
    def __getitem__(self, index: int, /) -> T:
        ...

    def append(self, element: T) -> None:
        ...

Zusätzlich führt die PEP eine neue Methode zur Deklaration von Typ-Aliassen mit der type-Anweisung ein, die eine Instanz von TypeAliasType erstellt.

type Point = tuple[float, float]

Typ-Aliasse können auch generisch sein.

type Point[T] = tuple[T, T]

Die neue Syntax erlaubt die Deklaration von TypeVarTuple- und ParamSpec-Parametern sowie von TypeVar-Parametern mit Bounds oder Einschränkungen.

type IntFunc[**P] = Callable[P, int]  # ParamSpec
type LabeledTuple[*Ts] = tuple[str, *Ts]  # TypeVarTuple
type HashableSequence[T: Hashable] = Sequence[T]  # TypeVar with bound
type IntOrStrSequence[T: (int, str)] = Sequence[T]  # TypeVar with constraints

Der Wert von Typ-Aliassen sowie die Bounds und Einschränkungen von Typvariablen, die über diese Syntax erstellt werden, werden nur bei Bedarf ausgewertet (siehe Lazy Evaluation). Dies bedeutet, dass Typ-Aliasse auf andere Typen verweisen können, die später in der Datei definiert sind.

Typ-Parameter, die über eine Typ-Parameterliste deklariert werden, sind innerhalb des Geltungsbereichs der Deklaration und aller verschachtelten Geltungsbereiche sichtbar, aber nicht im äußeren Geltungsbereich. Sie können beispielsweise in den Typannotationen für die Methoden einer generischen Klasse oder im Klassenkörper verwendet werden. Sie können jedoch nicht im Modulgeltungsbereich nach der Definition der Klasse verwendet werden. Siehe Typ-Parameterlisten für eine detaillierte Beschreibung der Laufzeitsemantik von Typ-Parametern.

Um diese Geltungsbereichssemantiken zu unterstützen, wird eine neue Art von Geltungsbereich eingeführt, der Annotation Scope. Annotation Scopes verhalten sich größtenteils wie Funktions-Scopes, interagieren aber anders mit einschließenden Klassenscopes. In Python 3.13 werden Annotationen ebenfalls in Annotation Scopes ausgewertet.

Siehe PEP 695 für weitere Details.

(PEP geschrieben von Eric Traut. Implementierung von Jelle Zijlstra, Eric Traut und anderen in gh-103764.)

PEP 701: Syntaktische Formalisierung von f-Strings

PEP 701 hebt einige Einschränkungen bei der Verwendung von f-Strings auf. Ausdruckskomponenten innerhalb von f-Strings können nun jeder gültige Python-Ausdruck sein, einschließlich Zeichenfolgen, die dasselbe Anführungszeichen wie der enthaltende f-String wiederverwenden, mehrzeilige Ausdrücke, Kommentare, Backslashes und Unicode-Escape-Sequenzen. Lassen Sie uns diese im Detail behandeln.

  • Wiederverwendung von Anführungszeichen: In Python 3.11 führt die Wiederverwendung derselben Anführungszeichen wie der enthaltende f-String zu einem SyntaxError, wodurch der Benutzer gezwungen ist, entweder andere verfügbare Anführungszeichen zu verwenden (z. B. doppelte oder dreifache Anführungszeichen, wenn der f-String einfache Anführungszeichen verwendet). In Python 3.12 können Sie nun Dinge wie diese tun.

    >>> songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism']
    >>> f"This is the playlist: {", ".join(songs)}"
    'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
    

    Beachten Sie, dass vor dieser Änderung keine explizite Grenze für die Verschachtelung von f-Strings bestand, aber die Tatsache, dass Zeichenfolgenanführungszeichen innerhalb der Ausdruckskomponente von f-Strings nicht wiederverwendet werden konnten, machte eine beliebige Verschachtelung von f-Strings unmöglich. Tatsächlich ist dies der am tiefsten verschachtelte f-String, der geschrieben werden konnte.

    >>> f"""{f'''{f'{f"{1+1}"}'}'''}"""
    '2'
    

    Da f-Strings nun jeden gültigen Python-Ausdruck innerhalb von Ausdruckskomponenten enthalten können, ist es nun möglich, f-Strings beliebig zu verschachteln.

    >>> f"{f"{f"{f"{f"{f"{1+1}"}"}"}"}"}"
    '2'
    
  • Mehrzeilige Ausdrücke und Kommentare: In Python 3.11 müssen f-String-Ausdrücke in einer einzigen Zeile definiert werden, auch wenn der Ausdruck innerhalb des f-Strings normalerweise mehrere Zeilen umfassen könnte (z. B. literale Listen, die über mehrere Zeilen definiert werden), was sie schwerer lesbar macht. In Python 3.12 können Sie nun mehrzeilige f-Strings definieren und Inline-Kommentare hinzufügen.

    >>> f"This is the playlist: {", ".join([
    ...     'Take me back to Eden',  # My, my, those eyes like fire
    ...     'Alkaline',              # Not acid nor alkaline
    ...     'Ascensionism'           # Take to the broken skies at last
    ... ])}"
    'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
    
  • Backslashes und Unicode-Zeichen: Vor Python 3.12 konnten f-String-Ausdrücke keine \-Zeichen enthalten. Dies wirkte sich auch auf Unicode-Escape-Sequenzen (wie \N{snowman}) aus, da diese den \N-Teil enthalten, der zuvor nicht Teil von Ausdruckskomponenten von f-Strings sein konnte. Nun können Sie Ausdrücke wie folgt definieren.

    >>> print(f"This is the playlist: {"\n".join(songs)}")
    This is the playlist: Take me back to Eden
    Alkaline
    Ascensionism
    >>> print(f"This is the playlist: {"\N{BLACK HEART SUIT}".join(songs)}")
    This is the playlist: Take me back to Eden♥Alkaline♥Ascensionism
    

Siehe PEP 701 für weitere Details.

Als positiver Nebeneffekt der Implementierung dieses Features (durch Parsen von f-Strings mit dem PEG-Parser) sind die Fehlermeldungen für f-Strings nun präziser und enthalten den genauen Speicherort des Fehlers. Beispielsweise löst in Python 3.11 der folgende f-String einen SyntaxError aus.

>>> my_string = f"{x z y}" + f"{1 + 1}"
  File "<stdin>", line 1
    (x z y)
     ^^^
SyntaxError: f-string: invalid syntax. Perhaps you forgot a comma?

Die Fehlermeldung enthält jedoch nicht den genauen Speicherort des Fehlers innerhalb der Zeile und hat den Ausdruck künstlich mit Klammern umgeben. In Python 3.12 können die Fehlermeldungen, da f-Strings mit dem PEG-Parser verarbeitet werden, präziser sein und die gesamte Zeile anzeigen.

>>> my_string = f"{x z y}" + f"{1 + 1}"
  File "<stdin>", line 1
    my_string = f"{x z y}" + f"{1 + 1}"
                   ^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?

(Beigetragen von Pablo Galindo, Batuhan Taskaya, Lysandros Nikolaou, Cristián Maureira-Fredes und Marta Gómez in gh-102856. PEP geschrieben von Pablo Galindo, Batuhan Taskaya, Lysandros Nikolaou und Marta Gómez).

PEP 684: Ein pro Interpreter GIL

PEP 684 führt ein pro Interpreter GIL ein, sodass Sub-Interpreter nun mit einem eindeutigen GIL pro Interpreter erstellt werden können. Dies ermöglicht Python-Programmen, mehrere CPU-Kerne vollständig auszunutzen. Dies ist derzeit nur über die C-API verfügbar, obwohl eine Python-API für 3.13 erwartet wird.

Verwenden Sie die neue Funktion Py_NewInterpreterFromConfig(), um einen Interpreter mit eigenem GIL zu erstellen.

PyInterpreterConfig config = {
    .check_multi_interp_extensions = 1,
    .gil = PyInterpreterConfig_OWN_GIL,
};
PyThreadState *tstate = NULL;
PyStatus status = Py_NewInterpreterFromConfig(&tstate, &config);
if (PyStatus_Exception(status)) {
    return -1;
}
/* The new interpreter is now active in the current thread. */

Weitere Beispiele für die Verwendung der C-API für Sub-Interpreter mit einem pro Interpreter GIL finden Sie in Modules/_xxsubinterpretersmodule.c.

(Beigetragen von Eric Snow in gh-104210, etc.)

PEP 669: Niedrig-impact-Überwachung für CPython

PEP 669 definiert eine neue API für Profiler, Debugger und andere Tools zur Überwachung von Ereignissen in CPython. Sie deckt eine breite Palette von Ereignissen ab, darunter Aufrufe, Rückgaben, Zeilen, Ausnahmen, Sprünge und mehr. Das bedeutet, dass Sie nur für das bezahlen, was Sie verwenden, und Unterstützung für Debugger und Abdeckungstools mit nahezu null Overhead bietet. Details finden Sie in sys.monitoring.

(Beigetragen von Mark Shannon in gh-103082.)

PEP 688: Bereitstellung des Buffer-Protokolls in Python

PEP 688 führt eine Möglichkeit ein, das Buffer-Protokoll aus Python-Code zu verwenden. Klassen, die die Methode __buffer__() implementieren, sind nun als Buffer-Typen verwendbar.

Die neue ABC collections.abc.Buffer bietet eine standardmäßige Möglichkeit, Buffer-Objekte darzustellen, z. B. in Typannotationen. Die neue Enum inspect.BufferFlags repräsentiert die Flags, die zur Anpassung der Buffer-Erstellung verwendet werden können. (Beigetragen von Jelle Zijlstra in gh-102500.)

PEP 709: Inlining von Comprehensions

Dictionary-, Listen- und Set-Comprehensions werden nun inline ausgeführt, anstatt für jede Ausführung der Comprehension ein neues Einweg-Funktionsobjekt zu erstellen. Dies beschleunigt die Ausführung einer Comprehension um das bis zu Zweifache. Weitere Details finden Sie in PEP 709.

Variablen für die Iteration von Comprehensions bleiben isoliert und überschreiben keine Variable mit demselben Namen im äußeren Geltungsbereich, noch sind sie nach der Comprehension sichtbar. Das Inlining führt zu einigen sichtbaren Verhaltensänderungen.

  • Es gibt keinen separaten Frame mehr für die Comprehension in Tracebacks, und das Tracing/Profiling zeigt die Comprehension nicht mehr als Funktionsaufruf an.

  • Das Modul symtable wird keine untergeordneten Symboltabellen mehr für jede Comprehension erzeugen; stattdessen werden die Locals der Comprehension in die Symboltabelle der übergeordneten Funktion aufgenommen.

  • Das Aufrufen von locals() innerhalb einer Comprehension umfasst nun Variablen außerhalb der Comprehension und schließt die synthetische Variable .0 für das Comprehension-„Argument“ nicht mehr ein.

  • Eine Comprehension, die direkt über locals() iteriert (z. B. [k for k in locals()]), kann „RuntimeError: dictionary changed size during iteration“ anzeigen, wenn sie unter Tracing (z. B. Code-Coverage-Messung) ausgeführt wird. Dies ist dasselbe Verhalten, das bereits bei z. B. for k in locals(): auftrat. Um den Fehler zu vermeiden, erstellen Sie zuerst eine Liste von Schlüsseln zum Iterieren: keys = list(locals()); [k for k in keys].

(Beigetragen von Carl Meyer und Vladimir Matveev in PEP 709.)

Verbesserte Fehlermeldungen

  • Module aus der Standardbibliothek werden nun potenziell als Teil der Fehlermeldungen vorgeschlagen, die vom Interpreter angezeigt werden, wenn ein NameError auf oberster Ebene ausgelöst wird. (Beigetragen von Pablo Galindo in gh-98254.)

    >>> sys.version_info
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'sys' is not defined. Did you forget to import 'sys'?
    
  • Verbessern Sie die Fehlervorschläge für NameError-Ausnahmen für Instanzen. Wenn nun ein NameError in einer Methode ausgelöst wird und die Instanz ein Attribut hat, das exakt dem Namen in der Ausnahme entspricht, enthält der Vorschlag self.<NAME> anstelle der nächstgelegenen Übereinstimmung im Methodengeltungsbereich. (Beigetragen von Pablo Galindo in gh-99139.)

    >>> class A:
    ...    def __init__(self):
    ...        self.blech = 1
    ...
    ...    def foo(self):
    ...        somethin = blech
    ...
    >>> A().foo()
    Traceback (most recent call last):
      File "<stdin>", line 1
        somethin = blech
                   ^^^^^
    NameError: name 'blech' is not defined. Did you mean: 'self.blech'?
    
  • Verbessern Sie die SyntaxError-Fehlermeldung, wenn der Benutzer import x from y anstelle von from y import x eingibt. (Beigetragen von Pablo Galindo in gh-98931.)

    >>> import a.y.z from b.y.z
    Traceback (most recent call last):
      File "<stdin>", line 1
        import a.y.z from b.y.z
        ^^^^^^^^^^^^^^^^^^^^^^^
    SyntaxError: Did you mean to use 'from ... import ...' instead?
    
  • ImportError-Ausnahmen, die bei fehlgeschlagenen from <module> import <name>-Anweisungen ausgelöst werden, enthalten nun Vorschläge für den Wert von <name> basierend auf den verfügbaren Namen in <module>. (Beigetragen von Pablo Galindo in gh-91058.)

    >>> from collections import chainmap
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ImportError: cannot import name 'chainmap' from 'collections'. Did you mean: 'ChainMap'?
    

Andere Sprachänderungen

  • Der Parser löst nun SyntaxError aus, wenn Quellcode mit Null-Bytes analysiert wird. (Beigetragen von Pablo Galindo in gh-96670.)

  • Ein Backslash-Zeichenpaar, das keine gültige Escape-Sequenz ist, erzeugt nun eine SyntaxWarning anstelle einer DeprecationWarning. Beispielsweise gibt re.compile("\d+\.\d+") nun eine SyntaxWarning aus (``\d`` ist eine ungültige Escape-Sequenz, verwenden Sie Rohzeichenketten für reguläre Ausdrücke: re.compile(r"\d+\.\d+")). In einer zukünftigen Python-Version wird schließlich ein SyntaxError anstelle von SyntaxWarning ausgelöst.

  • Oktale Escapes mit einem Wert größer als 0o377 (z. B. "\477"), die in Python 3.11 als veraltet markiert wurden, erzeugen nun eine SyntaxWarning anstelle einer DeprecationWarning. In einer zukünftigen Python-Version wird dies schließlich zu einem SyntaxError führen.

  • Variablen, die im Zielteil von Comprehensions verwendet werden und nicht gespeichert werden, können nun in Zuweisungsausdrücken (:=) verwendet werden. Zum Beispiel ist in [(b := 1) for a, b.prop in some_iter] die Zuweisung an b nun erlaubt. Beachten Sie, dass die Zuweisung an Variablen, die im Zielteil von Comprehensions gespeichert werden (wie a), immer noch nicht erlaubt ist, gemäß PEP 572. (Beigetragen von Nikita Sobolev in gh-100581.)

  • Ausnahmen, die in der __set_name__-Methode einer Klasse oder eines Typs ausgelöst werden, werden nicht mehr von einer RuntimeError umschlossen. Kontextinformationen werden als PEP 678-Hinweis zur Ausnahme hinzugefügt. (Beigetragen von Irit Katriel in gh-77757.)

  • Wenn ein try-except*-Konstrukt die gesamte ExceptionGroup behandelt und eine andere Ausnahme auslöst, wird diese Ausnahme nicht mehr in eine ExceptionGroup umschlossen. Ebenfalls geändert in Version 3.11.4. (Beigetragen von Irit Katriel in gh-103590.)

  • Der Garbage Collector läuft nun nur noch auf dem Eval-Breaker-Mechanismus der Python-Bytecode-Ausführungsschleife anstelle von Objektallokationen. Der GC kann auch ausgeführt werden, wenn PyErr_CheckSignals() aufgerufen wird, sodass C-Erweiterungen, die lange Zeit ohne Ausführung von Python-Code laufen müssen, ebenfalls die Möglichkeit haben, den GC periodisch auszuführen. (Beigetragen von Pablo Galindo in gh-97922.)

  • Alle eingebauten und erweiterbaren aufrufbaren Objekte, die boolesche Parameter erwarten, akzeptieren nun Argumente beliebigen Typs anstelle von nur bool und int. (Beigetragen von Serhiy Storchaka in gh-60203.)

  • memoryview unterstützt nun den Halbfloat-Typ (den "e"-Formatcode). (Beigetragen von Donghee Na und Antoine Pitrou in gh-90751.)

  • slice-Objekte sind nun hashbar, was ihre Verwendung als Dictionary-Schlüssel und Set-Elemente ermöglicht. (Beigetragen von Will Bradshaw, Furkan Onder und Raymond Hettinger in gh-101264.)

  • sum() verwendet nun die Neumaier-Summation zur Verbesserung der Genauigkeit und Kommutativität beim Summieren von Floats oder gemischten Ints und Floats. (Beigetragen von Raymond Hettinger in gh-100425.)

  • ast.parse() löst nun SyntaxError anstelle von ValueError aus, wenn Quellcode mit Null-Bytes analysiert wird. (Beigetragen von Pablo Galindo in gh-96670.)

  • Die Extraktionsmethoden in tarfile und shutil.unpack_archive() verfügen über ein neues Argument filter, das die Begrenzung von Tar-Funktionen ermöglicht, die überraschend oder gefährlich sein können, z. B. das Erstellen von Dateien außerhalb des Zielverzeichnisses. Weitere Details finden Sie unter tarfile extraction filters. In Python 3.14 wird die Standardeinstellung auf 'data' umgestellt. (Beigetragen von Petr Viktorin in PEP 706.)

  • types.MappingProxyType-Instanzen sind nun hashbar, wenn das zugrunde liegende Mapping hashbar ist. (Beigetragen von Serhiy Storchaka in gh-87995.)

  • Unterstützung für den perf-Profiler über die neue Umgebungsvariable PYTHONPERFSUPPORT und die Befehlszeilenoption -X perf sowie die neuen Funktionen sys.activate_stack_trampoline(), sys.deactivate_stack_trampoline() und sys.is_stack_trampoline_active() hinzugefügt. (Design von Pablo Galindo. Beigetragen von Pablo Galindo und Christian Heimes mit Beiträgen von Gregory P. Smith [Google] und Mark Shannon in gh-96123.)

Neue Module

  • Keine.

Verbesserte Module

array

asyncio

  • Die Leistung beim Schreiben auf Sockets in asyncio wurde erheblich verbessert. asyncio vermeidet nun unnötige Kopien beim Schreiben auf Sockets und verwendet sendmsg(), wenn die Plattform dies unterstützt. (Beigetragen von Kumar Aditya in gh-91166.)

  • Die Funktionen asyncio.eager_task_factory() und asyncio.create_eager_task_factory() wurden hinzugefügt, um eine Ereignisschleife für die sofortige Task-Ausführung zu ermöglichen, was einige Anwendungsfälle 2- bis 5-mal schneller macht. (Beigetragen von Jacob Bower & Itamar Oren in gh-102853, gh-104140 und gh-104138)

  • Unter Linux verwendet asyncio standardmäßig asyncio.PidfdChildWatcher, wenn os.pidfd_open() verfügbar und funktionsfähig ist, anstelle von asyncio.ThreadedChildWatcher. (Beigetragen von Kumar Aditya in gh-98024.)

  • Die Ereignisschleife verwendet nun den besten verfügbaren Child-Watcher für jede Plattform (asyncio.PidfdChildWatcher, wenn unterstützt, und andernfalls asyncio.ThreadedChildWatcher), sodass die manuelle Konfiguration eines Child-Watchers nicht empfohlen wird. (Beigetragen von Kumar Aditya in gh-94597.)

  • Der Parameter loop_factory wurde zu asyncio.run() hinzugefügt, um die Angabe einer benutzerdefinierten Schleifenfabrik zu ermöglichen. (Beigetragen von Kumar Aditya in gh-99388.)

  • C-Implementierung von asyncio.current_task() für eine 4- bis 6-fache Beschleunigung hinzugefügt. (Beigetragen von Itamar Oren und Pranav Thulasiram Bhat in gh-100344.)

  • asyncio.iscoroutine() gibt nun False für Generatoren zurück, da asyncio keine veralteten Generator-basierten Coroutinen unterstützt. (Beigetragen von Kumar Aditya in gh-102748.)

  • asyncio.wait() und asyncio.as_completed() akzeptieren nun Generatoren, die Tasks ergeben. (Beigetragen von Kumar Aditya in gh-78530.)

calendar

csv

dis

  • Pseudo-Instruktions-Opcodes (die vom Compiler verwendet werden, aber nicht im ausführbaren Bytecode erscheinen) werden nun im dis-Modul verfügbar gemacht. HAVE_ARGUMENT ist für echte Opcodes weiterhin relevant, aber für Pseudo-Instruktionen nicht nützlich. Verwenden Sie stattdessen die neue Sammlung dis.hasarg. (Beigetragen von Irit Katriel in gh-94216.)

  • Die Sammlung dis.hasexc wurde hinzugefügt, um Instruktionen zu kennzeichnen, die einen Ausnahmehandler setzen. (Beigetragen von Irit Katriel in gh-94216.)

fractions

importlib.resources

inspect

itertools

  • Die Funktion itertools.batched() wurde hinzugefügt, um Elemente in gleich große Tupel zu sammeln, wobei der letzte Batch kürzer als die anderen sein kann. (Beigetragen von Raymond Hettinger in gh-98363.)

math

  • Die Funktion math.sumprod() wurde hinzugefügt, um eine Summe von Produkten zu berechnen. (Beigetragen von Raymond Hettinger in gh-100485.)

  • Die Funktion math.nextafter() wurde um das Argument steps erweitert, um das Bewegen in mehreren Schritten nach oben oder unten zu ermöglichen. (Beigetragen von Matthias Goergens, Mark Dickinson und Raymond Hettinger in gh-94906.)

os

  • Das Konstante os.PIDFD_NONBLOCK wurde hinzugefügt, um einen Dateideskriptor für einen Prozess mit os.pidfd_open() im nicht-blockierenden Modus zu öffnen. (Beigetragen von Kumar Aditya in gh-93312.)

  • os.DirEntry enthält nun eine Methode os.DirEntry.is_junction(), um zu prüfen, ob der Eintrag eine Junction ist. (Beigetragen von Charles Machalow in gh-99547.)

  • Die Funktionen os.listdrives(), os.listvolumes() und os.listmounts() wurden unter Windows für die Enumeration von Laufwerken, Volumes und Mountpoints hinzugefügt. (Beigetragen von Steve Dower in gh-102519.)

  • os.stat() und os.lstat() sind unter Windows nun genauer. Das Feld st_birthtime wird nun mit der Erstellungszeit der Datei gefüllt, und st_ctime ist veraltet, enthält aber immer noch die Erstellungszeit (wird aber zukünftig die letzte Metadatenänderung zurückgeben, um die Konsistenz mit anderen Plattformen zu gewährleisten). st_dev kann je nach Dateisystem bis zu 64 Bit und st_ino bis zu 128 Bit betragen, und st_rdev wird immer auf Null gesetzt anstatt auf falsche Werte. Beide Funktionen können auf neueren Windows-Versionen deutlich schneller sein. (Beigetragen von Steve Dower in gh-99726.)

os.path

  • Die Funktion os.path.isjunction() wurde hinzugefügt, um zu prüfen, ob ein gegebener Pfad eine Junction ist. (Beigetragen von Charles Machalow in gh-99547.)

  • Die Funktion os.path.splitroot() wurde hinzugefügt, um einen Pfad in eine Triade (drive, root, tail) zu teilen. (Beigetragen von Barney Gale in gh-101000.)

pathlib

platform

  • Unterstützung für die Erkennung von Windows 11 und Windows Server-Versionen nach 2012 wurde hinzugefügt. Zuvor würden Lookups auf Windows Server-Plattformen, die neuer als Windows Server 2012 sind, und auf Windows 11 Windows-10 zurückgeben. (Beigetragen von Steve Dower in gh-89545.)

pdb

  • Bequeme Variablen wurden hinzugefügt, um Werte temporär für Debugging-Sitzungen zu speichern und einen schnellen Zugriff auf Werte wie den aktuellen Frame oder den Rückgabewert zu ermöglichen. (Beigetragen von Tian Gao in gh-103693.)

random

shutil

  • shutil.make_archive() übergibt nun das Argument root_dir an benutzerdefinierte Archivierer, die es unterstützen. In diesem Fall wird das aktuelle Arbeitsverzeichnis des Prozesses nicht mehr vorübergehend auf root_dir geändert, um die Archivierung durchzuführen. (Beigetragen von Serhiy Storchaka in gh-74696.)

  • shutil.rmtree() akzeptiert nun ein neues Argument onexc, das ein Fehlerbehandlungsroutine ähnlich wie onerror ist, aber eine Instanz einer Ausnahme anstelle eines (typ, val, tb)-Tripels erwartet. onerror ist veraltet. (Beigetragen von Irit Katriel in gh-102828.)

  • shutil.which() berücksichtigt nun die Umgebungsvariable PATHEXT, um unter Windows Übereinstimmungen im PATH zu finden, auch wenn der angegebene cmd eine Verzeichnungskomponente enthält. (Beigetragen von Charles Machalow in gh-103179.)

    shutil.which() ruft NeedCurrentDirectoryForExePathW auf, wenn unter Windows nach ausführbaren Dateien gesucht wird, um zu bestimmen, ob das aktuelle Arbeitsverzeichnis dem Suchpfad vorangestellt werden soll. (Beigetragen von Charles Machalow in gh-103179.)

    shutil.which() gibt unter Windows einen Pfad zurück, der mit cmd und einer Komponente aus PATHEXT übereinstimmt, vor einer direkten Übereinstimmung an anderer Stelle im Suchpfad. (Beigetragen von Charles Machalow in gh-103179.)

sqlite3

statistics

  • Die Funktion statistics.correlation() wurde um die Methode ranked zur Berechnung der Spearman-Korrelation von Rangdaten erweitert. (Beigetragen von Raymond Hettinger in gh-95861.)

sys

  • Fügt den `sys.monitoring`-Namespace hinzu, um die neue PEP 669 Monitoring API bereitzustellen. (Beigetragen von Mark Shannon in gh-103082.)

  • Fügt `sys.activate_stack_trampoline()` und `sys.deactivate_stack_trampoline()` zum Aktivieren und Deaktivieren von Stack-Profiler-Trampolinen hinzu, sowie `sys.is_stack_trampoline_active()` zum Abfragen, ob Stack-Profiler-Trampoline aktiv sind. (Beigetragen von Pablo Galindo und Christian Heimes mit Beiträgen von Gregory P. Smith [Google] und Mark Shannon in gh-96123.)

  • Fügt `sys.last_exc` hinzu, das die letzte nicht behandelte Ausnahme enthält, die ausgelöst wurde (für Anwendungsfälle des Post-Mortem-Debugging). Die drei Felder, die die gleichen Informationen in ihrer Legacy-Form enthalten, werden als veraltet markiert: `sys.last_type`, `sys.last_value` und `sys.last_traceback`. (Beigetragen von Irit Katriel in gh-102778.)

  • `sys._current_exceptions()` gibt nun eine Zuordnung von Thread-IDs zu Ausnahmeinstanzen zurück, anstatt zu einem Tupel `(typ, exc, tb)`.

  • `sys.setrecursionlimit()` und `sys.getrecursionlimit()`. Das Rekursionslimit gilt nun nur noch für Python-Code. Eingebaute Funktionen verwenden das Rekursionslimit nicht, sind aber durch einen anderen Mechanismus geschützt, der verhindert, dass Rekursion zu einem Absturz der virtuellen Maschine führt.

tempfile

  • Die Funktion `tempfile.NamedTemporaryFile` hat einen neuen optionalen Parameter `delete_on_close`. (Beigetragen von Evgeny Zorin in gh-58451.)

  • `tempfile.mkdtemp()` gibt nun immer einen absoluten Pfad zurück, auch wenn das an den Parameter `dir` übergebene Argument ein relativer Pfad ist.

threading

  • Fügt `threading.settrace_all_threads()` und `threading.setprofile_all_threads()` hinzu, die es ermöglichen, Trace- und Profilerfunktionen in allen laufenden Threads zusätzlich zum aufrufenden Thread zu setzen. (Beigetragen von Pablo Galindo in gh-93503.)

tkinter

  • `tkinter.Canvas.coords()` verflacht nun seine Argumente. Es akzeptiert nun nicht nur Koordinaten als separate Argumente (`x1, y1, x2, y2, ...`) und eine Sequenz von Koordinaten (`[x1, y1, x2, y2, ...]`), sondern auch Koordinaten, die in Paaren gruppiert sind (`(x1, y1), (x2, y2), ...` und `[(x1, y1), (x2, y2), ...]`), wie die `create_*()` Methoden. (Beigetragen von Serhiy Storchaka in gh-94473.)

tokenize

  • Das Modul `tokenize` enthält die in PEP 701 eingeführten Änderungen. (Beigetragen von Marta Gómez Macías und Pablo Galindo in gh-102856.) Weitere Informationen zu den Änderungen am Modul `tokenize` finden Sie unter [Porting to Python 3.12](whatsnew312-porting-to-python312).

types

  • Fügt `types.get_original_bases()` hinzu, um eine weitere Introspektion von User-defined generic types beim Unterklassifizieren zu ermöglichen. (Beigetragen von James Hilton-Balfe und Alex Waygood in gh-101827.)

typing

  • `isinstance()`-Prüfungen gegen `runtime-checkable protocols` verwenden nun `inspect.getattr_static()` anstelle von `hasattr()`, um nach dem Vorhandensein von Attributen zu suchen. Dies bedeutet, dass Deskriptoren und `__getattr__()`-Methoden nicht mehr unerwartet während `isinstance()`-Prüfungen gegen runtime-checkable protocols ausgewertet werden. Es kann jedoch auch bedeuten, dass einige Objekte, die früher als Instanzen eines runtime-checkable protocols galten, in Python 3.12+ möglicherweise nicht mehr als Instanzen dieses Protokolls gelten und umgekehrt. Die meisten Benutzer werden von dieser Änderung wahrscheinlich nicht betroffen sein. (Beigetragen von Alex Waygood in gh-102433.)

  • Die Mitglieder eines runtime-checkable protocols gelten nun zur Laufzeit als „eingefroren“, sobald die Klasse erstellt wurde. Monkey-Patching von Attributen auf ein runtime-checkable protocol funktioniert weiterhin, hat aber keine Auswirkung auf `isinstance()`-Prüfungen, die Objekte mit dem Protokoll vergleichen. Zum Beispiel

    >>> from typing import Protocol, runtime_checkable
    >>> @runtime_checkable
    ... class HasX(Protocol):
    ...     x = 1
    ...
    >>> class Foo: ...
    ...
    >>> f = Foo()
    >>> isinstance(f, HasX)
    False
    >>> f.x = 1
    >>> isinstance(f, HasX)
    True
    >>> HasX.y = 2
    >>> isinstance(f, HasX)  # unchanged, even though HasX now also has a "y" attribute
    True
    

    Diese Änderung wurde vorgenommen, um `isinstance()`-Prüfungen gegen runtime-checkable protocols zu beschleunigen.

  • Das Leistungsprofil von `isinstance()`-Prüfungen gegen `runtime-checkable protocols` hat sich erheblich geändert. Die meisten `isinstance()`-Prüfungen gegen Protokolle mit nur wenigen Mitgliedern sollten mindestens 2x schneller sein als in 3.11, und einige können 20x schneller oder mehr sein. `isinstance()`-Prüfungen gegen Protokolle mit vielen Mitgliedern können jedoch langsamer sein als in Python 3.11. (Beigetragen von Alex Waygood in gh-74690 und gh-103193.)

  • Alle `typing.TypedDict`- und `typing.NamedTuple`-Klassen verfügen nun über das Attribut `__orig_bases__`. (Beigetragen von Adrian Garcia Badaracco in gh-103699.)

  • Fügt den Parameter `frozen_default` zu `typing.dataclass_transform()` hinzu. (Beigetragen von Erik De Bonte in gh-99957.)

unicodedata

  • Die Unicode-Datenbank wurde auf Version 15.0.0 aktualisiert. (Beigetragen von Benjamin Peterson in gh-96734).

unittest

Fügt die Kommandozeilenoption `--durations` hinzu, die die N langsamsten Testfälle anzeigt.

python3 -m unittest --durations=3 lib.tests.test_threading
.....
Slowest test durations
----------------------------------------------------------------------
1.210s     test_timeout (Lib.test.test_threading.BarrierTests)
1.003s     test_default_timeout (Lib.test.test_threading.BarrierTests)
0.518s     test_timeout (Lib.test.test_threading.EventTests)

(0.000 durations hidden.  Use -v to show these durations.)
----------------------------------------------------------------------
Ran 158 tests in 9.869s

OK (skipped=3)

(Beigetragen von Giampaolo Rodola in gh-48330)

uuid

  • Fügt eine Kommandozeilenschnittstelle hinzu. (Beigetragen von Adam Chhina in gh-88597.)

Optimierungen

  • Entfernt die Member `wstr` und `wstr_length` aus Unicode-Objekten. Dies reduziert die Objektgröße um 8 oder 16 Bytes auf 64-Bit-Plattformen. (PEP 623) (Beigetragen von Inada Naoki in gh-92536.)

  • Fügt experimentelle Unterstützung für die Verwendung des BOLT-Binäroptimizierers im Build-Prozess hinzu, was die Leistung um 1-5% verbessert. (Beigetragen von Kevin Modzelewski in gh-90536 und optimiert von Donghee Na in gh-101525)

  • Beschleunigt die reguläre Ausdruckssubstitution (Funktionen `re.sub()` und `re.subn()` sowie entsprechende `re.Pattern`-Methoden) für Ersetzungszeichenketten, die Gruppenreferenzen enthalten, um das 2-3-fache. (Beigetragen von Serhiy Storchaka in gh-91524.)

  • Beschleunigt die Erstellung von `asyncio.Task` durch Verzögerung aufwändiger Zeichenkettenformatierungen. (Beigetragen von Itamar Oren in gh-103793.)

  • Die Funktionen `tokenize.tokenize()` und `tokenize.generate_tokens()` sind bis zu 64% schneller als Nebeneffekt der Änderungen, die erforderlich waren, um PEP 701 im Modul `tokenize` abzudecken. (Beigetragen von Marta Gómez Macías und Pablo Galindo in gh-102856.)

  • Beschleunigt `super()`-Methodenaufrufe und Attributladungen über die neue `LOAD_SUPER_ATTR`-Anweisung. (Beigetragen von Carl Meyer und Vladimir Matveev in gh-103497.)

CPython Bytecode-Änderungen

  • Entfernt die `LOAD_METHOD`-Anweisung. Sie wurde in `LOAD_ATTR` integriert. `LOAD_ATTR` verhält sich nun wie die alte `LOAD_METHOD`-Anweisung, wenn das niederwertigste Bit seines Opargs gesetzt ist. (Beigetragen von Ken Jin in gh-93429.)

  • Entfernt die Anweisungen `JUMP_IF_FALSE_OR_POP` und `JUMP_IF_TRUE_OR_POP`. (Beigetragen von Irit Katriel in gh-102859.)

  • Entfernt die `PRECALL`-Anweisung. (Beigetragen von Mark Shannon in gh-92925.)

  • Fügt die Anweisungen `BINARY_SLICE` und `STORE_SLICE` hinzu. (Beigetragen von Mark Shannon in gh-94163.)

  • Fügt die `CALL_INTRINSIC_1`-Anweisungen hinzu. (Beigetragen von Mark Shannon in gh-99005.)

  • Fügt die `CALL_INTRINSIC_2`-Anweisung hinzu. (Beigetragen von Irit Katriel in gh-101799.)

  • Fügt die `CLEANUP_THROW`-Anweisung hinzu. (Beigetragen von Brandt Bucher in gh-90997.)

  • Fügt die `END_SEND`-Anweisung hinzu. (Beigetragen von Mark Shannon in gh-103082.)

  • Fügt die `LOAD_FAST_AND_CLEAR`-Anweisung als Teil der Implementierung von PEP 709 hinzu. (Beigetragen von Carl Meyer in gh-101441.)

  • Fügt die `LOAD_FAST_CHECK`-Anweisung hinzu. (Beigetragen von Dennis Sweeney in gh-93143.)

  • Fügt die Opcodes `LOAD_FROM_DICT_OR_DEREF`, `LOAD_FROM_DICT_OR_GLOBALS` und `LOAD_LOCALS` als Teil der Implementierung von PEP 695 hinzu. Entfernt den `LOAD_CLASSDEREF`-Opcode, der durch `LOAD_LOCALS` plus `LOAD_FROM_DICT_OR_DEREF` ersetzt werden kann. (Beigetragen von Jelle Zijlstra in gh-103764.)

  • Fügt die `LOAD_SUPER_ATTR`-Anweisung hinzu. (Beigetragen von Carl Meyer und Vladimir Matveev in gh-103497.)

  • Fügt die `RETURN_CONST`-Anweisung hinzu. (Beigetragen von Wenyang Wang in gh-101632.)

Demos und Tools

  • Entfernt das Verzeichnis `Tools/demo/`, das alte Demo-Skripte enthielt. Eine Kopie ist im Projekt [old-demos](https://github.com/gvanrossum/old-demos) zu finden. (Beigetragen von Victor Stinner in gh-97681.)

  • Entfernt veraltete Beispielskripte aus dem Verzeichnis `Tools/scripts/`. Eine Kopie ist im Projekt [old-demos](https://github.com/gvanrossum/old-demos) zu finden. (Beigetragen von Victor Stinner in gh-97669.)

Veraltet

  • `argparse`: Die Parameter `type`, `choices` und `metavar` von `argparse.BooleanOptionalAction` sind veraltet und werden in 3.14 entfernt. (Beigetragen von Nikita Sobolev in gh-92248.)

  • `ast`: Die folgenden `ast`-Features wurden seit Python 3.8 in der Dokumentation als veraltet markiert, lösen nun bei Zugriff oder Verwendung eine `DeprecationWarning` aus und werden in Python 3.14 entfernt.

    • ast.Num

    • ast.Str

    • ast.Bytes

    • ast.NameConstant

    • ast.Ellipsis

    Verwenden Sie stattdessen `ast.Constant`. (Beigetragen von Serhiy Storchaka in gh-90953.)

  • asyncio:

    • Die Klassen für Child-Watcher `asyncio.MultiLoopChildWatcher`, `asyncio.FastChildWatcher`, `asyncio.AbstractChildWatcher` und `asyncio.SafeChildWatcher` sind veraltet und werden in Python 3.14 entfernt. (Beigetragen von Kumar Aditya in gh-94597.)

    • `asyncio.set_child_watcher()`, `asyncio.get_child_watcher()`, `asyncio.AbstractEventLoopPolicy.set_child_watcher()` und `asyncio.AbstractEventLoopPolicy.get_child_watcher()` sind veraltet und werden in Python 3.14 entfernt. (Beigetragen von Kumar Aditya in gh-94597.)

    • Die Methode `get_event_loop()` der Standard-Event-Loop-Policy gibt nun eine `DeprecationWarning` aus, wenn kein aktueller Event-Loop gesetzt ist und die Policy einen erstellt. (Beigetragen von Serhiy Storchaka und Guido van Rossum in gh-100160.)

  • `calendar`: Die Konstanten `calendar.January` und `calendar.February` sind veraltet und werden durch `calendar.JANUARY` und `calendar.FEBRUARY` ersetzt. (Beigetragen von Prince Roshan in gh-103636.)

  • `collections.abc`: `collections.abc.ByteString` ist veraltet.

    Verwenden Sie isinstance(obj, collections.abc.Buffer), um zur Laufzeit zu testen, ob obj das Buffer-Protokoll implementiert. Für die Verwendung in Typ-Annotationen verwenden Sie entweder Buffer oder eine Union, die explizit die von Ihrem Code unterstützten Typen angibt (z. B. bytes | bytearray | memoryview).

    `ByteString` war ursprünglich als abstrakte Klasse gedacht, die als Obertyp sowohl für `bytes` als auch für `bytearray` dienen sollte. Da die ABC jedoch nie Methoden hatte, wusste man nie wirklich etwas Nützliches über ein Objekt, nur dass es eine Instanz von `ByteString` war. Andere gängige Puffertypen wie `memoryview` wurden ebenfalls nie als Untertypen von `ByteString` (weder zur Laufzeit noch von statischen Typenprüfern) verstanden.

    Weitere Details finden Sie in PEP 688. (Beigetragen von Shantanu Jain in gh-91896.)

  • `datetime`: Die Methoden `datetime.datetime.utcnow()` und `datetime.datetime.utcfromtimestamp()` sind veraltet und werden in einer zukünftigen Version entfernt. Verwenden Sie stattdessen zeitzonenbewusste Objekte, um Datums- und Zeitangaben in UTC darzustellen: rufen Sie `now()` bzw. `fromtimestamp()` mit dem Parameter `tz`, der auf `datetime.UTC` gesetzt ist, auf. (Beigetragen von Paul Ganssle in gh-103857.)

  • `email`: Der Parameter `isdst` in `email.utils.localtime()` ist veraltet. (Beigetragen von Alan Williams in gh-72346.)

  • `importlib.abc`: Die folgenden Klassen sind veraltet und werden für die Entfernung in Python 3.14 geplant.

    • importlib.abc.ResourceReader

    • importlib.abc.Traversable

    • importlib.abc.TraversableResources

    Verwenden Sie stattdessen die Klassen von `importlib.resources.abc`.

    (Beigetragen von Jason R. Coombs und Hugo van Kemenade in gh-93963.)

  • `itertools`: Die Unterstützung für Kopier-, Deepcopy- und Pickle-Operationen ist veraltet, nicht dokumentiert, ineffizient, historisch fehlerhaft und inkonsistent. Dies wird in 3.14 entfernt, um das Codevolumen und den Wartungsaufwand erheblich zu reduzieren. (Beigetragen von Raymond Hettinger in gh-101588.)

  • multiprocessing: In Python 3.14 wird die Standard-Startmethode von multiprocessing auf Linux, BSDs und anderen Nicht-macOS-POSIX-Plattformen, wo derzeit 'fork' der Standard ist, zu einer sichereren Methode geändert (gh-84559). Das Hinzufügen einer Laufzeitwarnung hierzu wurde als zu störend erachtet, da nicht erwartet wird, dass die Mehrheit des Codes dies betrifft. Verwenden Sie die APIs get_context() oder set_start_method(), um explizit anzugeben, wenn Ihr Code 'fork' *benötigt*. Siehe Kontexte und Startmethoden.

  • pkgutil: pkgutil.find_loader() und pkgutil.get_loader() sind veraltet und werden in Python 3.14 entfernt. Verwenden Sie stattdessen importlib.util.find_spec(). (Beigesteuert von Nikita Sobolev in gh-97850.)

  • pty: Das Modul hat zwei undokumentierte Funktionen master_open() und slave_open(), die seit Python 2 veraltet sind, aber erst in 3.12 eine ordnungsgemäße DeprecationWarning erhielten. Entfernung in 3.14. (Beigesteuert von Soumendra Ganguly und Gregory P. Smith in gh-85984.)

  • os:

    • Die Felder st_ctime, die von os.stat() und os.lstat() unter Windows zurückgegeben werden, sind veraltet. In einer zukünftigen Version enthalten sie die letzte Änderungszeit der Metadaten, konsistent mit anderen Plattformen. Derzeit enthalten sie immer noch die Erstellungszeit, die auch im neuen Feld st_birthtime verfügbar ist. (Beigesteuert von Steve Dower in gh-99726.)

    • Auf POSIX-Plattformen kann os.fork() jetzt eine DeprecationWarning auslösen, wenn erkannt werden kann, dass es von einem multithreaded Prozess aufgerufen wird. Es gab schon immer eine grundlegende Inkompatibilität mit der POSIX-Plattform, wenn dies geschah. Selbst wenn solcher Code *scheinbar* funktionierte. Die Warnung wurde hinzugefügt, um das Bewusstsein zu schärfen, da die Probleme, auf die Code mit dieser Vorgehensweise stößt, häufiger werden. Siehe die Dokumentation zu os.fork() für weitere Details sowie diese Diskussion über die Inkompatibilität von fork mit Threads, um zu verstehen, *warum* wir dieses langjährige Kompatibilitätsproblem der Plattform nun Entwicklern aufzeigen.

    Wenn diese Warnung aufgrund der Verwendung von multiprocessing oder concurrent.futures auftritt, besteht die Lösung darin, eine andere multiprocessing-Startmethode wie "spawn" oder "forkserver" zu verwenden.

  • shutil: Das Argument onerror von shutil.rmtree() ist veraltet; verwenden Sie stattdessen onexc. (Beigesteuert von Irit Katriel in gh-102828.)

  • sqlite3:

  • sys: Die Felder sys.last_type, sys.last_value und sys.last_traceback sind veraltet. Verwenden Sie stattdessen sys.last_exc. (Beigesteuert von Irit Katriel in gh-102778.)

  • tarfile: Das Extrahieren von Tar-Archiven ohne Angabe von filter ist bis Python 3.14 veraltet, dann wird der 'data'-Filter zum Standard. Weitere Details finden Sie unter Extraktionsfilter.

  • typing:

  • xml.etree.ElementTree: Das Modul gibt nun eine DeprecationWarning aus, wenn der Wahrheitswert eines xml.etree.ElementTree.Element geprüft wird. Zuvor gab die Python-Implementierung eine FutureWarning aus, und die C-Implementierung gab nichts aus. (Beigesteuert von Jacob Walls in gh-83122.)

  • Die 3-Argument-Signaturen (type, value, traceback) von coroutine throw(), generator throw() und async generator throw() sind veraltet und können in einer zukünftigen Python-Version entfernt werden. Verwenden Sie stattdessen die Ein-Argument-Versionen dieser Funktionen. (Beigesteuert von Ofey Chan in gh-89874.)

  • DeprecationWarning wird jetzt ausgelöst, wenn __package__ eines Moduls von __spec__.parent abweicht (zuvor war es ImportWarning). (Beigesteuert von Brett Cannon in gh-65961.)

  • Das Setzen von __package__ oder __cached__ für ein Modul ist veraltet und wird ab Python 3.14 vom Import-System nicht mehr berücksichtigt. (Beigesteuert von Brett Cannon in gh-65961.)

  • Der bitweise Inversionsoperator (~) für boolesche Werte ist veraltet. Er wird in Python 3.16 einen Fehler auslösen. Verwenden Sie not für die logische Negation von booleschen Werten. In den seltenen Fällen, in denen Sie wirklich die bitweise Inversion des zugrunde liegenden int benötigen, konvertieren Sie explizit zu int: ~int(x). (Beigesteuert von Tim Hoffmann in gh-103487.)

  • Der Zugriff auf co_lnotab auf Codeobjekten war in Python 3.10 über PEP 626 veraltet, erhielt aber erst in 3.12 eine ordnungsgemäße DeprecationWarning. Kann in 3.15 entfernt werden. (Beigesteuert von Nikita Sobolev in gh-101866.)

Zur Entfernung in Python 3.13 vorgesehen

Module (siehe PEP 594)

  • aifc

  • audioop

  • cgi

  • cgitb

  • chunk

  • crypt

  • imghdr

  • mailcap

  • msilib

  • nis

  • nntplib

  • ossaudiodev

  • pipes

  • sndhdr

  • spwd

  • sunau

  • telnetlib

  • uu

  • xdrlib

Andere Module

  • lib2to3 und das Programm 2to3 (gh-84540)

APIs

Wird in Python 3.14 entfernt

  • `argparse`: Die Parameter `type`, `choices` und `metavar` von `argparse.BooleanOptionalAction` sind veraltet und werden in 3.14 entfernt. (Beigetragen von Nikita Sobolev in gh-92248.)

  • ast: Die folgenden Funktionen sind in der Dokumentation seit Python 3.8 veraltet, lösen jetzt eine DeprecationWarning aus, wenn sie zur Laufzeit aufgerufen oder verwendet werden, und werden in Python 3.14 entfernt.

    • ast.Num

    • ast.Str

    • ast.Bytes

    • ast.NameConstant

    • ast.Ellipsis

    Verwenden Sie stattdessen `ast.Constant`. (Beigetragen von Serhiy Storchaka in gh-90953.)

  • asyncio:

    • Die Klassen für Child-Watcher `asyncio.MultiLoopChildWatcher`, `asyncio.FastChildWatcher`, `asyncio.AbstractChildWatcher` und `asyncio.SafeChildWatcher` sind veraltet und werden in Python 3.14 entfernt. (Beigetragen von Kumar Aditya in gh-94597.)

    • `asyncio.set_child_watcher()`, `asyncio.get_child_watcher()`, `asyncio.AbstractEventLoopPolicy.set_child_watcher()` und `asyncio.AbstractEventLoopPolicy.get_child_watcher()` sind veraltet und werden in Python 3.14 entfernt. (Beigetragen von Kumar Aditya in gh-94597.)

    • Die Methode `get_event_loop()` der Standard-Event-Loop-Policy gibt nun eine `DeprecationWarning` aus, wenn kein aktueller Event-Loop gesetzt ist und die Policy einen erstellt. (Beigetragen von Serhiy Storchaka und Guido van Rossum in gh-100160.)

  • email: Der Parameter isdst in email.utils.localtime() ist veraltet. (Beigesteuert von Alan Williams in gh-72346.)

  • importlib.abc veraltete Klassen

    • importlib.abc.ResourceReader

    • importlib.abc.Traversable

    • importlib.abc.TraversableResources

    Verwenden Sie stattdessen die Klassen von `importlib.resources.abc`.

    (Beigetragen von Jason R. Coombs und Hugo van Kemenade in gh-93963.)

  • itertools hatte undokumentierte, ineffiziente, historisch fehlerhafte und inkonsistente Unterstützung für Kopier-, Tiefkopier- und Pickle-Operationen. Diese werden in 3.14 entfernt, was zu einer erheblichen Reduzierung des Codeumfangs und des Wartungsaufwands führt. (Beigesteuert von Raymond Hettinger in gh-101588.)

  • multiprocessing: Die Standard-Startmethode wird auf Linux, BSDs und anderen Nicht-macOS-POSIX-Plattformen, wo derzeit 'fork' der Standard ist, zu einer sichereren Methode geändert (gh-84559). Das Hinzufügen einer Laufzeitwarnung hierzu wurde als zu störend erachtet, da nicht erwartet wird, dass die Mehrheit des Codes dies betrifft. Verwenden Sie die APIs get_context() oder set_start_method(), um explizit anzugeben, wenn Ihr Code 'fork' *benötigt*. Siehe Kontexte und Startmethoden.

  • pathlib: is_relative_to() und relative_to(): das Übergeben zusätzlicher Argumente ist veraltet.

  • pkgutil: pkgutil.find_loader() und pkgutil.get_loader() geben jetzt DeprecationWarning aus; verwenden Sie stattdessen importlib.util.find_spec(). (Beigesteuert von Nikita Sobolev in gh-97850.)

  • pty:

  • sqlite3:

  • urllib: urllib.parse.Quoter ist veraltet: Es war nicht als öffentliche API vorgesehen. (Beigesteuert von Gregory P. Smith in gh-88168.)

Zur Entfernung vorgesehen in Python 3.15

  • Das Importsystem

    • Das Setzen von __cached__ für ein Modul, während __spec__.cached nicht gesetzt wird, ist veraltet. In Python 3.15 wird __cached__ vom Import-System oder der Standardbibliothek nicht mehr gesetzt oder berücksichtigt. (gh-97879)

    • Das Setzen von __package__ für ein Modul, während __spec__.parent nicht gesetzt wird, ist veraltet. In Python 3.15 wird __package__ vom Import-System oder der Standardbibliothek nicht mehr gesetzt oder berücksichtigt. (gh-97879)

  • ctypes:

    • Die undokumentierte Funktion ctypes.SetPointerType() ist seit Python 3.13 veraltet.

  • http.server:

    • Die veraltete und selten genutzte CGIHTTPRequestHandler ist seit Python 3.13 veraltet. Es gibt keinen direkten Ersatz. *Alles* ist besser als CGI, um einen Webserver mit einem Request-Handler zu verbinden.

    • Das Flag --cgi für die Kommandozeilenschnittstelle python -m http.server ist seit Python 3.13 veraltet.

  • importlib:

    • Methode load_module(): verwenden Sie stattdessen exec_module().

  • locale:

  • pathlib:

  • platform:

    • java_ver() ist seit Python 3.13 veraltet. Diese Funktion ist nur für die Jython-Unterstützung nützlich, hat eine verwirrende API und wird weitgehend nicht getestet.

  • sysconfig:

  • threading:

    • RLock() wird in Python 3.15 keine Argumente mehr akzeptieren. Das Übergeben von Argumenten ist seit Python 3.14 veraltet, da die Python-Version keine Argumente zulässt, die C-Version jedoch beliebige Positions- oder Schlüsselwortargumente zulässt und alle ignoriert.

  • types:

  • typing:

    • Die undokumentierte Schlüsselwortargument-Syntax für die Erstellung von NamedTuple-Klassen (z. B. Point = NamedTuple("Point", x=int, y=int)) ist seit Python 3.13 veraltet. Verwenden Sie stattdessen die klassenbasierte Syntax oder die funktionale Syntax.

    • Bei Verwendung der funktionalen Syntax von TypedDicts ist das Fehlen eines Wertes für den Parameter fields (TD = TypedDict("TD")) oder das Übergeben von None (TD = TypedDict("TD", None)) seit Python 3.13 veraltet. Verwenden Sie class TD(TypedDict): pass oder TD = TypedDict("TD", {}), um ein TypedDict mit null Feldern zu erstellen.

    • Der Dekorator typing.no_type_check_decorator() ist seit Python 3.13 veraltet. Nach acht Jahren im Modul typing wurde er von keinem wichtigen Typ-Checker unterstützt.

  • wave:

  • zipimport:

    • load_module() ist seit Python 3.10 veraltet. Verwenden Sie stattdessen exec_module(). (Beigetragen von Jiahao Li in gh-125746.)

Vorschlag zur Entfernung in Python 3.16

  • Das Importsystem

    • Das Setzen von __loader__ für ein Modul, während gleichzeitig __spec__.loader nicht gesetzt wird, ist veraltet. In Python 3.16 wird __loader__ vom Importsystem und der Standardbibliothek weder gesetzt noch berücksichtigt.

  • array:

    • Der Formatcode 'u' (wchar_t) ist seit Python 3.3 in der Dokumentation und seit Python 3.13 zur Laufzeit veraltet. Verwenden Sie stattdessen den Formatcode 'w' (Py_UCS4) für Unicode-Zeichen.

  • asyncio:

  • builtins:

    • Bitweise Inversion auf booleschen Typen, ~True oder ~False, ist seit Python 3.12 veraltet, da sie überraschende und unintuitive Ergebnisse liefert (-2 und -1). Verwenden Sie stattdessen not x für die logische Negation eines Boole-Wertes. In dem seltenen Fall, dass Sie die bitweise Inversion der zugrunde liegenden Ganzzahl benötigen, konvertieren Sie explizit zu int (~int(x)).

  • functools:

    • Das Aufrufen der Python-Implementierung von functools.reduce() mit function oder sequence als Schlüsselwortargumente ist seit Python 3.14 veraltet.

  • logging:

    Die Unterstützung für benutzerdefinierte Logging-Handler mit dem Argument strm ist veraltet und soll in Python 3.16 entfernt werden. Definieren Sie Handler stattdessen mit dem Argument stream. (Beigetragen von Mariusz Felisiak in gh-115032.)

  • mimetypes:

    • Gültige Erweiterungen beginnen mit einem Punkt oder sind leer für mimetypes.MimeTypes.add_type(). Nicht-punktierte Erweiterungen sind veraltet und lösen in Python 3.16 einen ValueError aus. (Beigetragen von Hugo van Kemenade in gh-75223.)

  • shutil:

    • Die Ausnahme ExecError ist seit Python 3.14 veraltet. Sie wurde seit Python 3.4 von keiner Funktion in shutil verwendet und ist nun ein Alias für RuntimeError.

  • symtable:

  • sys:

  • sysconfig:

    • Die Funktion sysconfig.expand_makefile_vars() ist seit Python 3.14 veraltet. Verwenden Sie stattdessen das Argument vars von sysconfig.get_paths().

  • tarfile:

    • Das undokumentierte und ungenutzte Attribut TarFile.tarfile ist seit Python 3.13 veraltet.

Zur Entfernung vorgesehen in Python 3.17

  • collections.abc:

    • collections.abc.ByteString ist für die Entfernung in Python 3.17 geplant.

      Verwenden Sie isinstance(obj, collections.abc.Buffer), um zur Laufzeit zu testen, ob obj das Buffer-Protokoll implementiert. Für die Verwendung in Typ-Annotationen verwenden Sie entweder Buffer oder eine Union, die explizit die von Ihrem Code unterstützten Typen angibt (z. B. bytes | bytearray | memoryview).

      `ByteString` war ursprünglich als abstrakte Klasse gedacht, die als Obertyp sowohl für `bytes` als auch für `bytearray` dienen sollte. Da die ABC jedoch nie Methoden hatte, wusste man nie wirklich etwas Nützliches über ein Objekt, nur dass es eine Instanz von `ByteString` war. Andere gängige Puffertypen wie `memoryview` wurden ebenfalls nie als Untertypen von `ByteString` (weder zur Laufzeit noch von statischen Typenprüfern) verstanden.

      Weitere Details finden Sie unter PEP 688. (Beigesteuert von Shantanu Jain in gh-91896.)

  • typing:

    • Vor Python 3.14 wurden alte Unions mit der privaten Klasse typing._UnionGenericAlias implementiert. Diese Klasse wird für die Implementierung nicht mehr benötigt, wurde aber zur Abwärtskompatibilität beibehalten und soll spätestens in Python 3.17 entfernt werden. Benutzer sollten dokumentierte Introspektionshilfen wie typing.get_origin() und typing.get_args() verwenden, anstatt sich auf private Implementierungsdetails zu verlassen.

    • typing.ByteString, das seit Python 3.9 veraltet ist, ist für die Entfernung in Python 3.17 geplant.

      Verwenden Sie isinstance(obj, collections.abc.Buffer), um zur Laufzeit zu testen, ob obj das Buffer-Protokoll implementiert. Für die Verwendung in Typ-Annotationen verwenden Sie entweder Buffer oder eine Union, die explizit die von Ihrem Code unterstützten Typen angibt (z. B. bytes | bytearray | memoryview).

      `ByteString` war ursprünglich als abstrakte Klasse gedacht, die als Obertyp sowohl für `bytes` als auch für `bytearray` dienen sollte. Da die ABC jedoch nie Methoden hatte, wusste man nie wirklich etwas Nützliches über ein Objekt, nur dass es eine Instanz von `ByteString` war. Andere gängige Puffertypen wie `memoryview` wurden ebenfalls nie als Untertypen von `ByteString` (weder zur Laufzeit noch von statischen Typenprüfern) verstanden.

      Weitere Details finden Sie unter PEP 688. (Beigesteuert von Shantanu Jain in gh-91896.)

Zur Entfernung vorgesehen in zukünftigen Versionen

Die folgenden APIs werden in Zukunft entfernt, obwohl derzeit kein Datum für ihre Entfernung geplant ist.

  • argparse:

    • Verschachtelte Argumentgruppen und verschachtelte gegenseitig ausschließende Gruppen sind veraltet.

    • Das Übergeben des undokumentierten Schlüsselwortarguments prefix_chars an add_argument_group() ist nun veraltet.

    • Der Typ-Konverter argparse.FileType ist veraltet.

  • builtins:

    • Generatoren: Die Signatur throw(type, exc, tb) und athrow(type, exc, tb) ist veraltet: verwenden Sie stattdessen throw(exc) und athrow(exc), die Signatur mit einem einzigen Argument.

    • Derzeit akzeptiert Python numerische Literale, denen unmittelbar Schlüsselwörter folgen, z. B. 0in x, 1or x, 0if 1else 2. Dies ermöglicht verwirrende und mehrdeutige Ausdrücke wie [0x1for x in y] (was als [0x1 for x in y] oder [0x1f or x in y] interpretiert werden kann). Eine Syntaxwarnung wird ausgegeben, wenn dem numerischen Literal unmittelbar eines der Schlüsselwörter and, else, for, if, in, is und or folgt. In einer zukünftigen Version wird dies zu einem Syntaxfehler geändert. (gh-87999)

    • Unterstützung für die Methode __index__() und __int__(), die einen Nicht-Int-Typ zurückgibt: diese Methoden müssen eine Instanz einer strengen Unterklasse von int zurückgeben.

    • Unterstützung für die Methode __float__(), die eine strenge Unterklasse von float zurückgibt: diese Methoden müssen eine Instanz von float zurückgeben.

    • Unterstützung für die Methode __complex__(), die eine strenge Unterklasse von complex zurückgibt: diese Methoden müssen eine Instanz von complex zurückgeben.

    • Delegation von int() an die Methode __trunc__().

    • Das Übergeben einer komplexen Zahl als Argument real oder imag im Konstruktor complex() ist nun veraltet; sie sollte nur als einzelnes Positionsargument übergeben werden. (Beigetragen von Serhiy Storchaka in gh-109218.)

  • `calendar`: Die Konstanten `calendar.January` und `calendar.February` sind veraltet und werden durch `calendar.JANUARY` und `calendar.FEBRUARY` ersetzt. (Beigetragen von Prince Roshan in gh-103636.)

  • codecs: Verwenden Sie open() anstelle von codecs.open(). (gh-133038)

  • codeobject.co_lnotab: Verwenden Sie stattdessen die Methode codeobject.co_lines().

  • datetime:

    • utcnow(): Verwenden Sie datetime.datetime.now(tz=datetime.UTC).

    • utcfromtimestamp(): Verwenden Sie datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC).

  • gettext: Der Pluralwert muss eine ganze Zahl sein.

  • importlib:

    • Der Parameter debug_override von cache_from_source() ist veraltet: verwenden Sie stattdessen den Parameter optimization.

  • importlib.metadata:

    • Schnittstelle des EntryPoints-Tupels.

    • Implizites None bei Rückgabewerten.

  • logging: Die Methode warn() ist seit Python 3.3 veraltet, verwenden Sie stattdessen warning().

  • mailbox: Die Verwendung von StringIO-Eingabe und Textmodus ist veraltet, verwenden Sie stattdessen BytesIO und Binärmodus.

  • os: Aufruf von os.register_at_fork() in einem Multithreading-Prozess.

  • pydoc.ErrorDuringImport: Die Übergabe eines Tupelwerts für den Parameter exc_info ist veraltet, verwenden Sie stattdessen eine Ausnahmeinstanz.

  • re: Für numerische Gruppennummern und Gruppennamen in regulären Ausdrücken werden nun strengere Regeln angewendet. Nur eine Sequenz von ASCII-Ziffern wird nun als numerische Referenz akzeptiert. Der Gruppenname in Byte-Mustern und Ersetzungszeichenfolgen darf nun nur ASCII-Buchstaben, Ziffern und Unterstriche enthalten. (Beigetragen von Serhiy Storchaka in gh-91760.)

  • Module sre_compile, sre_constants und sre_parse.

  • shutil: Das Parameter onerror von rmtree() ist in Python 3.12 veraltet; verwenden Sie stattdessen den Parameter onexc.

  • SSL-Optionen und -Protokolle

    • ssl.SSLContext ohne Protokollargument ist veraltet.

    • ssl.SSLContext: set_npn_protocols() und selected_npn_protocol() sind veraltet: verwenden Sie stattdessen ALPN.

    • Optionen ssl.OP_NO_SSL*

    • Optionen ssl.OP_NO_TLS*

    • ssl.PROTOCOL_SSLv3

    • ssl.PROTOCOL_TLS

    • ssl.PROTOCOL_TLSv1

    • ssl.PROTOCOL_TLSv1_1

    • ssl.PROTOCOL_TLSv1_2

    • ssl.TLSVersion.SSLv3

    • ssl.TLSVersion.TLSv1

    • ssl.TLSVersion.TLSv1_1

  • Methoden von threading

  • typing.Text (gh-92332).

  • Die interne Klasse typing._UnionGenericAlias wird nicht mehr zur Implementierung von typing.Union verwendet. Um die Kompatibilität mit Benutzern dieser privaten Klasse zu erhalten, wird bis mindestens Python 3.17 ein Kompatibilitäts-Shim bereitgestellt. (Beigetragen von Jelle Zijlstra in gh-105499.)

  • unittest.IsolatedAsyncioTestCase: Es ist veraltet, einen Wert zurückzugeben, der nicht None ist, von einem Testfall.

  • Veraltete Funktionen in urllib.parse: stattdessen urlparse()

    • splitattr()

    • splithost()

    • splitnport()

    • splitpasswd()

    • splitport()

    • splitquery()

    • splittag()

    • splittype()

    • splituser()

    • splitvalue()

    • to_bytes()

  • wsgiref: SimpleHandler.stdout.write() sollte keine Teil-Schreibvorgänge durchführen.

  • xml.etree.ElementTree: Das Testen des Wahrheitswerts eines Element ist veraltet. In einer zukünftigen Version wird dies immer True zurückgeben. Bevorzugen Sie explizite Tests mit len(elem) oder elem is not None.

  • sys._clear_type_cache() ist veraltet: verwenden Sie stattdessen sys._clear_internal_caches().

Entfernt

asynchat und asyncore

  • Diese beiden Module wurden gemäß dem Zeitplan in PEP 594 entfernt, nachdem sie in Python 3.6 veraltet waren. Verwenden Sie stattdessen asyncio. (Beigesteuert von Nikita Sobolev in gh-96580.)

configparser

distutils

  • Entfernen Sie das distutils Paket. Es wurde in Python 3.10 gemäß PEP 632 „Deprecate distutils module“ veraltet. Für Projekte, die immer noch distutils verwenden und nicht aktualisiert werden können, kann das setuptools Paket installiert werden: es stellt immer noch distutils bereit. (Beigetragen von Victor Stinner in gh-92584.)

ensurepip

  • Entfernen Sie das gebündelte setuptools Wheel aus ensurepip und hören Sie auf, setuptools in Umgebungen zu installieren, die von venv erstellt wurden.

    pip (>= 22.1) benötigt kein installiertes setuptools in der Umgebung. setuptools-basierte (und distutils-basierte) Pakete können weiterhin mit pip install verwendet werden, da pip setuptools in der Build-Umgebung bereitstellt, die es für das Erstellen eines Pakets verwendet.

    easy_install, pkg_resources, setuptools und distutils werden nicht mehr standardmäßig in Umgebungen bereitgestellt, die mit venv erstellt oder mit ensurepip gebootstrapped wurden, da sie Teil des setuptools-Pakets sind. Für Projekte, die diese zur Laufzeit verwenden, sollte das setuptools-Projekt als Abhängigkeit deklariert und separat installiert werden (typischerweise mit pip).

    (Beigetragen von Pradyun Gedam in gh-95299.)

enum

  • Entfernen Sie enums EnumMeta.__getattr__, das für den Zugriff auf Enum-Attribute nicht mehr benötigt wird. (Beigetragen von Ethan Furman in gh-95083.)

ftplib

  • Entfernen Sie das Klassenattribut ssl_version von ftplibs FTP_TLS: Verwenden Sie stattdessen den context-Parameter. (Beigetragen von Victor Stinner in gh-94172.)

gzip

  • Entfernen Sie das filename-Attribut von gzips gzip.GzipFile, das seit Python 2.6 veraltet ist, verwenden Sie stattdessen das name-Attribut. Im Schreibmodus fügte das filename-Attribut die Dateierweiterung '.gz' hinzu, wenn sie nicht vorhanden war. (Beigetragen von Victor Stinner in gh-94196.)

hashlib

  • Entfernen Sie die reine Python-Implementierung von hashlibs hashlib.pbkdf2_hmac(), die in Python 3.10 veraltet war. Python 3.10 und neuer erfordert OpenSSL 1.1.1 (PEP 644): diese OpenSSL-Version bietet eine C-Implementierung von pbkdf2_hmac(), die schneller ist. (Beigetragen von Victor Stinner in gh-94199.)

importlib

  • Viele zuvor als veraltet markierte Bereinigungen in importlib wurden nun abgeschlossen.

    • Referenzen auf und Unterstützung für module_repr() wurde entfernt. (Beigetragen von Barry Warsaw in gh-97850.)

    • importlib.util.set_package, importlib.util.set_loader und importlib.util.module_for_loader wurden alle entfernt. (Beigetragen von Brett Cannon und Nikita Sobolev in gh-65961 und gh-97850.)

    • Unterstützung für die find_loader() und find_module() APIs wurde entfernt. (Beigetragen von Barry Warsaw in gh-98040.)

    • importlib.abc.Finder, pkgutil.ImpImporter und pkgutil.ImpLoader wurden entfernt. (Beigetragen von Barry Warsaw in gh-98040.)

imp

  • Das imp-Modul wurde entfernt. (Beigetragen von Barry Warsaw in gh-98040.)

    Konsultieren Sie zur Migration die folgende Korrespondenztabelle

    imp

    importlib

    imp.NullImporter

    Fügen Sie None in sys.path_importer_cache ein

    imp.cache_from_source()

    importlib.util.cache_from_source()

    imp.find_module()

    importlib.util.find_spec()

    imp.get_magic()

    importlib.util.MAGIC_NUMBER

    imp.get_suffixes()

    importlib.machinery.SOURCE_SUFFIXES, importlib.machinery.EXTENSION_SUFFIXES und importlib.machinery.BYTECODE_SUFFIXES

    imp.get_tag()

    sys.implementation.cache_tag

    imp.load_module()

    importlib.import_module()

    imp.new_module(name)

    types.ModuleType(name)

    imp.reload()

    importlib.reload()

    imp.source_from_cache()

    importlib.util.source_from_cache()

    imp.load_source()

    Siehe unten

    Ersetzen Sie 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)
        # The module is always executed and not cached in sys.modules.
        # Uncomment the following line to cache the module.
        # sys.modules[module.__name__] = module
        loader.exec_module(module)
        return module
    
  • Entfernen Sie imp-Funktionen und -Attribute ohne Ersatz

    • Undokumentierte Funktionen

      • imp.init_builtin()

      • imp.load_compiled()

      • imp.load_dynamic()

      • imp.load_package()

    • imp.lock_held(), imp.acquire_lock(), imp.release_lock(): das Sperrschema wurde in Python 3.3 auf sperren pro Modul umgestellt.

    • Konstanten von imp.find_module(): SEARCH_ERROR, PY_SOURCE, PY_COMPILED, C_EXTENSION, PY_RESOURCE, PKG_DIRECTORY, C_BUILTIN, PY_FROZEN, PY_CODERESOURCE, IMP_HOOK.

io

  • Entfernen Sie ios io.OpenWrapper und _pyio.OpenWrapper, die in Python 3.10 veraltet waren: verwenden Sie stattdessen einfach open(). Die Funktion open() (io.open()) ist eine eingebaute Funktion. Seit Python 3.10 ist _pyio.open() ebenfalls eine statische Methode. (Beigetragen von Victor Stinner in gh-94169.)

locale

  • Entfernen Sie die Funktion locales locale.format(), die in Python 3.7 veraltet war: verwenden Sie stattdessen locale.format_string(). (Beigetragen von Victor Stinner in gh-94226.)

smtpd

  • Das Modul smtpd wurde gemäß dem Zeitplan in PEP 594 entfernt, nachdem es in Python 3.4.7 und 3.5.4 veraltet war. Verwenden Sie stattdessen das PyPI-Modul aiosmtpd oder einen anderen asyncio-basierten Server. (Beigetragen von Oleg Iarygin in gh-93243.)

sqlite3

  • Die folgenden undokumentierten sqlite3-Funktionen, die in Python 3.10 veraltet waren, sind nun entfernt worden

    • sqlite3.enable_shared_cache()

    • sqlite3.OptimizedUnicode

    Wenn ein Shared Cache verwendet werden muss, öffnen Sie die Datenbank im URI-Modus unter Verwendung des Query-Parameters cache=shared.

    Die Textfabrik sqlite3.OptimizedUnicode ist seit Python 3.3 ein Alias für str. Code, der zuvor die Textfabrik auf OptimizedUnicode gesetzt hat, kann entweder explizit str verwenden oder sich auf den Standardwert verlassen, der ebenfalls str ist.

    (Beigetragen von Erlend E. Aasland in gh-92548.)

ssl

  • Entfernen Sie die Funktion ssls ssl.RAND_pseudo_bytes(), die in Python 3.6 veraltet war: verwenden Sie stattdessen os.urandom() oder ssl.RAND_bytes(). (Beigetragen von Victor Stinner in gh-94199.)

  • Entfernen Sie die Funktion ssl.match_hostname(). Sie wurde in Python 3.7 veraltet. OpenSSL führt seit Python 3.7 die Hostnamenübereinstimmung durch, Python verwendet die Funktion ssl.match_hostname() nicht mehr. (Beigetragen von Victor Stinner in gh-94199.)

  • Entfernen Sie die Funktion ssl.wrap_socket(), die in Python 3.7 veraltet war: erstellen Sie stattdessen ein ssl.SSLContext-Objekt und rufen Sie seine Methode ssl.SSLContext.wrap_socket auf. Jedes Paket, das immer noch ssl.wrap_socket() verwendet, ist defekt und unsicher. Die Funktion sendet weder eine SNI TLS-Erweiterung noch validiert sie den Servernamen. Der Code unterliegt CWE 295 (Fehlerhafte Zertifikatsvalidierung). (Beigetragen von Victor Stinner in gh-94199.)

unittest

webbrowser

  • Entfernen Sie die Unterstützung für veraltete Browser aus webbrowser. Die entfernten Browser umfassen: Grail, Mosaic, Netscape, Galeon, Skipstone, Iceape, Firebird und Firefox-Versionen 35 und darunter (gh-102871).

xml.etree.ElementTree

  • Entfernen Sie die Methode ElementTree.Element.copy() der reinen Python-Implementierung, die in Python 3.10 veraltet war, verwenden Sie stattdessen die Funktion copy.copy(). Die C-Implementierung von xml.etree.ElementTree hat keine copy()-Methode, nur eine __copy__()-Methode. (Beigetragen von Victor Stinner in gh-94383.)

zipimport

  • Entfernen Sie die Methoden find_loader() und find_module() von zipimport, die in Python 3.10 veraltet waren: verwenden Sie stattdessen die Methode find_spec(). Siehe PEP 451 für die Begründung. (Beigetragen von Victor Stinner in gh-94379.)

Sonstiges

  • Entfernen Sie die Regel suspicious aus dem Dokumentations-Makefile Makefile und Doc/tools/rstlint.py, beide zugunsten von sphinx-lint. (Beigetragen von Julien Palard in gh-98179.)

  • Entfernen Sie die Parameter keyfile und certfile aus den Modulen ftplib, imaplib, poplib und smtplib sowie die Parameter key_file, cert_file und check_hostname aus dem Modul http.client, die alle seit Python 3.6 veraltet waren. Verwenden Sie stattdessen den Parameter context (ssl_context in imaplib). (Beigetragen von Victor Stinner in gh-94172.)

  • Entfernen Sie Jython-Kompatibilitäts-Hacks aus mehreren Standardbibliotheksmodulen und Tests. (Beigetragen von Nikita Sobolev in gh-99482.)

  • Entfernen Sie das Flag _use_broken_old_ctypes_structure_semantics_ aus dem ctypes-Modul. (Beigetragen von Nikita Sobolev in gh-99285.)

Portierung auf Python 3.12

Dieser Abschnitt listet zuvor beschriebene Änderungen und weitere Fehlerbehebungen auf, die möglicherweise Änderungen an Ihrem Code erfordern.

Änderungen in der Python-API

  • Strengere Regeln werden nun für numerische Gruppenreferenzen und Gruppennamen in regulären Ausdrücken angewendet. Nur eine Sequenz von ASCII-Ziffern wird jetzt als numerische Referenz akzeptiert. Der Gruppenname in Byte-Mustern und Ersetzungszeichenfolgen kann nun nur ASCII-Buchstaben und Ziffern sowie Unterstriche enthalten. (Beigetragen von Serhiy Storchaka in gh-91760.)

  • Entfernen Sie die seit Python 3.10 veraltete Funktionalität von randrange(). Früher wurde randrange(10.0) verlustfrei in randrange(10) umgewandelt. Jetzt löst es einen TypeError aus. Außerdem wurde die Ausnahme, die für nicht-ganzzahlige Werte wie randrange(10.5) oder randrange('10') ausgelöst wurde, von ValueError zu TypeError geändert. Dies verhindert auch Fehler, bei denen randrange(1e25) stillschweigend aus einem größeren Bereich als randrange(10**25) auswählte. (Ursprünglich vorgeschlagen von Serhiy Storchaka gh-86388.)

  • argparse.ArgumentParser hat die Kodierung und den Fehlerbehandlungsmechanismus für das Lesen von Argumenten aus Dateien (z.B. die Option fromfile_prefix_chars) von der Standardtextkodierung (z.B. locale.getpreferredencoding(False)) zum Dateisystemkodierung und Fehlerhandler geändert. Argumentdateien sollten unter Windows in UTF-8 und nicht in ANSI-Codepage kodiert sein.

  • Das asyncore-basierte smtpd-Modul, das in Python 3.4.7 und 3.5.4 veraltet war, wurde entfernt. Eine empfohlene Alternative ist das asyncio-basierte aiosmtpd PyPI-Modul.

  • shlex.split(): Das Übergeben von None für das Argument s löst nun eine Ausnahme aus, anstatt von sys.stdin zu lesen. Die Funktion war in Python 3.9 veraltet. (Beigetragen von Victor Stinner in gh-94352.)

  • Das Modul os akzeptiert keine bytes-ähnlichen Pfade mehr, wie z.B. bytearray und memoryview-Typen: nur der exakte bytes-Typ wird für Bytes-Strings akzeptiert. (Beigetragen von Victor Stinner in gh-98393.)

  • syslog.openlog() und syslog.closelog() schlagen nun fehl, wenn sie in Subinterpretern verwendet werden. syslog.syslog() kann weiterhin in Subinterpretern verwendet werden, aber nur, wenn syslog.openlog() bereits im Hauptinterpreter aufgerufen wurde. Diese neuen Einschränkungen gelten nicht für den Hauptinterpreter, daher sind nur sehr wenige Benutzer betroffen. Diese Änderung hilft bei der Interpreterisolierung. Darüber hinaus ist syslog ein Wrapper um prozessweite globale Ressourcen, die am besten vom Hauptinterpreter aus verwaltet werden. (Beigetragen von Donghee Na in gh-99127.)

  • Das undokumentierte Sperrverhalten von cached_property() wurde entfernt, da es über alle Instanzen der Klasse gesperrt hat, was zu hoher Sperrkonkurrenz führte. Dies bedeutet, dass eine Getter-Funktion für eine Cache-Eigenschaft nun mehr als einmal für eine einzelne Instanz ausgeführt werden könnte, wenn zwei Threads konkurrieren. Für die meisten einfachen Cache-Eigenschaften (z.B. solche, die idempotent sind und einfach einen Wert basierend auf anderen Attributen der Instanz berechnen) wird dies in Ordnung sein. Wenn Synchronisation erforderlich ist, implementieren Sie die Sperrung innerhalb der Getter-Funktion der Cache-Eigenschaft oder um Multi-Thread-Zugriffspunkte.

  • `sys._current_exceptions()` gibt nun eine Zuordnung von Thread-IDs zu Ausnahmeinstanzen zurück, anstatt zu einem Tupel `(typ, exc, tb)`.

  • Beim Extrahieren von Tar-Dateien mit tarfile oder shutil.unpack_archive() übergeben Sie das Argument filter, um Funktionen zu begrenzen, die überraschend oder gefährlich sein können. Einzelheiten finden Sie unter Extraktionsfilter.

  • Die Ausgabe der Funktionen tokenize.tokenize() und tokenize.generate_tokens() wurde aufgrund der Änderungen in PEP 701 geändert. Das bedeutet, dass STRING-Token für f-Strings nicht mehr ausgegeben werden und die in PEP 701 beschriebenen Token nun stattdessen erzeugt werden: FSTRING_START, FSTRING_MIDDLE und FSTRING_END werden nun für f-String "String"-Teile zusätzlich zu den entsprechenden Token für die Tokenisierung in den Ausdruckskomponenten ausgegeben. Zum Beispiel für den f-String f"start {1+1} end" gab die alte Version des Tokenizers aus

    1,0-1,18:           STRING         'f"start {1+1} end"'
    

    während die neue Version ausgibt

    1,0-1,2:            FSTRING_START  'f"'
    1,2-1,8:            FSTRING_MIDDLE 'start '
    1,8-1,9:            OP             '{'
    1,9-1,10:           NUMBER         '1'
    1,10-1,11:          OP             '+'
    1,11-1,12:          NUMBER         '1'
    1,12-1,13:          OP             '}'
    1,13-1,17:          FSTRING_MIDDLE ' end'
    1,17-1,18:          FSTRING_END    '"'
    

    Zusätzlich kann es zu geringfügigen Verhaltensänderungen kommen, die sich aus den für die Unterstützung von PEP 701 erforderlichen Änderungen ergeben. Einige dieser Änderungen umfassen:

    • Das Attribut type der beim Tokenisieren einiger ungültiger Python-Zeichen wie ! emittierten Tokens hat sich von ERRORTOKEN zu OP geändert.

    • Unvollständige einzeilige Strings lösen nun ebenfalls eine tokenize.TokenError aus, so wie es auch unvollständige mehrzeilige Strings tun.

    • Einige unvollständige oder ungültige Python-Code lösen beim Tokenisieren nun eine tokenize.TokenError aus, anstatt beliebige ERRORTOKEN-Tokens zurückzugeben.

    • Die Mischung von Tabs und Leerzeichen zur Einrückung in derselben Datei wird nicht mehr unterstützt und löst eine TabError aus.

  • Das Modul threading erwartet nun, dass das Modul _thread ein Attribut _is_main_interpreter besitzt. Dies ist eine Funktion ohne Argumente, die True zurückgibt, wenn der aktuelle Interpreter der Hauptinterpreter ist.

    Jede Bibliothek oder Anwendung, die ein benutzerdefiniertes _thread-Modul bereitstellt, sollte _is_main_interpreter() bereitstellen. (Siehe gh-112826.)

Build-Änderungen

  • Python verwendet nicht mehr setup.py, um gemeinsam genutzte C-Erweiterungsmodule zu erstellen. Build-Parameter wie Header und Bibliotheken werden im configure-Skript erkannt. Erweiterungen werden von Makefile erstellt. Die meisten Erweiterungen verwenden pkg-config und greifen auf manuelle Erkennung zurück. (Beigetragen von Christian Heimes in gh-93939.)

  • va_start() mit zwei Parametern, wie va_start(args, format), wird nun zum Erstellen von Python benötigt. va_start() wird nicht mehr mit einem einzelnen Parameter aufgerufen. (Beigetragen von Kumar Aditya in gh-93207.)

  • CPython verwendet nun die ThinLTO-Option als Standard-Richtlinie für die Link-Time-Optimierung, wenn der Clang-Compiler das Flag akzeptiert. (Beigetragen von Donghee Na in gh-89536.)

  • Hinzufügen der Variable COMPILEALL_OPTS in Makefile, um die compileall-Optionen (Standard: -j0) bei make install zu überschreiben. Außerdem wurden die 3 compileall-Befehle zu einem einzigen Befehl zusammengeführt, um .pyc-Dateien für alle Optimierungsstufen (0, 1, 2) auf einmal zu erstellen. (Beigetragen von Victor Stinner in gh-99289.)

  • Hinzufügen von Plattform-Triplets für 64-Bit LoongArch

    • loongarch64-linux-gnusf

    • loongarch64-linux-gnuf32

    • loongarch64-linux-gnu

    (Beigetragen von Zhang Na in gh-90656.)

  • PYTHON_FOR_REGEN erfordert nun Python 3.10 oder neuer.

  • Autoconf 2.71 und aclocal 1.16.4 sind nun erforderlich, um configure neu zu generieren. (Beigetragen von Christian Heimes in gh-89886.)

  • Windows-Builds und macOS-Installer von python.org verwenden nun OpenSSL 3.0.

C-API-Änderungen

Neue Funktionen

  • PEP 697: Einführung der Unstable C API-Ebene, die für Low-Level-Tools wie Debugger und JIT-Compiler gedacht ist. Diese API kann sich in jeder kleineren Version von CPython ohne Warnungen zur Deprekation ändern. Ihr Inhalt ist durch das Präfix PyUnstable_ in den Namen gekennzeichnet.

    Konstruktoren für Code-Objekte

    • PyUnstable_Code_New() (umbenannt von PyCode_New)

    • PyUnstable_Code_NewWithPosOnlyArgs() (umbenannt von PyCode_NewWithPosOnlyArgs)

    Zusätzlicher Speicher für Code-Objekte (PEP 523)

    • PyUnstable_Eval_RequestCodeExtraIndex() (umbenannt von _PyEval_RequestCodeExtraIndex)

    • PyUnstable_Code_GetExtra() (umbenannt von _PyCode_GetExtra)

    • PyUnstable_Code_SetExtra() (umbenannt von _PyCode_SetExtra)

    Die ursprünglichen Namen bleiben bis zur Änderung der jeweiligen API verfügbar.

    (Beigetragen von Petr Viktorin in gh-101101.)

  • PEP 697: Hinzufügen einer API zum Erweitern von Typen, deren Instanzspeicherlayout opak ist

    (Beigetragen von Petr Viktorin in gh-103509.)

  • Hinzufügen der neuen Funktion PyType_FromMetaclass() zur begrenzten C API, die PyType_FromModuleAndSpec() mit einem zusätzlichen Metaklassen-Argument verallgemeinert. (Beigetragen von Wenzel Jakob in gh-93012.)

  • API zum Erstellen von Objekten, die mittels vectorcall-Protokoll aufgerufen werden können, wurde zur Limited API hinzugefügt

    Das Flag Py_TPFLAGS_HAVE_VECTORCALL wird nun aus einer Klasse entfernt, wenn die __call__()-Methode der Klasse neu zugewiesen wird. Dies macht die Verwendung von vectorcall sicher für veränderliche Typen (d. h. Heap-Typen ohne immutable-Flag, Py_TPFLAGS_IMMUTABLETYPE). Veränderliche Typen, die tp_call nicht überschreiben, erben nun das Flag Py_TPFLAGS_HAVE_VECTORCALL. (Beigetragen von Petr Viktorin in gh-93274.)

    Die Flags Py_TPFLAGS_MANAGED_DICT und Py_TPFLAGS_MANAGED_WEAKREF wurden hinzugefügt. Dies ermöglicht Erweiterungsklassen, Objekt-__dict__ und Weakrefs mit weniger Verwaltungsaufwand, geringerem Speicherverbrauch und schnellerem Zugriff zu unterstützen.

  • API für Aufrufe mittels vectorcall-Protokoll wurde zur Limited API hinzugefügt

    Dies bedeutet, dass sowohl die eingehenden als auch die ausgehenden Enden des Vektoraufrufprotokolls nun in der Limited API verfügbar sind. (Beigetragen von Wenzel Jakob in gh-98586.)

  • Hinzufügen von zwei neuen öffentlichen Funktionen, PyEval_SetProfileAllThreads() und PyEval_SetTraceAllThreads(), die es ermöglichen, Tracing- und Profiling-Funktionen in allen laufenden Threads zusätzlich zum aufrufenden Thread festzulegen. (Beigetragen von Pablo Galindo in gh-93503.)

  • Hinzufügen der neuen Funktion PyFunction_SetVectorcall() zur C API, die das Vectorcall-Feld eines gegebenen PyFunctionObject setzt. (Beigetragen von Andrew Frost in gh-92257.)

  • Die C API erlaubt nun die Registrierung von Callbacks über PyDict_AddWatcher(), PyDict_Watch() und verwandte APIs, die aufgerufen werden, wenn ein Dictionary geändert wird. Dies ist für optimierende Interpreter, JIT-Compiler oder Debugger gedacht. (Beigetragen von Carl Meyer in gh-91052.)

  • Hinzufügen der API PyType_AddWatcher() und PyType_Watch(), um Callbacks zur Benachrichtigung über Änderungen an einem Typ zu registrieren. (Beigetragen von Carl Meyer in gh-91051.)

  • Hinzufügen der APIs PyCode_AddWatcher() und PyCode_ClearWatcher(), um Callbacks zur Benachrichtigung über Erstellung und Zerstörung von Code-Objekten zu registrieren. (Beigetragen von Itamar Oren in gh-91054.)

  • Hinzufügen der Funktionen PyFrame_GetVar() und PyFrame_GetVarString(), um eine Frame-Variable anhand ihres Namens abzurufen. (Beigetragen von Victor Stinner in gh-91248.)

  • Hinzufügen von PyErr_GetRaisedException() und PyErr_SetRaisedException() zum Speichern und Wiederherstellen der aktuellen Ausnahme. Diese Funktionen geben ein einzelnes Ausnahmeobjekt zurück und akzeptieren es, anstatt der drei Argumente von den nun veralteten Funktionen PyErr_Fetch() und PyErr_Restore(). Dies ist fehlerunanfälliger und etwas effizienter. (Beigetragen von Mark Shannon in gh-101578.)

  • Hinzufügen von _PyErr_ChainExceptions1, das eine Ausnahmeinstanz annimmt, um die Legacy-API _PyErr_ChainExceptions zu ersetzen, die nun veraltet ist. (Beigetragen von Mark Shannon in gh-101578.)

  • Hinzufügen von PyException_GetArgs() und PyException_SetArgs() als Komfortfunktionen zum Abrufen und Ändern der an den Konstruktor der Ausnahme übergebenen args. (Beigetragen von Mark Shannon in gh-101578.)

  • Hinzufügen von PyErr_DisplayException(), das eine Ausnahmeinstanz annimmt, um die Legacy-API PyErr_Display() zu ersetzen. (Beigetragen von Irit Katriel in gh-102755).

  • PEP 683: Einführung von *unsterblichen Objekten*, die es Objekten ermöglichen, Referenzzählungen zu umgehen, und damit verbundene Änderungen an der C-API

    • _Py_IMMORTAL_REFCNT: Die Referenzzählung, die ein Objekt als

      unsterblich definiert.

    • _Py_IsImmortal Prüft, ob ein Objekt die unsterbliche Referenzzählung hat.

    • PyObject_HEAD_INIT Dies initialisiert nun die Referenzzählung mit

      _Py_IMMORTAL_REFCNT, wenn es mit Py_BUILD_CORE verwendet wird.

    • SSTATE_INTERNED_IMMORTAL Ein Bezeichner für internierte Unicode-Objekte,

      die unsterblich sind.

    • SSTATE_INTERNED_IMMORTAL_STATIC Ein Bezeichner für internierte Unicode-

      Objekte, die unsterblich und statisch sind.

    • sys.getunicodeinternedsize Dies gibt die Gesamtzahl der internierte Unicode-

      Objekte zurück. Dies ist nun für refleak.py erforderlich, um Referenzzählungen und zugewiesene Blöcke korrekt zu verfolgen.

    (Beigetragen von Eddie Elizondo in gh-84436.)

  • PEP 684: Hinzufügen der neuen Funktion Py_NewInterpreterFromConfig() und PyInterpreterConfig, die zum Erstellen von Subinterpretern mit eigenen GILs verwendet werden können. (Weitere Informationen siehe PEP 684: Ein GIL pro Interpreter.) (Beigetragen von Eric Snow in gh-104110.)

  • In der begrenzten C API-Version 3.12 werden die Funktionen Py_INCREF() und Py_DECREF() nun als undurchsichtige Funktionsaufrufe implementiert, um Implementierungsdetails zu verbergen. (Beigetragen von Victor Stinner in gh-105387.)

Portierung auf Python 3.12

  • Legacy-Unicode-APIs, die auf Py_UNICODE*-Darstellung basieren, wurden entfernt. Bitte migrieren Sie zu APIs, die auf UTF-8 oder wchar_t* basieren.

  • Argument-Parsing-Funktionen wie PyArg_ParseTuple() unterstützen keine Py_UNICODE*-basierten Formate mehr (z. B. u, Z). Bitte migrieren Sie zu anderen Formaten für Unicode wie s, z, es und U.

  • tp_weaklist für alle statischen Builtin-Typen ist immer NULL. Dies ist ein nur intern verwendetes Feld in PyTypeObject, aber wir weisen darauf hin, falls jemand zufällig direkt auf das Feld zugreift. Um Fehler zu vermeiden, verwenden Sie stattdessen die vorhandene öffentliche C-API oder, falls notwendig, das (nur intern verwendete) Makro _PyObject_GET_WEAKREFS_LISTPTR().

  • Dieses nur intern verwendete PyTypeObject.tp_subclasses ist möglicherweise kein gültiger Objektzeiger mehr. Sein Typ wurde in void* geändert, um dies widerzuspiegeln. Wir erwähnen dies für den Fall, dass jemand zufällig direkt auf das nur intern verwendete Feld zugreift.

    Um eine Liste von Unterklassen zu erhalten, rufen Sie die Python-Methode __subclasses__() auf (z. B. mittels PyObject_CallMethod()).

  • Unterstützung für weitere Formatierungsoptionen (linksbündige Ausrichtung, Oktalzahlen, Großbuchstaben-Hexadezimalzahlen, intmax_t, ptrdiff_t, wchar_t C-Strings, variable Breite und Genauigkeit) in PyUnicode_FromFormat() und PyUnicode_FromFormatV() hinzugefügt. (Beigetragen von Serhiy Storchaka in gh-98836.)

  • Ein nicht erkannter Formatierungszeichen in PyUnicode_FromFormat() und PyUnicode_FromFormatV() setzt nun eine SystemError. In früheren Versionen wurde der Rest des Formatstrings unverändert in den Ergebnisstring kopiert und zusätzliche Argumente verworfen. (Beigetragen von Serhiy Storchaka in gh-95781.)

  • Behebung der falschen Vorzeichenplatzierung in PyUnicode_FromFormat() und PyUnicode_FromFormatV(). (Beigetragen von Philip Georgi in gh-95504.)

  • Erweiterungsklassen, die einen __dict__- oder Weakref-Slot hinzufügen möchten, sollten stattdessen Py_TPFLAGS_MANAGED_DICT und Py_TPFLAGS_MANAGED_WEAKREF verwenden, anstatt tp_dictoffset und tp_weaklistoffset. Die Verwendung von tp_dictoffset und tp_weaklistoffset wird weiterhin unterstützt, aber nicht die Mehrfachvererbung vollständig (gh-95589) und die Leistung kann schlechter sein. Klassen, die Py_TPFLAGS_MANAGED_DICT deklarieren, müssen _PyObject_VisitManagedDict() und _PyObject_ClearManagedDict() aufrufen, um die Dictionaries ihrer Instanzen zu durchlaufen und zu löschen. Zum Löschen von Weakrefs rufen Sie PyObject_ClearWeakRefs() auf, wie zuvor.

  • Die Funktion PyUnicode_FSDecoder() akzeptiert keine byte-ähnlichen Pfade mehr, wie die Typen bytearray und memoryview: nur der exakte Typ bytes wird für Byte-Strings akzeptiert. (Beigetragen von Victor Stinner in gh-98393.)

  • Die Makros Py_CLEAR, Py_SETREF und Py_XSETREF werten ihre Argumente nun nur noch einmal aus. Wenn ein Argument Nebeneffekte hat, werden diese Nebeneffekte nicht mehr dupliziert. (Beigetragen von Victor Stinner in gh-98724.)

  • Der Fehlerindikator des Interpreters wird nun immer normalisiert. Das bedeutet, dass PyErr_SetObject(), PyErr_SetString() und die anderen Funktionen, die den Fehlerindikator setzen, die Ausnahme nun normalisieren, bevor sie gespeichert wird. (Beigetragen von Mark Shannon in gh-101578.)

  • _Py_RefTotal ist nicht mehr maßgebend und wird nur noch aus ABI-Kompatibilitätsgründen beibehalten. Beachten Sie, dass es sich um eine interne globale Variable handelt und nur in Debug-Builds verfügbar ist. Wenn Sie sie verwenden, müssen Sie nun _Py_GetGlobalRefTotal() verwenden.

  • Die folgenden Funktionen wählen nun eine geeignete Metaklasse für den neu erstellten Typ aus:

    Das Erstellen von Klassen, deren Metaklasse tp_new überschreibt, ist veraltet und wird in Python 3.14+ nicht mehr zugelassen. Beachten Sie, dass diese Funktionen tp_new der Metaklasse ignorieren, was möglicherweise zu einer unvollständigen Initialisierung führt.

    Beachten Sie, dass PyType_FromMetaclass() (eingeführt in Python 3.12) bereits die Erstellung von Klassen verbietet, deren Metaklasse tp_new (__new__() in Python) überschreibt.

    Da tp_new fast alles überschreibt, was die PyType_From*-Funktionen tun, sind die beiden unvereinbar. Das vorhandene Verhalten – das Ignorieren der Metaklasse für mehrere Schritte der Typenerstellung – ist im Allgemeinen unsicher, da (Meta-)Klassen davon ausgehen, dass tp_new aufgerufen wurde. Es gibt keine einfache allgemeine Problemumgehung. Eine der folgenden Optionen könnte für Sie funktionieren:

    • Wenn Sie die Kontrolle über die Metaklasse haben, vermeiden Sie die Verwendung von tp_new darin.

      • Wenn die Initialisierung übersprungen werden kann, kann sie stattdessen in tp_init erfolgen.

      • Wenn die Metaklasse nicht aus Python instanziiert werden muss, setzen Sie deren tp_new auf NULL, indem Sie das Flag Py_TPFLAGS_DISALLOW_INSTANTIATION verwenden. Dies macht sie für PyType_From*-Funktionen akzeptabel.

    • Vermeiden Sie PyType_From*-Funktionen: Wenn Sie keine C-spezifischen Features (Slots oder Festlegen der Instanzgröße) benötigen, erstellen Sie Typen, indem Sie die Metaklasse aufrufen.

    • Wenn Sie *wissen*, dass tp_new sicher übersprungen werden kann, filtern Sie die Deprekationswarnung mit warnings.catch_warnings() aus Python heraus.

  • PyOS_InputHook und PyOS_ReadlineFunctionPointer werden in Subinterpretern nicht mehr aufgerufen. Dies liegt daran, dass Clients im Allgemeinen auf prozessweite globale Zustände angewiesen sind (da diese Callbacks keine Möglichkeit haben, den Zustand von Erweiterungsmodulen wiederherzustellen).

    Dies vermeidet auch Situationen, in denen Erweiterungen sich in einem Subinterpreter wiederfinden, den sie nicht unterstützen (oder in dem sie noch nicht geladen wurden). Siehe gh-104668 für weitere Informationen.

  • Internals von PyLongObject wurden zur Leistungsverbesserung geändert. Obwohl die Internals von PyLongObject privat sind, werden sie von einigen Erweiterungsmodulen verwendet. Die internen Felder sollten nicht mehr direkt angesprochen werden, stattdessen sollten die API-Funktionen mit PyLong_... beginnen. Zwei neue *instabile* API-Funktionen werden für den effizienten Zugriff auf den Wert von PyLongObjects bereitgestellt, die in ein einziges Maschinenwort passen

  • Benutzerdefinierte Allozatoren, die über PyMem_SetAllocator() gesetzt werden, müssen nun threadsicher sein, unabhängig von der Speicherdomäne. Allozatoren, die keinen eigenen Zustand haben, einschließlich "Hooks", sind davon nicht betroffen. Wenn Ihr benutzerdefinierter Allozator noch nicht threadsicher ist und Sie Anleitung benötigen, erstellen Sie bitte ein neues GitHub-Issue und CC @ericsnowcurrently.

Veraltet

Zur Entfernung in Python 3.14 vorgemerkt

Zur Entfernung in Python 3.15 vorgemerkt

Zur Entfernung in Python 3.16 vorgemerkt

  • Die gebündelte Kopie von libmpdec.

Zur Entfernung in zukünftigen Versionen vorgemerkt

Die folgenden APIs sind veraltet und werden entfernt, obwohl derzeit kein Termin für ihre Entfernung geplant ist.

Entfernt

  • Entfernen Sie die Headerdatei token.h. Es gab nie eine öffentliche Tokenizer-C-API. Die Headerdatei token.h war nur für die interne Verwendung von Python bestimmt. (Beigetragen von Victor Stinner in gh-92651.)

  • Veraltete Unicode-APIs wurden entfernt. Details finden Sie in PEP 623.

    • PyUnicode_WCHAR_KIND

    • PyUnicode_AS_UNICODE()

    • PyUnicode_AsUnicode()

    • PyUnicode_AsUnicodeAndSize()

    • PyUnicode_AS_DATA()

    • PyUnicode_FromUnicode()

    • PyUnicode_GET_SIZE()

    • PyUnicode_GetSize()

    • PyUnicode_GET_DATA_SIZE()

  • Entfernen Sie das Makro PyUnicode_InternImmortal(). (Beigetragen von Victor Stinner in gh-85858.)