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:

  • PEP 695, Syntax für Typparameter und die Anweisung type

Neue Grammatik-Features:

Verbesserungen am Interpreter:

Verbesserungen am Python-Datenmodell:

Wesentliche Verbesserungen in der Standardbibliothek:

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 perf

  • Schutz gegen Stapelüberläufe auf den unterstützten Plattformen umgesetzt

Neue Typisierungsfunktionen:

Wichtige Markierungen als veraltet, Entfernungen oder Einschränkungen:

  • PEP 623: wstr ist aus den Unicode-Objekten in der C-API von Python entfernt, wodurch jedes str-Objekt mindestens 8 Byte kleiner wird.

  • PEP 632: Das Paket distutils ist entfernt. Hinweise, womit sich die bereitgestellten APIs ersetzen lassen, stehen in der Umstiegsanleitung. Das Paket Setuptools von Dritten stellt distutils weiterhin bereit, falls du es in Python 3.12 und darüber hinaus noch brauchst.

  • gh-95299: setuptools wird in virtuellen Umgebungen, die mit venv erzeugt werden, nicht mehr vorinstalliert. Das heißt, dass distutils, setuptools, pkg_resources und easy_install nicht mehr von sich aus verfügbar sind. Um sie zu erhalten, führe pip install setuptools in der aktivierten virtuellen Umgebung aus.

  • Die Module asynchat, asyncore und imp sind entfernt, ebenso mehrere Methoden-Aliase von unittest.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 SyntaxError aus, 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 symtable erzeugt 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 .0 fü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 bei for 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 NameError bis 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 ein NameError ausgelöst und hat die Instanz ein Attribut, das genau dem Namen in der Ausnahme entspricht, enthält der Vorschlag self.<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 jemand import x from y statt from y import x schreibt. (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 fehlgeschlagenen from <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 SyntaxError aus, 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 SyntaxWarning statt einer DeprecationWarning. re.compile("\d+\.\d+") gibt zum Beispiel jetzt eine SyntaxWarning aus ("\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 ein SyntaxError statt einer SyntaxWarning ausgelö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 eine SyntaxWarning statt einer DeprecationWarning. In einer künftigen Python-Version werden sie schließlich ein SyntaxError. (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 an b zum Beispiel jetzt erlaubt. Beachte, dass die Zuweisung an Variablen, die im Zielteil von Comprehensions beschrieben werden (wie a), 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 einen RuntimeError eingehü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 gesamte ExceptionGroup und löst eine andere Ausnahme aus, wird diese Ausnahme nicht mehr in eine ExceptionGroup eingehü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 bool und int. (Beigetragen von Serhiy Storchaka in gh-60203.)

  • memoryview unterstü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 einen SyntaxError statt eines ValueError aus, wenn Quelltext ausgewertet wird, der Nullbytes enthält. (Beigetragen von Pablo Galindo in gh-96670.)

  • Die Methoden zum Entpacken in tarfile und shutil.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 PYTHONPERFSUPPORT und die Befehlszeilenoption -X perf sowie über die neuen Funktionen sys.activate_stack_trampoline(), sys.deactivate_stack_trampoline() und sys.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

asyncio

  • Das Schreiben auf Sockets in asyncio ist deutlich schneller geworden. asyncio vermeidet beim Schreiben auf Sockets jetzt unnötige Kopien und verwendet sendmsg(), sofern die Plattform es unterstützt. (Beigetragen von Kumar Aditya in gh-91166.)

  • Die Funktionen asyncio.eager_task_factory() und asyncio.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 asyncio von sich aus asyncio.PidfdChildWatcher statt asyncio.ThreadedChildWatcher, sofern os.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, sonst asyncio.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 jetzt False zurück, denn asyncio unterstützt die alten generatorbasierten Coroutinen nicht. (Beigetragen von Kumar Aditya in gh-102748.)

  • asyncio.wait() und asyncio.as_completed() nehmen jetzt Generatoren an, die Aufträge liefern. (Beigetragen von Kumar Aditya in gh-78530.)

Kalender

  • Die Aufzählungen calendar.Month und calendar.Day sind hinzugekommen. Sie legen die Monate des Jahres und die Tage der Woche fest. (Beigetragen von Prince Roshan in gh-103636.)

csv

dis

  • Die Opcodes der Pseudo-Anweisungen (die der Compiler verwendet, die aber im ausführbaren Bytecode nicht vorkommen) sind jetzt im Modul dis zugänglich. HAVE_ARGUMENT gilt weiterhin für echte Opcodes, ist für Pseudo-Anweisungen aber nicht brauchbar. Verwende stattdessen die neue Sammlung dis.hasarg. (Beigetragen von Irit Katriel in gh-94216.)

  • Die Sammlung dis.hasexc ist hinzugekommen, um Anweisungen zu kennzeichnen, die einen Ausnahmebehandler setzen. (Beigetragen von Irit Katriel in gh-94216.)

fractions

  • Objekte vom Typ fractions.Fraction unterstützen jetzt die Formatierung im Stil von Gleitkommazahlen. (Beigetragen von Mark Dickinson in gh-100161.)

importlib.resources

inspect

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_NONBLOCK ist hinzugekommen, um mit os.pidfd_open() einen Dateideskriptor für einen Prozess im nicht blockierenden Modus zu öffnen. (Beigetragen von Kumar Aditya in gh-93312.)

  • os.DirEntry hat jetzt eine Methode os.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() und os.listmounts() sind unter Windows hinzugekommen, um Laufwerke, Datenträger und Einhängepunkte aufzuzählen. (Beigetragen von Steve Dower in gh-102519.)

  • os.stat() und os.lstat() arbeiten unter Windows jetzt genauer. Das Feld st_birthtime enthält jetzt die Erstellungszeit der Datei, und st_ctime ist 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_dev darf je nach Dateisystem bis zu 64 Bit und st_ino bis zu 128 Bit lang sein, und st_rdev wird 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

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-10 zurü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

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 Windows NeedCurrentDirectoryForExePathW auf, 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 aus PATHEXT passt, bevor eine unmittelbare Übereinstimmung an anderer Stelle im Suchpfad herangezogen wird. (Beigetragen von Charles Machalow in gh-103179.)

sqlite3

statistics

  • statistics.correlation() ist um eine Methode ranked erweitert, um die Spearman-Korrelation rangskalierter Daten zu berechnen. (Beigetragen von Raymond Hettinger in gh-95861.)

sys

tempfile

  • Die Funktion tempfile.NamedTemporaryFile hat 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

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 die create_*()-Methoden. (Beigetragen von Serhiy Storchaka in gh-94473.)

tokenize

types

typing

  • Prüfungen mit isinstance() gegen zur Laufzeit prüfbare Protokolle verwenden jetzt inspect.getattr_static() statt hasattr(), um nachzusehen, ob Attribute vorhanden sind. Das heißt, dass Deskriptoren und __getattr__()-Methoden bei isinstance()-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 gegen zur Laufzeit prüfbare Protokolle hat sich deutlich geändert. Die meisten isinstance()-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- und typing.NamedTuple-Klassen haben jetzt das Attribut __orig_bases__. (Beigetragen von Adrian Garcia Badaracco in gh-103699.)

  • Der Parameter frozen_default ist zu @typing.dataclass_transform hinzugekommen. (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

Optimierungen

  • Die Elemente wstr und wstr_length sind 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() und re.subn() sowie die entsprechenden Methoden von re.Pattern) ist bei Ersetzungszeichenketten mit Gruppenverweisen zwei- bis dreimal schneller. (Beigetragen von Serhiy Storchaka in gh-91524.)

  • Das Erzeugen von asyncio.Task ist schneller, weil aufwendige Zeichenkettenformatierung aufgeschoben wird. (Beigetragen von Itamar Oren in gh-103793.)

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

  • super()-Methodenaufrufe und Attributzugriffe sind über die neue Anweisung LOAD_SUPER_ATTR schneller. (Beigetragen von Carl Meyer und Vladimir Matveev in gh-103497.)

CPython Bytecode Änderungen

  • Die Anweisung LOAD_METHOD ist entfernt. Sie ist in LOAD_ATTR aufgegangen. LOAD_ATTR verhält sich jetzt wie die alte Anweisung LOAD_METHOD, wenn das niedrigste Bit seines Opargs gesetzt ist. (Beigetragen von Ken Jin in gh-93429.)

  • Die Anweisungen JUMP_IF_FALSE_OR_POP und JUMP_IF_TRUE_OR_POP sind entfernt. (Beigetragen von Irit Katriel in gh-102859.)

  • Die Anweisung PRECALL ist entfernt. (Beigetragen von Mark Shannon in gh-92925.)

  • Die Anweisungen BINARY_SLICE und STORE_SLICE sind hinzugekommen. (Beigetragen von Mark Shannon in gh-94163.)

  • Die Anweisungen CALL_INTRINSIC_1 sind hinzugekommen. (Beigetragen von Mark Shannon in gh-99005.)

  • Die Anweisung CALL_INTRINSIC_2 ist hinzugekommen. (Beigetragen von Irit Katriel in gh-101799.)

  • Die Anweisung CLEANUP_THROW ist hinzugekommen. (Beigetragen von Brandt Bucher in gh-90997.)

  • Die Anweisung END_SEND ist hinzugekommen. (Beigetragen von Mark Shannon in gh-103082.)

  • Die Anweisung LOAD_FAST_AND_CLEAR ist als Teil der Umsetzung von PEP 709 hinzugekommen. (Beigetragen von Carl Meyer in gh-101441.)

  • Die Anweisung LOAD_FAST_CHECK ist hinzugekommen. (Beigetragen von Dennis Sweeney in gh-93143.)

  • Die Opcodes LOAD_FROM_DICT_OR_DEREF, LOAD_FROM_DICT_OR_GLOBALS und LOAD_LOCALS sind als Teil der Umsetzung von PEP 695 hinzugekommen. Der Opcode LOAD_CLASSDEREF ist entfernt. Er lässt sich durch LOAD_LOCALS plus LOAD_FROM_DICT_OR_DEREF ersetzen. (Beigetragen von Jelle Zijlstra in gh-103764.)

  • Die Anweisung LOAD_SUPER_ATTR ist hinzugekommen. (Beigetragen von Carl Meyer und Vladimir Matveev in gh-103497.)

  • Die Anweisung RETURN_CONST ist 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 von argparse.BooleanOptionalAction sind veraltet und werden in Version 3.14 entfernt. (Beitrag von Nikita Sobolev unter gh-92248.)

  • ast: Die folgenden ast-Features waren in der Dokumentation seit Python 3.8 als veraltet markiert, lösen beim Zugriff oder bei der Verwendung jetzt zur Laufzeit eine DeprecationWarning aus und werden in Python 3.14 entfernt:

    • ast.Num

    • ast.Str

    • ast.Bytes

    • ast.NameConstant

    • ast.Ellipsis

    Verwende stattdessen ast.Constant. (Beigetragen von Serhiy Storchaka in gh-90953.)

  • asyncio:

    • Die „Child-Watcher“-Klassen asyncio.MultiLoopChildWatcher, asyncio.FastChildWatcher, asyncio.AbstractChildWatcher und asyncio.SafeChildWatcher sind 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() und asyncio.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 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 als veraltet markiert.

    Verwende isinstance(obj, collections.abc.Buffer), um zur Laufzeit zu prüfen, ob obj das Buffer-Protokoll implementiert. Für Typannotationen verwende entweder Buffer oder eine Union, die explizit die von deinem Code unterstützten Typen angibt (z. B. bytes | bytearray | memoryview).

    ByteString war ursprünglich als abstrakte Klasse gedacht, die als Obertyp sowohl von bytes als auch von bytearray dienen sollte. Da die ABC jedoch nie Methoden hatte, sagte das Wissen, dass ein Objekt eine Instanz von ByteString ist, nie etwas Nützliches über das Objekt aus. Andere gängige Puffertypen wie memoryview wurden ebenfalls nie als Untertypen von ByteString verstanden (weder zur Laufzeit noch von statischen Typprüfern).

    Weitere Details findest du in PEP 688. (Beigetragen von Shantanu Jain in gh-91896.)

  • datetime: Die Methoden utcnow() und utcfromtimestamp() von datetime.datetime sind als veraltet markiert und werden in einer künftigen Version entfernt. Verwende stattdessen zeitzonenbewusste Objekte, um Zeitpunkte in UTC darzustellen: rufe also now() beziehungsweise fromtimestamp() mit dem Parameter tz auf datetime.UTC gesetzt auf. (Beigetragen von Paul Ganssle in gh-103857.)

  • email: Der Parameter isdst in email.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.ResourceReader

    • importlib.abc.Traversable

    • importlib.abc.TraversableResources

    Verwende stattdessen importlib.resources.abc Klassen:

    (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 von multiprocessing unter 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 APIs get_context() oder set_start_method(), um ausdrücklich anzugeben, wann dein Code 'fork' benötigt. Siehe Kontexte und Startmethoden.

  • pkgutil: pkgutil.find_loader() und pkgutil.get_loader() sind als veraltet markiert und werden in Python 3.14 entfernt. Verwende stattdessen importlib.util.find_spec(). (Beigetragen von Nikita Sobolev in gh-97850.)

  • pty: Das Modul hat zwei nicht dokumentierte Funktionen master_open() und slave_open(), die seit Python 2 als veraltet gelten, aber erst in 3.12 eine richtige DeprecationWarning bekommen haben. Entfernt werden sie in 3.14. (Beigetragen von Soumendra Ganguly und Gregory P. Smith in gh-85984.)

  • os:

    • Die Felder st_ctime, die os.stat() und os.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 Feld st_birthtime steht. (Beigetragen von Steve Dower in gh-99726.)

    • Auf POSIX-Plattformen kann os.fork() jetzt eine DeprecationWarning auslö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 zu os.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 multiprocessing oder concurrent.futures, besteht die Lösung darin, eine andere Startmethode von multiprocessing zu verwenden, etwa "spawn" oder "forkserver".

  • shutil: Das Argument onerror von shutil.rmtree() ist als veraltet markiert. Verwende stattdessen onexc. (Beigetragen von Irit Katriel in gh-102828.)

  • sqlite3

  • sys: Die Felder sys.last_type, sys.last_value und sys.last_traceback sind als veraltet markiert. Verwende stattdessen sys.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:

  • xml.etree.ElementTree: Das Modul gibt jetzt eine DeprecationWarning aus, wenn der Wahrheitswert eines xml.etree.ElementTree.Element geprüft wird. Vorher gab die Python-Umsetzung eine FutureWarning aus 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() und async 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 DeprecationWarning wird jetzt ausgelöst, wenn __package__ an einem Modul von __spec__.parent abweicht (vorher war es eine ImportWarning). (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 stattdessen not. In dem seltenen Fall, dass du wirklich die bitweise Inversion des zugrunde liegenden int brauchst, wandle ausdrücklich in int um: ~int(x). (Beigetragen von Tim Hoffmann in gh-103487.)

  • Der Zugriff auf codeobject.co_lnotab an Codeobjekten wurde in Python 3.10 mit PEP 626 als veraltet markiert, bekam aber erst in 3.12 eine richtige DeprecationWarning. Entfernt werden kann er in 3.15. (Beigetragen von Nikita Sobolev in gh-101866.)

Geplante Entfernung in Python 3.13

Module (siehe PEP 594):

  • aifc

  • audioop

  • cgi

  • cgitb

  • chunk

  • crypt

  • imghdr

  • mailcap

  • msilib

  • nis

  • nntplib

  • ossaudiodev

  • pipes

  • sndhdr

  • spwd

  • sunau

  • telnetlib

  • uu

  • xdrlib

Weitere Module:

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

APIs:

Geplante Entfernung in Python 3.14

  • argparse: Die Parameter type, choices und metavar von argparse.BooleanOptionalAction sind 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.Num

    • ast.Str

    • ast.Bytes

    • ast.NameConstant

    • ast.Ellipsis

    Verwende stattdessen ast.Constant. (Beigetragen von Serhiy Storchaka in gh-90953.)

  • asyncio:

    • Die „Child-Watcher“-Klassen asyncio.MultiLoopChildWatcher, asyncio.FastChildWatcher, asyncio.AbstractChildWatcher und asyncio.SafeChildWatcher sind 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() und asyncio.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 in email.utils.localtime() wurde als veraltet markiert. (Beitrag von Alan Williams unter gh-72346.)

  • importlib.abc veraltete Klassen:

    • importlib.abc.ResourceReader

    • importlib.abc.Traversable

    • importlib.abc.TraversableResources

    Verwende stattdessen importlib.resources.abc Klassen:

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

  • itertools boten 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() und relative_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:

  • sqlite3

  • 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__.cached zu 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__.parent zu 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)

  • ctypes:

    • Die nicht dokumentierte Funktion ctypes.SetPointerType() ist seit Python 3.13 als veraltet markiert.

  • http.server:

    • Die überholte und selten verwendete Klasse CGIHTTPRequestHandler ist 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 --cgi der Befehlszeilenschnittstelle python -m http.server ist seit Python 3.13 als veraltet markiert.

  • importlib:

    • Methode load_module(): verwende stattdessen exec_module().

  • pathlib:

    • .PurePath.is_reserved() ist seit Python 3.13 als veraltet markiert. Verwende os.path.isreserved(), um unter Windows vorbehaltene Pfade zu erkennen.

  • platform:

    • 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.

  • sysconfig:

  • threading:

    • 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:

    • types.CodeType: Der Zugriff auf codeobject.co_lnotab wurde in PEP 626 seit 3.10 als veraltet markiert und sollte in 3.12 entfernt werden, bekam dort aber erst eine richtige DeprecationWarning. Entfernt werden kann er in 3.15. (Beigetragen von Nikita Sobolev in gh-101866.)

  • typing:

    • Die nicht dokumentierte Schreibweise mit Schlüsselwortargumenten, um NamedTuple-Klassen zu erzeugen (zum Beispiel Point = 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")) oder None zu übergeben (TD = TypedDict("TD", None)). Verwende class TD(TypedDict): pass oder TD = TypedDict("TD", {}), um ein TypedDict ohne Felder zu erzeugen.

    • Die Dekoratorfunktion @typing.no_type_check_decorator ist seit Python 3.13 als veraltet markiert. Nach acht Jahren im Modul typing wird sie noch von keinem größeren Typprüfer unterstützt.

  • Module sre_compile, sre_constants und sre_parse.

  • wave:

    • Die Methoden getmark(), setmark() und getmarkers() der Klassen Wave_read und Wave_write sind seit Python 3.13 als veraltet markiert.

  • zipimport:

    • zipimport.zipimporter.load_module() ist seit Python 3.10 als veraltet markiert. Verwende stattdessen exec_module(). (gh-125746.)

Geplante Entfernung in Python 3.16

Geplante Entfernung in Python 3.17

  • datetime:

    • 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:

    • collections.abc.ByteString soll in Python 3.17 entfernt werden.

      Verwende isinstance(obj, collections.abc.Buffer), um zur Laufzeit zu prüfen, ob obj das Buffer-Protokoll implementiert. Für Typannotationen verwende entweder Buffer oder eine Union, die explizit die von deinem Code unterstützten Typen angibt (z. B. bytes | bytearray | memoryview).

      ByteString war ursprünglich als abstrakte Klasse gedacht, die als Obertyp sowohl von bytes als auch von bytearray dienen sollte. Da die ABC jedoch nie Methoden hatte, sagte das Wissen, dass ein Objekt eine Instanz von ByteString ist, nie etwas Nützliches über das Objekt aus. Andere gängige Puffertypen wie memoryview wurden ebenfalls nie als Untertypen von ByteString verstanden (weder zur Laufzeit noch von statischen Typprüfern).

      Weitere Details findest du in PEP 688. (Beigetragen von Shantanu Jain in gh-91896.)

  • encodings:

    • 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.)

  • profile:

    • Das Modul profile ist veraltet und wird in Python 3.17 entfernt. Verwende stattdessen profiling.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:

    • webbrowser.MacOSXOSAScript ist zugunsten von webbrowser.MacOS veraltet. (gh-137586)

  • typing:

    • Vor Python 3.14 wurden Unions im alten Stil mit der privaten Klasse typing._UnionGenericAlias implementiert. 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 wie typing.get_origin() und typing.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, ob obj das Buffer-Protokoll implementiert. Für Typannotationen verwende entweder Buffer oder eine Union, die explizit die von deinem Code unterstützten Typen angibt (z. B. bytes | bytearray | memoryview).

      ByteString war ursprünglich als abstrakte Klasse gedacht, die als Obertyp sowohl von bytes als auch von bytearray dienen sollte. Da die ABC jedoch nie Methoden hatte, sagte das Wissen, dass ein Objekt eine Instanz von ByteString ist, nie etwas Nützliches über das Objekt aus. Andere gängige Puffertypen wie memoryview wurden ebenfalls nie als Untertypen von ByteString verstanden (weder zur Laufzeit noch von statischen Typprüfern).

      Weitere Details findest du in PEP 688. (Beigetragen von Shantanu Jain in gh-91896.)

  • tkinter:

    • Bei tkinter.Variable sollen die seit Python 3.14 veralteten Methoden trace_variable(), trace() (ein Alias von trace_variable()), trace_vdelete() und trace_vinfo() in Python 3.17 entfernt werden. Verwende stattdessen trace_add(), trace_remove() und trace_info(). (Beigetragen von Serhiy Storchaka in gh-120220.)

Geplante Entfernung in Python 3.19

  • ctypes:

    • Das implizite Umschalten auf das MSVC-kompatible Struct-Layout, wenn auf Nicht-Windows-Plattformen _pack_, aber nicht _layout_ gesetzt wird.

  • hashlib:

    • Bei Konstruktoren von Hash-Funktionen wie new() oder den direkt nach dem Hash benannten Konstruktoren wie md5() und sha256() konnte dem optionalen Parameter für die Anfangsdaten in verschiedenen Implementierungen von hashlib auch ein Schlüsselwortargument namens data= oder string= übergeben werden.

      Die Unterstützung des Schlüsselwortarguments string ist jetzt veraltet und soll in Python 3.19 entfernt werden.

      Vor Python 3.13 wurde der Schlüsselwortparameter string je 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:

  • imaplib:

    • Das Ändern von IMAP4.file ist 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() und readline() von IMAP4 zu implementieren. Das ist seitdem nicht mehr der Fall.

Geplante Entfernung in Python 3.20

Geplante Entfernung in zukünftigen Versionen

Die folgenden APIs werden in Zukunft entfernt, auch wenn derzeit noch kein Termin für ihre Entfernung feststeht.

  • argparse:

    • 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.FileType ist veraltet.

  • builtins:

    • Generatoren: Die Signatur throw(type, exc, tb) und athrow(type, exc, tb) ist veraltet: Verwende stattdessen throw(exc) und athrow(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örter and, else, for, if, in, is und or folgt. 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 von int zurückgeben.

    • Unterstützung dafür, dass die Methode __float__() eine strikte Unterklasse von float zurückgibt: Diese Methoden müssen künftig eine Instanz von float zurückgeben.

    • Unterstützung dafür, dass die Methode __complex__() eine strikte Unterklasse von complex zurückgibt: Diese Methoden müssen künftig eine Instanz von complex zurü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 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: Verwende open() statt codecs.open(). (gh-133038)

  • codeobject.co_lnotab: Verwende stattdessen die Methode codeobject.co_lines().

  • datetime:

    • utcnow(): Verwende datetime.datetime.now(tz=datetime.UTC).

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

  • gettext: Der Pluralwert muss eine Ganzzahl sein.

  • importlib:

    • cache_from_source(): Der Parameter debug_override ist veraltet: Verwende stattdessen den Parameter optimization.

  • importlib.metadata:

    • Die Tupel-Schnittstelle von EntryPoints.

    • Implizites None bei Rückgabewerten.

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

  • mailbox: Die Verwendung von StringIO-Eingaben und Textmodus ist veraltet, verwende stattdessen BytesIO und Binärmodus.

  • os: Der Aufruf von os.register_at_fork() in einem Prozess mit mehreren Threads.

  • os.path: os.path.commonprefix() ist veraltet, verwende os.path.commonpath() für Pfadpräfixe. Die Funktion os.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 von rmtree() ist seit Python 3.12 veraltet. Verwende stattdessen den Parameter onexc.

  • Optionen und Protokolle von ssl:

    • ssl.SSLContext ohne Protokollargument ist veraltet.

    • ssl.SSLContext: set_npn_protocols() und selected_npn_protocol() sind veraltet: Verwende 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 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 nicht None ist.

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

    • 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 eines Element ist veraltet. In einer künftigen Version wird es immer True zurückgeben. Verwende stattdessen explizite Prüfungen mit len(elem) oder elem is not None.

  • sys._clear_type_cache() ist veraltet: Verwende stattdessen sys._clear_internal_caches().

Entfernt

asynchat und asyncore

  • Diese beiden Module sind nach dem Zeitplan in PEP 594 entfernt. Sie waren in Python 3.6 als veraltet markiert worden. Verwende stattdessen asyncio. (Beigetragen von Nikita Sobolev in gh-96580.)

configparser

distutils

  • Das Paket distutils ist entfernt. Es war in Python 3.10 mit PEP 632 „Deprecate distutils module“ als veraltet markiert worden. Für Projekte, die weiterhin distutils verwenden und nicht auf etwas anderes umgestellt werden können, lässt sich das Projekt setuptools installieren: Es stellt distutils weiterhin bereit. (Beigetragen von Victor Stinner in gh-92584.)

ensurepip

  • Das mitgelieferte setuptools-Wheel ist aus ensurepip entfernt, und setuptools wird in Umgebungen, die mit venv erzeugt werden, nicht mehr installiert.

    pip (>= 22.1) verlangt nicht, dass setuptools in der Umgebung installiert ist. Pakete auf Grundlage von setuptools (und von distutils) lassen sich weiterhin mit pip install verwenden, denn pip stellt setuptools in der Build-Umgebung bereit, die es zum Bauen eines Pakets verwendet.

    easy_install, pkg_resources, setuptools und distutils werden in Umgebungen, die mit venv erzeugt oder mit ensurepip aufgesetzt werden, nicht mehr von sich aus bereitgestellt, denn sie gehören zum Paket setuptools. Projekte, die sich zur Laufzeit darauf verlassen, sollten das Projekt setuptools als Abhängigkeit angeben und es gesondert installieren (üblicherweise mit pip).

    (Beigtragen von Pradyun Gedam in gh-95299.)

enum

  • EnumMeta.__getattr__ ist aus enum entfernt. Es wird für den Zugriff auf Enum-Attribute nicht mehr gebraucht. (Beigetragen von Ethan Furman in gh-95083.)

ftplib

  • Das Klassenattribut FTP_TLS.ssl_version ist aus ftplib entfernt: verwende stattdessen den Parameter context. (Beigetragen von Victor Stinner in gh-94172.)

gzip

  • Das Attribut filename von gzip.GzipFile aus gzip, seit Python 2.6 als veraltet markiert, ist entfernt. Verwende stattdessen das Attribut name. Im Schreibmodus hat das Attribut filename die 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() aus hashlib, 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 von pbkdf2_hmac(), die schneller ist. (Beigetragen von Victor Stinner in gh-94199.)

importlib

  • Viele schon länger als veraltet markierte Aufräumarbeiten in importlib sind 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_loader und importlib.util.module_for_loader sind alle entfernt. (Beigetragen von Brett Cannon und Nikita Sobolev in gh-65961 und gh-97850.)

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

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

imp

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

    Zum Umstieg hilft die folgende Zuordnungstabelle:

    imp

    importlib

    imp.NullImporter

    None in sys.path_importer_cache einfügen

    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

    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

  • io.OpenWrapper und _pyio.OpenWrapper aus io, in Python 3.10 als veraltet markiert, sind entfernt: verwende einfach open(). Die Funktion open() (io.open()) ist eine eingebaute Funktion. Seit Python 3.10 ist _pyio.open() außerdem eine statische Methode. (Beigetragen von Victor Stinner in gh-94169.)

locale

  • Die Funktion locale.format() aus locale, in Python 3.7 als veraltet markiert, ist entfernt: verwende stattdessen locale.format_string(). (Beigetragen von Victor Stinner in gh-94226.)

smtpd

  • Das Modul smtpd ist nach dem Zeitplan in PEP 594 entfernt. Es war in Python 3.4.7 und 3.5.4 als veraltet markiert worden. Verwende stattdessen das PyPI-Modul aiosmtpd oder einen anderen Server auf Grundlage von asyncio. (Beigetragen von Oleg Iarygin in gh-93243.)

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.OptimizedUnicode ist seit Python 3.3 ein anderer Name für str. Code, der die Textfabrik bisher auf OptimizedUnicode gesetzt hat, kann entweder ausdrücklich str verwenden oder sich auf die Voreinstellung verlassen, die ebenfalls str ist.

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

ssl

  • Die Funktion ssl.RAND_pseudo_bytes() aus ssl, in Python 3.6 als veraltet markiert, ist entfernt: verwende stattdessen os.urandom() oder ssl.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 Funktion ssl.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 ein ssl.SSLContext-Objekt und rufe seine Methode ssl.SSLContext.wrap_socket auf. Jedes Paket, das noch ssl.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

webbrowser

  • Die Unterstützung für überholte Browser ist aus webbrowser entfernt. 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 Funktion copy.copy(). Die C-Umsetzung von xml.etree.ElementTree hat keine Methode copy(), nur eine Methode __copy__(). (Beigetragen von Victor Stinner in gh-94383.)

zipimport

  • Die Methoden find_loader() und find_module() aus zipimport, in Python 3.10 als veraltet markiert, sind entfernt: verwende stattdessen die Methode find_spec(). Die Begründung steht in PEP 451. (Beigetragen von Victor Stinner in gh-94379.)

Weiteres

  • Die Regel suspicious ist aus dem Makefile der Dokumentation und aus Doc/tools/rstlint.py entfernt, beides zugunsten von sphinx-lint. (Beigetragen von Julien Palard in gh-98179.)

  • Die Parameter keyfile und certfile sind aus den Modulen ftplib, imaplib, poplib und smtplib entfernt, ebenso die Parameter key_file, cert_file und check_hostname aus dem Modul http.client. Alle waren seit Python 3.6 als veraltet markiert. Verwende stattdessen den Parameter context (ssl_context in imaplib). (Beigetragen von Victor Stinner in gh-94172.)

  • Behelfslösungen für die Verträglichkeit mit Jython sind 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 Modul ctypes entfernt. (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 wurde randrange(10.0) verlustfrei in randrange(10) umgewandelt. Jetzt löst das einen TypeError aus. Außerdem hat sich die Ausnahme für nicht ganzzahlige Werte wie randrange(10.5) oder randrange('10') von ValueError auf TypeError geändert. Das verhindert auch Fehler, bei denen randrange(1e25) stillschweigend aus einem größeren Bereich gewählt hat als randrange(10**25). (Ursprünglich vorgeschlagen von Serhiy Storchaka, gh-86388.)

  • argparse.ArgumentParser hat die Kodierung und die Fehlerbehandlung beim Lesen von Argumenten aus einer Datei (etwa über die Option fromfile_prefix_chars) von der voreingestellten Textkodierung (etwa locale.getpreferredencoding(False)) auf die Dateisystemkodierung und Fehlerbehandlung umgestellt. Argumentdateien sollten unter Windows in UTF-8 statt in der ANSI-Codepage kodiert sein.

  • Das auf asyncore aufbauende Modul smtpd, in Python 3.4.7 und 3.5.4 als veraltet markiert, ist entfernt. Als Ersatz empfohlen wird das auf asyncio aufbauende PyPI-Modul aiosmtpd.

  • shlex.split(): None als Argument s zu übergeben löst jetzt eine Ausnahme aus, statt sys.stdin zu lesen. Das Feature war in Python 3.9 als veraltet markiert worden. (Beigetragen von Victor Stinner in gh-94352.)

  • Das Modul os nimmt keine bytes-ähnlichen Pfade mehr an, etwa die Typen bytearray und memoryview: für Bytezeichenketten wird nur noch genau der Typ bytes angenommen. (Beigetragen von Victor Stinner in gh-98393.)

  • syslog.openlog() und syslog.closelog() scheitern jetzt, wenn sie in Subinterpretern verwendet werden. syslog.syslog() darf in Subinterpretern weiterhin verwendet werden, jetzt aber nur, wenn syslog.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 ist syslog eine 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_property ist 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 tarfile oder shutil.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() und tokenize.generate_tokens() hat sich wegen der Änderungen aus PEP 701 geändert. Das heißt, dass für f-Strings keine STRING-Token mehr ausgegeben werden. Stattdessen entstehen jetzt die in PEP 701 beschriebenen Token: FSTRING_START, FSTRING_MIDDLE und FSTRING_END werden 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-String f"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 type der Token, die beim Tokenisieren einiger ungültiger Python-Zeichen wie ! ausgegeben werden, hat sich von ERRORTOKEN auf OP geändert.

    • Unvollständige einzeilige Zeichenketten lösen jetzt ebenfalls einen tokenize.TokenError aus, wie es unvollständige mehrzeilige Zeichenketten schon tun.

    • Mancher unvollständige oder ungültige Python-Code löst beim Tokenisieren jetzt einen tokenize.TokenError aus, statt beliebige ERRORTOKEN-Token zurückzugeben.

    • Tabulatoren und Leerzeichen in derselben Datei gemischt zur Einrückung zu verwenden wird nicht mehr unterstützt und löst einen TabError aus.

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

    Jede Bibliothek und jede Anwendung, die ein eigenes Modul _thread bereitstellt, 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 Skript configure ermittelt. Erweiterungen werden über das Makefile gebaut. Die meisten Erweiterungen verwenden pkg-config und 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 in va_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_OPTS ist im Makefile hinzugekommen, um die compileall-Optionen (Voreinstellung: -j0) bei make install zu überschreiben. Außerdem sind die drei compileall-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_REGEN erfordert nun Python 3.10 oder neuer.

  • Um configure neu 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 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 Objekt

      als unsterblich kennzeichnet.

    • _Py_IsImmortal prüft, ob ein Objekt den Referenzzähler für Unsterblichkeit hat.

    • PyObject_HEAD_INIT setzt den Referenzzähler jetzt auf

      _Py_IMMORTAL_REFCNT, wenn es mit Py_BUILD_CORE verwendet wird.

    • SSTATE_INTERNED_IMMORTAL eine Kennzeichnung für internierte Unicode-Objekte,

      die unsterblich sind.

    • SSTATE_INTERNED_IMMORTAL_STATIC eine Kennzeichnung für internierte

      Unicode-Objekte, die unsterblich und statisch sind

    • sys.getunicodeinternedsize gibt die Gesamtzahl der Unicode-Objekte

      zurück, die interniert wurden. Das wird jetzt gebraucht, damit refleak.py Referenzzähler und angeforderte Speicherblöcke richtig verfolgen kann

    (Beigetragen von Eddie Elizondo in gh-84436.)

  • PEP 684: Die neue Funktion Py_NewInterpreterFromConfig() und PyInterpreterConfig sind 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() und Py_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 oder wchar_t* aufbauen.

  • Funktionen zum Auswerten von Argumenten wie PyArg_ParseTuple() unterstützen Formate auf Grundlage von Py_UNICODE* (zum Beispiel u, Z) nicht mehr. Steige bitte auf andere Formate für Unicode um, etwa s, z, es und U.

  • tp_weaklist ist für alle statischen eingebauten Typen immer NULL. Das ist ein ausschließlich internes Feld an PyTypeObject, 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_subclasses ist 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 über PyObject_CallMethod()).

  • Unterstützung für weitere Formatierungsoptionen (Linksausrichtung, Oktalzahlen, Hexadezimalzahlen in Großbuchstaben, intmax_t, ptrdiff_t, C-Zeichenketten aus wchar_t, veränderliche Breite und Genauigkeit) ist in PyUnicode_FromFormat() und PyUnicode_FromFormatV() hinzugekommen. (Beigetragen von Serhiy Storchaka in gh-98836.)

  • Ein unbekanntes Formatzeichen in PyUnicode_FromFormat() und PyUnicode_FromFormatV() setzt jetzt einen SystemError. 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() und PyUnicode_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, sollten Py_TPFLAGS_MANAGED_DICT beziehungsweise Py_TPFLAGS_MANAGED_WEAKREF verwenden statt tp_dictoffset und tp_weaklistoffset. tp_dictoffset und tp_weaklistoffset werden weiterhin unterstützt, aber Mehrfachvererbung wird damit nicht vollständig unterstützt (gh-95589), und die Geschwindigkeit kann schlechter sein. Klassen, die Py_TPFLAGS_MANAGED_DICT angeben, 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 bisher PyObject_ClearWeakRefs() auf.

  • Die Funktion PyUnicode_FSDecoder() nimmt keine bytes-ähnlichen Pfade mehr an, etwa die Typen bytearray und memoryview: für Bytezeichenketten wird nur noch genau der Typ bytes angenommen. (Beigetragen von Victor Stinner in gh-98393.)

  • Die Makros Py_CLEAR, Py_SETREF und Py_XSETREF werten 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_RefTotal ist 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 Funktionen tp_new der 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 Metaklasse tp_new überschreibt (__new__() in Python).

    Da tp_new fast alles überschreibt, was die PyType_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, dass tp_new aufgerufen wurde. Es gibt keine einfache allgemeine Behelfslösung. Eines der folgenden Vorgehen kann aber helfen:

    • Wenn du Herr über die Metaklasse bist, vermeide tp_new darin:

      • Wenn die Initialisierung übersprungen werden darf, lässt sie sich stattdessen in tp_init erledigen.

      • Wenn die Metaklasse nicht aus Python heraus erzeugt werden muss, setze ihr tp_new mit dem Schalter Py_TPFLAGS_DISALLOW_INSTANTIATION auf NULL. Damit ist sie für die PyType_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_new gefahrlos übersprungen werden darf, filtere die Warnung über die Abkündigung aus Python heraus mit warnings.catch_warnings() weg.

  • PyOS_InputHook und PyOS_ReadlineFunctionPointer werden 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 PyLongObject sind für mehr Geschwindigkeit geändert. Die Interna von PyLongObject sind zwar privat, werden aber von einigen Erweiterungsmodulen verwendet. Auf die internen Felder sollte nicht mehr unmittelbar zugegriffen werden. Verwende stattdessen die API-Funktionen, die mit PyLong_... beginnen. Zwei neue instabile API-Funktionen stehen bereit, um effizient auf den Wert jener PyLongObjects 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 @ericsnowcurrently in CC.

Als veraltet markiert

Geplante Entfernung in Python 3.14

Geplante Entfernung in Python 3.15

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.

Entfernt

  • Die Header-Datei token.h ist entfernt. Es gab nie eine öffentliche C-API für den Tokenizer. Die Header-Datei token.h war 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_KIND

    • PyUnicode_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.)