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:

* PEP 701, *f-Strings* in der Grammatik

Verbesserungen am Interpreter:

* PEP 684, ein eigener *GIL* je Interpreter

* PEP 669, Überwachung mit geringer Auswirkung

* Verbesserte Vorschläge im Stil „Did you mean ...“ für die Ausnahmen
  "NameError", "ImportError" und "SyntaxError"

Verbesserungen am Python-Datenmodell:

* PEP 688, das Pufferprotokoll aus Python heraus verwenden

Wesentliche Verbesserungen in der Standardbibliothek:

* Die Klasse "pathlib.Path" lässt sich jetzt ableiten

* Das Modul "os" hat mehrere Verbesserungen für die Unterstützung von
  Windows erhalten

* Eine Befehlszeilenschnittstelle ist zum Modul "sqlite3"
  hinzugekommen

* Prüfungen mit "isinstance()" gegen "zur Laufzeit prüfbare
  Protokolle" sind zwei- bis zwanzigmal schneller

* Das Paket "asyncio" hat eine Reihe von
  Geschwindigkeitsverbesserungen erfahren, bei einigen
  Vergleichsmessungen bis zu 75 %.

* Eine Befehlszeilenschnittstelle ist zum Modul "uuid" hinzugekommen

* Wegen der Änderungen in PEP 701 erzeugt das Modul "tokenize" Token
  bis zu 64 % schneller.

Verbesserungen bei der Sicherheit:

* Die eingebauten "hashlib"-Umsetzungen von SHA1, SHA3, SHA2-384,
  SHA2-512 und MD5 sind durch formal verifizierten Code aus dem
  Projekt HACL* ersetzt. Diese eingebauten Umsetzungen bleiben als
  Rückfallebene erhalten und werden nur verwendet, wenn OpenSSL sie
  nicht bereitstellt.

Verbesserungen der C-API:

* PEP 697, Stufe der instabilen C-API

* PEP 683, unsterbliche Objekte

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:

* PEP 692, "TypedDict" verwenden, um ***kwargs* zu annotieren

* PEP 698, Dekorator "@typing.override"

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'?


Neue Funktionen im Zusammenhang mit Typ-Hinweisen
=================================================

Dieser Abschnitt behandelt die wichtigsten Änderungen, die
**Typhinweise** und das Modul "typing" betreffen.


PEP 692: "TypedDict" für eine genauere Typisierung von "**kwargs" verwenden
---------------------------------------------------------------------------

"**kwargs" in einer Funktionssignatur zu typisieren, wie es **PEP
484** eingeführt hat, erlaubte nur dann gültige Annotationen, wenn
alle "**kwargs" denselben Typ hatten.

**PEP 692** legt eine genauere Art fest, "**kwargs" zu typisieren, und
setzt dabei auf typisierte Dictionaries:

   from typing import TypedDict, Unpack

   class Movie(TypedDict):
     name: str
     year: int

   def foo(**kwargs: Unpack[Movie]): ...

Mehr Einzelheiten siehe **PEP 692**.

(Beigetragen von Franek Magiera in gh-103629.)


PEP 698: Override-Dekorator für statische Typisierung
-----------------------------------------------------

Ein neuer Dekorator "@typing.override" ist zum Modul "typing"
hinzugekommen. Er zeigt Typprüfern an, dass die Methode eine Methode
einer Oberklasse überschreiben soll. Damit können Typprüfer Fehler
aufspüren, bei denen eine Methode etwas in einer Basisklasse
überschreiben soll, es aber tatsächlich nicht tut.

Beispiel:

   from typing import override

   class Base:
     def get_color(self) -> str:
       return "blue"

   class GoodChild(Base):
     @override  # ok: overrides Base.get_color
     def get_color(self) -> str:
       return "yellow"

   class BadChild(Base):
     @override  # type checker error: does not override Base.get_color
     def get_colour(self) -> str:
       return "red"

Näheres unter **PEP 698**.

(Beigetragen von Steven Troxler in gh-101561.)


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

* Die Klasse "array.array" unterstützt jetzt die Indizierung und ist
  damit ein *generischer Typ*. (Beigetragen von Jelle Zijlstra in
  gh-98658.)


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

* Die Schalter "csv.QUOTE_NOTNULL" und "csv.QUOTE_STRINGS" sind
  hinzugekommen, um feiner zu steuern, wie "reader"- und
  "writer"-Objekte mit "None" und leeren Zeichenketten umgehen.


dis
---

* Die Opcodes der Pseudo-Anweisungen (die der Compiler verwendet, die
  aber im ausführbaren Bytecode nicht vorkommen) sind jetzt im Modul
  "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
-------------------

* "importlib.resources.as_file()" unterstützt jetzt
  Ressourcenverzeichnisse. (Beigetragen von Jason R. Coombs in
  gh-97930.)

* Der erste Parameter von "importlib.resources.files()" ist in
  *anchor* umbenannt. (Beigetragen von Jason R. Coombs in gh-100598.)


inspect
-------

* "inspect.markcoroutinefunction()" ist hinzugekommen, um synchrone
  Funktionen, die eine *Coroutine* zurückgeben, für die Verwendung mit
  "inspect.iscoroutinefunction()" zu kennzeichnen. (Beigetragen von
  Carlton Gibson in gh-99247.)

* "inspect.getasyncgenstate()" und "inspect.getasyncgenlocals()" sind
  hinzugekommen, um den aktuellen Zustand asynchroner Generatoren zu
  ermitteln. (Beigetragen von Thomas Krennwallner in gh-79940.)

* "inspect.getattr_static()" ist deutlich schneller geworden. Die
  meisten Aufrufe der Funktion sollten mindestens doppelt so schnell
  sein wie in Python 3.11. (Beigetragen von Alex Waygood in
  gh-103193.)


itertools
---------

* "itertools.batched()" ist hinzugekommen, um in gleich große Tupel zu
  sammeln, wobei das letzte Bündel kürzer sein kann als die übrigen.
  (Beigetragen von Raymond Hettinger in gh-98363.)


math
----

* "math.sumprod()" ist hinzugekommen, um eine Summe von Produkten zu
  berechnen. (Beigetragen von Raymond Hettinger in gh-100485.)

* "math.nextafter()" ist um ein Argument *steps* erweitert, um mehrere
  Schritte auf einmal nach oben oder unten zu gehen. (Beigetragen von
  Matthias Goergens, Mark Dickinson und Raymond Hettinger in
  gh-94906.)


os
--

* "os.PIDFD_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
-------

* Unterstützung dafür, von "pathlib.PurePath" und "pathlib.Path" sowie
  von ihren Posix- und Windows-eigenen Varianten abzuleiten, ist
  hinzugekommen. Unterklassen dürfen die Methode
  "pathlib.PurePath.with_segments()" überschreiben, um Informationen
  zwischen Pfadinstanzen weiterzugeben.

* "pathlib.Path.walk()" ist hinzugekommen, um Verzeichnisbäume zu
  durchlaufen und alle darin enthaltenen Datei- und Verzeichnisnamen
  zu liefern, ähnlich wie "os.walk()". (Beigetragen von Stanislav
  Zmiev in gh-90385.)

* Der optionale Parameter *walk_up* ist zu
  "pathlib.PurePath.relative_to()" hinzugekommen, um ".."-Einträge im
  Ergebnis zu erlauben. Dieses Verhalten stimmt besser mit
  "os.path.relpath()" überein. (Beigetragen von Domenico Ragusa in
  gh-84538.)

* "pathlib.Path.is_junction()" ist als Stellvertreter für
  "os.path.isjunction()" hinzugekommen. (Beigetragen von Charles
  Machalow in gh-99547.)

* Der optionale Parameter *case_sensitive* ist zu
  "pathlib.Path.glob()", "pathlib.Path.rglob()" und
  "pathlib.PurePath.match()" hinzugekommen, um die Groß- und
  Kleinschreibung beim Abgleich des Pfads festzulegen und den Abgleich
  damit genauer steuern zu können.


platform
--------

* Unterstützung dafür, Windows 11 und Windows-Server-Ausgaben nach
  2012 zu erkennen, ist hinzugekommen. Vorher gaben Abfragen auf
  Windows-Server-Plattformen, die neuer als Windows Server 2012 sind,
  und unter Windows 11 "Windows-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
------

* "random.binomialvariate()" ist hinzugekommen. (Beigetragen von
  Raymond Hettinger in gh-81620.)

* Für "random.expovariate()" ist die Voreinstellung "lambd=1.0"
  hinzugekommen. (Beigetragen von Raymond Hettinger in gh-100234.)


shutil
------

* "shutil.make_archive()" gibt das Argument *root_dir* jetzt an eigene
  Archivierer weiter, die es unterstützen. In diesem Fall wird das
  aktuelle Arbeitsverzeichnis des Prozesses für das Archivieren nicht
  mehr vorübergehend auf *root_dir* gewechselt. (Beigetragen von
  Serhiy Storchaka in gh-74696.)

* "shutil.rmtree()" nimmt jetzt ein neues Argument *onexc* an, einen
  Fehlerbehandler wie *onerror*, der jedoch eine Ausnahmeinstanz statt
  eines Tripels *(typ, val, tb)* erwartet. *onerror* ist als veraltet
  markiert. (Beigetragen von Irit Katriel in gh-102828.)

* "shutil.which()" zieht jetzt die Umgebungsvariable *PATHEXT* zurate,
  um unter Windows Treffer innerhalb von *PATH* zu finden, selbst wenn
  das angegebene *cmd* einen Verzeichnisteil enthält. (Beigetragen von
  Charles Machalow in gh-103179.)

  "shutil.which()" ruft bei der Suche nach ausführbaren Dateien unter
  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
-------

* Eine Befehlszeilenschnittstelle ist hinzugekommen. (Beigetragen von
  Erlend E. Aasland in gh-77617.)

* Das Attribut "sqlite3.Connection.autocommit" ist zu
  "sqlite3.Connection" und der Parameter *autocommit* zu
  "sqlite3.connect()" hinzugekommen, um die Transaktionsbehandlung
  nach **PEP 249** zu steuern. (Beigetragen von Erlend E. Aasland in
  gh-83638.)

* Der nur über Schlüsselwort angebbare Parameter *entrypoint* ist zu
  "sqlite3.Connection.load_extension()" hinzugekommen, um den
  Einsprungpunkt der SQLite-Erweiterung zu überschreiben. (Beigetragen
  von Erlend E. Aasland in gh-103015.)

* "sqlite3.Connection.getconfig()" und
  "sqlite3.Connection.setconfig()" sind zu "sqlite3.Connection"
  hinzugekommen, um Konfigurationsänderungen an einer
  Datenbankverbindung vorzunehmen. (Beigetragen von Erlend E. Aasland
  in gh-103489.)


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

* Der Namensraum "sys.monitoring" ist hinzugekommen, um die neue
  Überwachungs-API aus PEP 669 zugänglich zu machen. (Beigetragen von
  Mark Shannon in gh-103082.)

* "sys.activate_stack_trampoline()" und
  "sys.deactivate_stack_trampoline()" sind hinzugekommen, um
  Trampoline für Stapel-Profiler ein- und auszuschalten, sowie
  "sys.is_stack_trampoline_active()", um abzufragen, ob sie
  eingeschaltet sind. (Beigetragen von Pablo Galindo und Christian
  Heimes, mit Beiträgen von Gregory P. Smith [Google] und Mark Shannon
  in gh-96123.)

* "sys.last_exc" ist hinzugekommen. Es enthält die letzte unbehandelte
  Ausnahme, die ausgelöst wurde (für die Fehlersuche im Nachhinein).
  Die drei Felder, die dieselbe Information in ihrer alten Form
  enthalten, sind als veraltet markiert: "sys.last_type",
  "sys.last_value" und "sys.last_traceback". (Beigetragen von Irit
  Katriel in gh-102778.)

* "sys._current_exceptions()" gibt jetzt eine Zuordnung von Thread-
  Kennung auf eine Ausnahmeinstanz zurück statt auf ein Tupel "(typ,
  exc, tb)". (Beigetragen von Irit Katriel in gh-103176.)

* "sys.setrecursionlimit()" und "sys.getrecursionlimit()". Die
  Rekursionsgrenze gilt jetzt nur noch für Python-Code. Eingebaute
  Funktionen verwenden die Rekursionsgrenze nicht, sind aber durch
  einen anderen Mechanismus davor geschützt, dass Rekursion die
  virtuelle Maschine zum Absturz bringt.


tempfile
--------

* Die Funktion "tempfile.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
---------

* "threading.settrace_all_threads()" und
  "threading.setprofile_all_threads()" sind hinzugekommen, mit denen
  sich Funktionen für Tracing und Profiling in allen laufenden Threads
  setzen lassen, nicht nur im aufrufenden. (Beigetragen von Pablo
  Galindo in gh-93503.)


tkinter
-------

* "tkinter.Canvas.coords()" flacht seine Argumente jetzt ab. Es nimmt
  jetzt nicht nur Koordinaten als einzelne Argumente ("x1, y1, x2, y2,
  ...") und eine Folge von Koordinaten ("[x1, y1, x2, y2, ...]") an,
  sondern auch paarweise gruppierte Koordinaten ("(x1, y1), (x2, y2),
  ..." und "[(x1, y1), (x2, y2), ...]"), so wie die
  "create_*()"-Methoden. (Beigetragen von Serhiy Storchaka in
  gh-94473.)


tokenize
--------

* Das Modul "tokenize" enthält die Änderungen aus **PEP 701**.
  (Beigetragen von Marta Gómez Macías und Pablo Galindo in gh-102856.)
  Mehr zu den Änderungen am Modul "tokenize" steht unter Portierung
  auf Python 3.12.


types
-----

* "types.get_original_bases()" ist hinzugekommen, um User-defined
  generic types bei Ableitungen genauer untersuchen zu können.
  (Beigetragen von James Hilton-Balfe und Alex Waygood in gh-101827.)


typing
------

* Prüfungen mit "isinstance()" 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
----

* Eine Befehlszeilenschnittstelle ist hinzugekommen. (Beigetragen von
  Adam Chhina in gh-88597.)


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:

  * "importlib.resources.abc.Traversable"

  * "importlib.resources.abc.TraversableResources"

  (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"

  * Die voreingestellten Adapter und Konverter sind jetzt als veraltet
    markiert. Verwende stattdessen die Adapter and converter recipes
    und passe sie an deine Bedürfnisse an. (Beigetragen von Erlend E.
    Aasland in gh-90016.)

  * In "execute()" wird jetzt eine "DeprecationWarning" ausgegeben,
    wenn benannte Platzhalter zusammen mit Parametern verwendet
    werden, die als *Folge* statt als "dict" übergeben werden. Ab
    Python 3.14 löst es einen "ProgrammingError" aus, benannte
    Platzhalter mit als Folge übergebenen Parametern zu verwenden.
    (Beigetragen von Erlend E. Aasland in gh-101698.)

* "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":

  * "typing.Hashable" und "typing.Sized", andere Namen für
    "collections.abc.Hashable" beziehungsweise
    "collections.abc.Sized", sind als veraltet markiert. (gh-94309.)

  * "typing.ByteString", seit Python 3.9 als veraltet markiert, löst
    bei der Verwendung jetzt eine "DeprecationWarning" aus.
    (Beigetragen von Alex Waygood in gh-91896.)

* "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:

* "configparser.LegacyInterpolation" (gh-90765)

* "locale.resetlocale()" (gh-90817)

* "turtle.RawTurtle.settiltangle()" (gh-50096)

* "unittest.findTestCases()" (gh-50096)

* "unittest.getTestCaseNames()" (gh-50096)

* "unittest.makeSuite()" (gh-50096)

* "unittest.TestProgram.usageExit()" (gh-67048)

* "webbrowser.MacOSX" (gh-86421)

* Verkettung von "classmethod"-Deskriptoren (gh-89519)


Geplante Entfernung in Python 3.14
----------------------------------

* "argparse": Die Parameter *type*, *choices* und *metavar* 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:

  * "importlib.resources.abc.Traversable"

  * "importlib.resources.abc.TraversableResources"

  (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":

  * "master_open()": Verwende "pty.openpty()".

  * "slave_open()": Verwende "pty.openpty()".

* "sqlite3"

  * "version" und "version_info".

  * "execute()" und "executemany()", wenn benannte Platzhalter
    verwendet werden und *parameters* eine Sequenz anstelle eines
    "dict" ist.

* "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":

  * Das Argument *check_home* von "sysconfig.is_python_build()" ist
    seit Python 3.12 als veraltet markiert.

* "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 "TypedDict"s 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
----------------------------------

* Das Importsystem:

  * Das Setzen von "__loader__" für ein Modul, ohne "__spec__.loader"
    zu setzen, ist veraltet. In Python 3.16 wird "__loader__" vom
    Importsystem und der Standardbibliothek weder gesetzt noch
    berücksichtigt.

* "array":

  * Das Formatzeichen "'u'" ("wchar_t") ist seit Python 3.3 in der
    Dokumentation und seit Python 3.13 zur Laufzeit veraltet. Verwende
    für Unicode-Zeichen stattdessen das Formatzeichen "'w'"
    ("Py_UCS4").

* "asyncio":

  * "asyncio.iscoroutinefunction()" ist veraltet und wird in Python
    3.16 entfernt. Verwende stattdessen
    "inspect.iscoroutinefunction()". (Beigetragen von Jiahao Li und
    Kumar Aditya in gh-122875.)

  * Das Policy-System von "asyncio" ist veraltet und wird in Python
    3.16 entfernt. Insbesondere die folgenden Klassen und Funktionen
    sind veraltet:

    * "asyncio.AbstractEventLoopPolicy"

    * "asyncio.DefaultEventLoopPolicy"

    * "asyncio.WindowsSelectorEventLoopPolicy"

    * "asyncio.WindowsProactorEventLoopPolicy"

    * "asyncio.get_event_loop_policy()"

    * "asyncio.set_event_loop_policy()"

    Verwende "asyncio.run()" oder "asyncio.Runner" mit *loop_factory*,
    um die gewünschte Implementierung der Ereignisschleife zu
    verwenden.

    Zum Beispiel, um "asyncio.SelectorEventLoop" unter Windows zu
    verwenden:

       import asyncio

       async def main():
           ...

       asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)

    (Beigetragen von Kumar Aditya in gh-127949.)

* "builtins":

  * Die bitweise Invertierung boolescher Typen, "~True" oder "~False",
    ist seit Python 3.12 veraltet, da sie überraschende und
    unintuitive Ergebnisse liefert ("-2" und "-1"). Verwende
    stattdessen "not x" für die logische Negation eines booleschen
    Werts. In dem seltenen Fall, dass du die bitweise Invertierung der
    zugrunde liegenden Ganzzahl benötigst, konvertiere explizit nach
    "int" ("~int(x)").

* "functools":

  * Der Aufruf der Python-Implementierung von "functools.reduce()" mit
    *function* oder *sequence* als Schlüsselwortargumenten ist seit
    Python 3.14 veraltet.

* "logging":

  * Die Unterstützung eigener Logging-Handler mit dem Argument *strm*
    ist veraltet und soll in Python 3.16 entfernt werden. Definiere
    Handler stattdessen mit dem Argument *stream*. (Beigetragen von
    Mariusz Felisiak in gh-115032.)

* "mimetypes":

  * Gültige Endungen für "mimetypes.MimeTypes.add_type()" beginnen mit
    einem „.“ oder sind leer. Endungen ohne Punkt sind veraltet und
    lösen in Python 3.16 einen "ValueError" aus. (Beigetragen von Hugo
    van Kemenade in gh-75223.)

* "shutil":

  * Die Ausnahme "ExecError" ist seit Python 3.14 veraltet. Sie wird
    seit Python 3.4 von keiner Funktion in "shutil" mehr verwendet und
    ist jetzt ein Alias von "RuntimeError".

* "symtable":

  * Die Methode "Class.get_methods" ist seit Python 3.14 veraltet.

* "sys":

  * Die Funktion "_enablelegacywindowsfsencoding()" ist seit Python
    3.13 veraltet. Verwende stattdessen die Umgebungsvariable
    "PYTHONLEGACYWINDOWSFSENCODING".

* "sysconfig":

  * Die Funktion "sysconfig.expand_makefile_vars()" ist seit Python
    3.14 veraltet. Verwende stattdessen das Argument "vars" von
    "sysconfig.get_paths()".

* "tarfile":

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


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

  * "http.cookies.Morsel.js_output()" ist veraltet und wird in Python
    3.19 entfernt.

  * "http.cookies.BaseCookie.js_output()" ist veraltet und wird in
    Python 3.19 entfernt.

* "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
----------------------------------

* Der Aufruf der Methode "__new__()" von "struct.Struct" ohne das
  Argument *format* ist veraltet und wird in Python 3.20 entfernt. Der
  Aufruf der Methode "__init__()" auf bereits initialisierten Objekten
  vom Typ "Struct" ist veraltet und wird in Python 3.20 entfernt.

  (Beigetragen von Sergey B Kirpichev und Serhiy Storchaka in
  gh-143715.)

* Die Attribute "__version__", "version" und "VERSION" sind in diesen
  Modulen der Standardbibliothek veraltet und werden in Python 3.20
  entfernt. Verwende stattdessen "sys.version_info".

  * "argparse"

  * "csv"

  * "ctypes"

  * "ctypes.macholib"

  * "decimal" (stattdessen "decimal.SPEC_VERSION" verwenden)

  * "http.server"

  * "imaplib"

  * "ipaddress"

  * "json"

  * "logging" ("__date__" ist ebenfalls veraltet)

  * "optparse"

  * "pickle"

  * "platform"

  * "re"

  * "socketserver"

  * "tabnanny"

  * "tarfile"

  * "tkinter.font"

  * "tkinter.ttk"

  * "wsgiref.simple_server"

  * "xml.etree.ElementTree"

  * "xml.sax.expatreader"

  * "xml.sax.handler"

  * "zlib"

  (Beigetragen von Hugo van Kemenade und Stan Ulbrych in gh-76007.)

* Durch **PEP 829** festgelegte Abkündigungen:

  * Für Zeilen mit "import" in Dateien vom Typ "*name*.pth" werden
    Warnungen ausgegeben.

  * Dateien vom Typ "*name*.pth" werden standardmäßig nicht mehr in
    der Kodierung des Gebietsschemas dekodiert. Sie **MÜSSEN** in
    "utf-8-sig" kodiert sein.

  (Beigetragen von Barry Warsaw in gh-148641.)

* "ast":

  * Das Erzeugen von Instanzen abstrakter AST-Knoten (etwa "ast.AST"
    oder "ast.expr") ist veraltet und wird in Python 3.20 einen Fehler
    auslösen.

* "typing":

  * Es ist veraltet, Prüfungen mit "isinstance()" und "issubclass()"
    auf Protokollklassen anzuwenden, die nicht explizit mit
    "runtime_checkable()" dekoriert sind, aber von einer zur Laufzeit
    prüfbaren Protokollklasse erben. In Python 3.20 wird dies einen
    "TypeError" auslösen.

    (Beigetragen von Bartosz Sławecki in gh-132604.)


Geplante Entfernung in zukünftigen Versionen
--------------------------------------------

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

* "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":

  * "threading.Condition.notifyAll()": Verwende "notify_all()".

  * "threading.Event.isSet()": Verwende "is_set()".

  * "threading.Thread.isDaemon()", "threading.Thread.setDaemon()":
    Verwende das Attribut "threading.Thread.daemon".

  * "threading.Thread.getName()", "threading.Thread.setName()":
    Verwende das Attribut "threading.Thread.name".

  * "threading.currentThread()": Verwende
    "threading.current_thread()".

  * "threading.activeCount()": Verwende "threading.active_count()".

* "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
------------

* Mehrere Namen, die in "configparser" schon in 3.2 als veraltet
  markiert wurden, sind mit gh-89336 entfernt:

  * "configparser.ParsingError" hat kein Attribut und kein Argument
    "filename" mehr. Verwende stattdessen das Attribut und Argument
    "source".

  * "configparser" hat keine Klasse "SafeConfigParser" mehr. Verwende
    stattdessen den kürzeren Namen "ConfigParser".

  * "configparser.ConfigParser" hat keine Methode "readfp" mehr.
    Verwende stattdessen "read_file()".


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

* Viele längst als veraltet markierte "unittest"-Features sind
  entfernt:

  * Mehrere andere Namen für Methoden von "TestCase":

    +------------------------------+---------------------------------+-----------------+
    | Veraltetes Alias             | Methodenname                    | Als veraltet    |
    |                              |                                 | markiert in:    |
    |==============================|=================================|=================|
    | "failUnless"                 | "assertTrue()"                  | 3.1             |
    +------------------------------+---------------------------------+-----------------+
    | "failIf"                     | "assertFalse()"                 | 3.1             |
    +------------------------------+---------------------------------+-----------------+
    | "failUnlessEqual"            | "assertEqual()"                 | 3.1             |
    +------------------------------+---------------------------------+-----------------+
    | "failIfEqual"                | "assertNotEqual()"              | 3.1             |
    +------------------------------+---------------------------------+-----------------+
    | "failUnlessAlmostEqual"      | "assertAlmostEqual()"           | 3.1             |
    +------------------------------+---------------------------------+-----------------+
    | "failIfAlmostEqual"          | "assertNotAlmostEqual()"        | 3.1             |
    +------------------------------+---------------------------------+-----------------+
    | "failUnlessRaises"           | "assertRaises()"                | 3.1             |
    +------------------------------+---------------------------------+-----------------+
    | "assert_"                    | "assertTrue()"                  | 3.2             |
    +------------------------------+---------------------------------+-----------------+
    | "assertEquals"               | "assertEqual()"                 | 3.2             |
    +------------------------------+---------------------------------+-----------------+
    | "assertNotEquals"            | "assertNotEqual()"              | 3.2             |
    +------------------------------+---------------------------------+-----------------+
    | "assertAlmostEquals"         | "assertAlmostEqual()"           | 3.2             |
    +------------------------------+---------------------------------+-----------------+
    | "assertNotAlmostEquals"      | "assertNotAlmostEqual()"        | 3.2             |
    +------------------------------+---------------------------------+-----------------+
    | "assertRegexpMatches"        | "assertRegex()"                 | 3.2             |
    +------------------------------+---------------------------------+-----------------+
    | "assertRaisesRegexp"         | "assertRaisesRegex()"           | 3.2             |
    +------------------------------+---------------------------------+-----------------+
    | "assertNotRegexpMatches"     | "assertNotRegex()"              | 3.5             |
    +------------------------------+---------------------------------+-----------------+

    Du kannst https://github.com/isidentical/teyit für das
    automatische modernisieren deiner Unit Tests nutzen.

  * Die nicht dokumentierte und fehlerhafte "TestCase"-Methode
    "assertDictContainsSubset" (in Python 3.2 als veraltet markiert).

  * Der nicht dokumentierte Parameter *use_load_tests* von
    "TestLoader.loadTestsFromModule" (seit Python 3.5 als veraltet
    markiert und übergangen).

  * Ein anderer Name für die Klasse "TextTestResult":
    "_TextTestResult" (in Python 3.2 als veraltet markiert).

  (Beigetragen von Serhiy Storchaka in gh-89325.)


webbrowser
----------

* Die Unterstützung für überholte Browser ist aus "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 697**: Die Stufe der instabilen C-API ist eingeführt, gedacht
  für Werkzeuge auf niedriger Ebene wie Debugger und JIT-Compiler.
  Diese API darf sich in jeder Nebenversion von CPython ohne Warnung
  über eine Abkündigung ändern. Ihre Bestandteile sind durch das
  Namenspräfix "PyUnstable_" gekennzeichnet.

  Code-Objekt-Konstruktoren:

  * "PyUnstable_Code_New()" (umbenannt 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 verfügbar, bis sich die jeweilige
  API ändert.

  (Beigetragen von Petr Viktorin in gh-101101.)

* **PEP 697**: Eine API ist hinzugekommen, um Typen zu erweitern,
  deren Speicherlayout je Instanz undurchsichtig ist:

  * "PyType_Spec.basicsize" darf null oder negativ sein, um anzugeben,
    dass die Größe der Basisklasse geerbt oder erweitert wird.

  * "PyObject_GetTypeData()" und "PyType_GetTypeDataSize()" sind
    hinzugekommen, um Zugriff auf die instanzbezogenen Daten einer
    Unterklasse zu ermöglichen.

  * "Py_TPFLAGS_ITEMS_AT_END" und "PyObject_GetItemData()" sind
    hinzugekommen, um bestimmte Typen mit veränderlicher Größe
    gefahrlos erweitern zu können, darunter "PyType_Type".

  * "Py_RELATIVE_OFFSET" ist hinzugekommen, um "Elemente" bezogen auf
    eine unterklassenbezogene Struktur definieren zu können.

  (Beigetragen von Petr Viktorin in gh-103509.)

* Die neue Funktion "PyType_FromMetaclass()" ist in der
  eingeschränkten C-API hinzugekommen. Sie verallgemeinert das
  bestehende "PyType_FromModuleAndSpec()" um ein zusätzliches
  Metaklassen-Argument. (Beigetragen von Wenzel Jakob in gh-93012.)

* Eine API, um Objekte zu erzeugen, die sich über das Vectorcall-
  Protokoll aufrufen lassen, ist in der eingeschränkten API
  hinzugekommen:

  * "Py_TPFLAGS_HAVE_VECTORCALL"

  * "PyVectorcall_NARGS()"

  * "PyVectorcall_Call()"

  * "vectorcallfunc"

  Der Schalter "Py_TPFLAGS_HAVE_VECTORCALL" wird jetzt von einer
  Klasse entfernt, wenn deren Methode "__call__()" neu zugewiesen
  wird. Damit lässt sich Vectorcall gefahrlos mit veränderlichen Typen
  verwenden (also mit Heap-Typen ohne den Schalter für
  Unveränderlichkeit, "Py_TPFLAGS_IMMUTABLETYPE"). Veränderliche
  Typen, die "tp_call" nicht überschreiben, erben jetzt den Schalter
  "Py_TPFLAGS_HAVE_VECTORCALL". (Beigetragen von Petr Viktorin in
  gh-93274.)

  Die Schalter "Py_TPFLAGS_MANAGED_DICT" und
  "Py_TPFLAGS_MANAGED_WEAKREF" sind hinzugekommen. Damit können
  Erweiterungsklassen das "__dict__" eines Objekts und schwache
  Referenzen mit weniger Verwaltungsaufwand, geringerem
  Speicherverbrauch und schnellerem Zugriff unterstützen.

* Eine API, um Aufrufe über das Vectorcall-Protokoll auszuführen, ist
  in der eingeschränkten API hinzugekommen:

  * "PyObject_Vectorcall()"

  * "PyObject_VectorcallMethod()"

  * "PY_VECTORCALL_ARGUMENTS_OFFSET"

  Damit sind jetzt beide Enden des Vectorcall-Protokolls, das
  eingehende und das ausgehende, in der eingeschränkten API verfügbar.
  (Beigetragen von Wenzel Jakob in gh-98586.)

* Zwei neue öffentliche Funktionen, "PyEval_SetProfileAllThreads()"
  und "PyEval_SetTraceAllThreads()", sind hinzugekommen, mit denen
  sich Funktionen für Tracing und Profiling in allen laufenden Threads
  setzen lassen, nicht nur im aufrufenden. (Beigetragen von Pablo
  Galindo in gh-93503.)

* Die neue Funktion "PyFunction_SetVectorcall()" ist in der C-API
  hinzugekommen. Sie setzt das Vectorcall-Feld eines angegebenen
  "PyFunctionObject". (Beigetragen von Andrew Frost in gh-92257.)

* Die C-API erlaubt es jetzt, über "PyDict_AddWatcher()",
  "PyDict_Watch()" und verwandte APIs Rückruffunktionen anzumelden,
  die bei jeder Änderung an einem Dictionary aufgerufen werden.
  Gedacht ist das für optimierende Interpreter, JIT-Compiler oder
  Debugger. (Beigetragen von Carl Meyer in gh-91052.)

* Die APIs "PyType_AddWatcher()" und "PyType_Watch()" sind
  hinzugekommen, um Rückruffunktionen anzumelden, die über Änderungen
  an einem Typ benachrichtigt werden. (Beigetragen von Carl Meyer in
  gh-91051.)

* Die APIs "PyCode_AddWatcher()" und "PyCode_ClearWatcher()" sind
  hinzugekommen, um Rückruffunktionen anzumelden, die über das
  Erzeugen und Zerstören von Codeobjekten benachrichtigt werden.
  (Beigetragen von Itamar Oren in gh-91054.)

* Die Funktionen "PyFrame_GetVar()" und "PyFrame_GetVarString()" sind
  hinzugekommen, um eine Rahmenvariable über ihren Namen zu holen.
  (Beigetragen von Victor Stinner in gh-91248.)

* "PyErr_GetRaisedException()" und "PyErr_SetRaisedException()" sind
  hinzugekommen, um die aktuelle Ausnahme zu sichern und
  wiederherzustellen. Diese Funktionen geben ein einzelnes
  Ausnahmeobjekt zurück und nehmen eines an, statt der drei Argumente
  der nun als veraltet markierten "PyErr_Fetch()" und
  "PyErr_Restore()". Das ist weniger fehleranfällig und etwas
  effizienter. (Beigetragen von Mark Shannon in gh-101578.)

* "_PyErr_ChainExceptions1" ist hinzugekommen. Es nimmt eine
  Ausnahmeinstanz an und ersetzt das alte "_PyErr_ChainExceptions",
  das jetzt als veraltet markiert ist. (Beigetragen von Mark Shannon
  in gh-101578.)

* "PyException_GetArgs()" und "PyException_SetArgs()" sind als
  praktische Funktionen hinzugekommen, um die an den Konstruktor der
  Ausnahme übergebenen "args" abzurufen und zu ändern. (Beigetragen
  von Mark Shannon in gh-101578.)

* "PyErr_DisplayException()" ist hinzugekommen. Es nimmt eine
  Ausnahmeinstanz an und ersetzt das alte "PyErr_Display()".
  (Beigetragen von Irit Katriel in gh-102755).

* **PEP 683**: *Unsterbliche Objekte* sind eingeführt, die es Objekten
  erlauben, das Zählen von Referenzen zu umgehen, dazu die zugehörigen
  Änderungen an der C-API:

  * "_Py_IMMORTAL_REFCNT": Der Referenzzähler, der ein 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:

  * "PyType_FromSpec()"

  * "PyType_FromSpecWithBases()"

  * "PyType_FromModuleAndSpec()"

  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 "PyLongObject"s zuzugreifen, die in ein einzelnes
  Maschinenwort passen:

  * "PyUnstable_Long_IsCompact()"

  * "PyUnstable_Long_CompactValue()"

* 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
---------------------

* Nach **PEP 699** ist das Feld "ma_version_tag" in "PyDictObject" für
  Erweiterungsmodule als veraltet markiert. Ein Zugriff auf dieses
  Feld erzeugt beim Kompilieren eine Compiler-Warnung. Das Feld wird
  in Python 3.14 entfernt. (Beigetragen von Ramvikrams und Kumar
  Aditya in gh-101193. PEP von Ken Jin.)

* Globale Konfigurationsvariable als veraltet markiert:

  * "Py_DebugFlag": verwende "PyConfig.parser_debug"

  * "Py_VerboseFlag": verwende "PyConfig.verbose"

  * "Py_QuietFlag": verwende "PyConfig.quiet"

  * "Py_InteractiveFlag": verwende "PyConfig.interactive"

  * "Py_InspectFlag": verwende "PyConfig.inspect"

  * "Py_OptimizeFlag": verwende "PyConfig.optimization_level"

  * "Py_NoSiteFlag": verwende "PyConfig.site_import"

  * "Py_BytesWarningFlag": verwende "PyConfig.bytes_warning"

  * "Py_FrozenFlag": verwende "PyConfig.pathconfig_warnings"

  * "Py_IgnoreEnvironmentFlag": verwende "PyConfig.use_environment"

  * "Py_DontWriteBytecodeFlag": verwende "PyConfig.write_bytecode"

  * "Py_NoUserSiteDirectory": verwende "PyConfig.user_site_directory"

  * "Py_UnbufferedStdioFlag": verwende "PyConfig.buffered_stdio"

  * "Py_HashRandomizationFlag": verwende "PyConfig.use_hash_seed" und
    "PyConfig.hash_seed"

  * "Py_IsolatedFlag": verwende "PyConfig.isolated"

  * "Py_LegacyWindowsFSEncodingFlag": verwende
    "PyPreConfig.legacy_windows_fs_encoding"

  * "Py_LegacyWindowsStdioFlag": verwende
    "PyConfig.legacy_windows_stdio"

  * "Py_FileSystemDefaultEncoding": verwende
    "PyConfig.filesystem_encoding"

  * "Py_HasFileSystemDefaultEncoding": verwende
    "PyConfig.filesystem_encoding"

  * "Py_FileSystemDefaultEncodeErrors": verwende
    "PyConfig.filesystem_errors"

  * "Py_UTF8Mode": verwende "PyPreConfig.utf8_mode" (siehe
    "Py_PreInitialize()")

  Die "Py_InitializeFromConfig()" API sollte stattdessen mit
  "PyConfig" genutzt werden. (Beigetragen von Victor Stinner in
  gh-77782.)

* "Unveränderliche Typen" mit veränderlichen Basisklassen zu erzeugen
  ist als veraltet markiert und wird in Python 3.14 abgeschaltet.
  (gh-95388)

* Die Header-Datei "structmember.h" ist als veraltet markiert, bleibt
  aber verfügbar, und es ist nicht geplant, sie zu entfernen.

  Ihre Inhalte sind jetzt schon dadurch verfügbar, dass man "Python.h"
  einbindet, mit einem vorangestellten "Py", wo es fehlte:

  * "PyMemberDef", "PyMember_GetOne()" und "PyMember_SetOne()"

  * Typmakros wie "Py_T_INT", "Py_T_DOUBLE" und so weiter (vorher
    "T_INT", "T_DOUBLE" und so weiter)

  * Die Schalter "Py_READONLY" (vorher "READONLY") und "Py_AUDIT_READ"
    (vorher ganz in Großbuchstaben)

  Mehrere Dinge sind über "Python.h" nicht zugänglich:

  * "T_OBJECT" (verwende "Py_T_OBJECT_EX")

  * "T_NONE" (vorher nicht dokumentiert und recht eigenwillig)

  * Das Makro "WRITE_RESTRICTED", das nichts tut.

  * Die Makros "RESTRICTED" und "READ_RESTRICTED", die "Py_AUDIT_READ"
    entsprechen.

  * In manchen Konfigurationen wird "<stddef.h>" von "Python.h" nicht
    eingebunden. Es sollte von Hand eingebunden werden, wenn
    "offsetof()" verwendet wird.

  Die als veraltet markierte Header-Datei stellt ihre ursprünglichen
  Inhalte weiterhin unter den ursprünglichen Namen bereit. Dein alter
  Code kann unverändert bleiben, sofern dich das zusätzliche Einbinden
  und die Makros ohne Namensraum nicht sehr stören.

  (Beigetragen in gh-47146 von Petr Viktorin, auf Grundlage früherer
  Arbeit von Alexander Belopolsky und Matthias Braun.)

* "PyErr_Fetch()" und "PyErr_Restore()" sind als veraltet markiert.
  Verwende stattdessen "PyErr_GetRaisedException()" und
  "PyErr_SetRaisedException()". (Beigetragen von Mark Shannon in
  gh-101578.)

* "PyErr_Display()" ist als veraltet markiert. Verwende stattdessen
  "PyErr_DisplayException()". (Beigetragen von Irit Katriel in
  gh-102755).

* "_PyErr_ChainExceptions" ist als veraltet markiert. Verwende
  stattdessen "_PyErr_ChainExceptions1". (Beigetragen von Irit Katriel
  in gh-102192.)

* "PyType_FromSpec()", "PyType_FromSpecWithBases()" oder
  "PyType_FromModuleAndSpec()" zu verwenden, um eine Klasse zu
  erzeugen, deren Metaklasse "tp_new" überschreibt, ist als veraltet
  markiert. Rufe stattdessen die Metaklasse auf.


Geplante Entfernung in Python 3.14
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* Das Feld "ma_version_tag" in "PyDictObject" für Erweiterungsmodule
  (**PEP 699**; gh-101193).

* "Unveränderliche Typen" mit veränderlichen Basisklassen zu erzeugen
  (gh-95388).


Geplante Entfernung in Python 3.15
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* "PyImport_ImportModuleNoBlock()": Verwende stattdessen
  "PyImport_ImportModule()".

* "PyWeakref_GetObject()" und "PyWeakref_GET_OBJECT()": Verwende
  stattdessen "PyWeakref_GetRef()". Mit dem Projekt pythoncapi-compat
  lässt sich "PyWeakref_GetRef()" auch unter Python 3.12 und älter
  nutzen.

* "PyUnicode_AsDecodedObject()": Verwende stattdessen
  "PyCodec_Decode()".

* "PyUnicode_AsDecodedUnicode()": Verwende stattdessen
  "PyCodec_Decode()". Beachte, dass manche Codecs (zum Beispiel
  „base64“) einen anderen Typ als "str" zurückgeben können, etwa
  "bytes".

* "PyUnicode_AsEncodedObject()": Verwende stattdessen
  "PyCodec_Encode()".

* "PyUnicode_AsEncodedUnicode()": Verwende stattdessen
  "PyCodec_Encode()". Beachte, dass manche Codecs (zum Beispiel
  „base64“) einen anderen Typ als "bytes" zurückgeben können, etwa
  "str".

* Funktionen zur Initialisierung von Python, in Python 3.13 als
  veraltet markiert:

  * "Py_GetPath()": Verwende stattdessen
    "PyConfig_Get("module_search_paths")" ("sys.path").

  * "Py_GetPrefix()": Verwende stattdessen
    "PyConfig_Get("base_prefix")" ("sys.base_prefix"). Verwende
    "PyConfig_Get("prefix")" ("sys.prefix"), wenn virtuelle Umgebungen
    zu berücksichtigen sind.

  * "Py_GetExecPrefix()": Verwende stattdessen
    "PyConfig_Get("base_exec_prefix")" ("sys.base_exec_prefix").
    Verwende "PyConfig_Get("exec_prefix")" ("sys.exec_prefix"), wenn
    virtuelle Umgebungen zu berücksichtigen sind.

  * "Py_GetProgramFullPath()": Verwende stattdessen
    "PyConfig_Get("executable")" ("sys.executable").

  * "Py_GetProgramName()": Verwende stattdessen
    "PyConfig_Get("executable")" ("sys.executable").

  * "Py_GetPythonHome()": Verwende stattdessen "PyConfig_Get("home")"
    oder die Umgebungsvariable "PYTHONHOME".

  Mit dem Projekt pythoncapi-compat lässt sich "PyConfig_Get()" auch
  unter Python 3.13 und älter nutzen.

* Funktionen, um die Initialisierung von Python einzustellen, in
  Python 3.11 als veraltet markiert:

  * "PySys_SetArgvEx()": Setze stattdessen "PyConfig.argv".

  * "PySys_SetArgv()": Setze stattdessen "PyConfig.argv".

  * "Py_SetProgramName()": Setze stattdessen "PyConfig.program_name".

  * "Py_SetPythonHome()": Setze stattdessen "PyConfig.home".

  * "PySys_ResetWarnOptions()": Leere stattdessen "sys.warnoptions"
    und "warnings.filters".

  Stattdessen sollte die API "Py_InitializeFromConfig()" mit
  "PyConfig" verwendet werden.

* Globale Konfigurationsvariablen:

  * "Py_DebugFlag": Verwende stattdessen "PyConfig.parser_debug" oder
    "PyConfig_Get("parser_debug")".

  * "Py_VerboseFlag": Verwende stattdessen "PyConfig.verbose" oder
    "PyConfig_Get("verbose")".

  * "Py_QuietFlag": Verwende stattdessen "PyConfig.quiet" oder
    "PyConfig_Get("quiet")".

  * "Py_InteractiveFlag": Verwende stattdessen "PyConfig.interactive"
    oder "PyConfig_Get("interactive")".

  * "Py_InspectFlag": Verwende stattdessen "PyConfig.inspect" oder
    "PyConfig_Get("inspect")".

  * "Py_OptimizeFlag": Verwende stattdessen
    "PyConfig.optimization_level" oder
    "PyConfig_Get("optimization_level")".

  * "Py_NoSiteFlag": Verwende stattdessen "PyConfig.site_import" oder
    "PyConfig_Get("site_import")".

  * "Py_BytesWarningFlag": Verwende stattdessen
    "PyConfig.bytes_warning" oder "PyConfig_Get("bytes_warning")".

  * "Py_FrozenFlag": Verwende stattdessen
    "PyConfig.pathconfig_warnings" oder
    "PyConfig_Get("pathconfig_warnings")".

  * "Py_IgnoreEnvironmentFlag": Verwende stattdessen
    "PyConfig.use_environment" oder "PyConfig_Get("use_environment")".

  * "Py_DontWriteBytecodeFlag": Verwende stattdessen
    "PyConfig.write_bytecode" oder "PyConfig_Get("write_bytecode")".

  * "Py_NoUserSiteDirectory": Verwende stattdessen
    "PyConfig.user_site_directory" oder
    "PyConfig_Get("user_site_directory")".

  * "Py_UnbufferedStdioFlag": Verwende stattdessen
    "PyConfig.buffered_stdio" oder "PyConfig_Get("buffered_stdio")".

  * "Py_HashRandomizationFlag": Verwende stattdessen
    "PyConfig.use_hash_seed" und "PyConfig.hash_seed" oder
    "PyConfig_Get("hash_seed")".

  * "Py_IsolatedFlag": Verwende stattdessen "PyConfig.isolated" oder
    "PyConfig_Get("isolated")".

  * "Py_LegacyWindowsFSEncodingFlag": Verwende stattdessen
    "PyPreConfig.legacy_windows_fs_encoding" oder
    "PyConfig_Get("legacy_windows_fs_encoding")".

  * "Py_LegacyWindowsStdioFlag": Verwende stattdessen
    "PyConfig.legacy_windows_stdio" oder
    "PyConfig_Get("legacy_windows_stdio")".

  * "Py_FileSystemDefaultEncoding", "Py_HasFileSystemDefaultEncoding":
    Verwende stattdessen "PyConfig.filesystem_encoding" oder
    "PyConfig_Get("filesystem_encoding")".

  * "Py_FileSystemDefaultEncodeErrors": Verwende stattdessen
    "PyConfig.filesystem_errors" oder
    "PyConfig_Get("filesystem_errors")".

  * "Py_UTF8Mode": Verwende stattdessen "PyPreConfig.utf8_mode" oder
    "PyConfig_Get("utf8_mode")". (siehe "Py_PreInitialize()")

  Um diese Optionen zu setzen, sollte die API
  "Py_InitializeFromConfig()" mit "PyConfig" verwendet werden. Oder
  man liest diese Optionen zur Laufzeit mit "PyConfig_Get()" aus.


Geplante Entfernung in Python 3.16
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* Die mitgelieferte Kopie von "libmpdec".


Geplante Entfernung in zukünftigen Versionen
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Die folgenden APIs sind als veraltet markiert und werden entfernt,
auch wenn für die Entfernung derzeit kein Zeitpunkt festgelegt ist.

* "Py_TPFLAGS_HAVE_FINALIZE": seit Python 3.8 nicht mehr nötig.

* "PyErr_Fetch()": Verwende stattdessen "PyErr_GetRaisedException()".

* "PyErr_NormalizeException()": Verwende stattdessen
  "PyErr_GetRaisedException()".

* "PyErr_Restore()": Verwende stattdessen
  "PyErr_SetRaisedException()".

* "PyModule_GetFilename()": Verwende stattdessen
  "PyModule_GetFilenameObject()".

* "PyOS_AfterFork()": Verwende stattdessen "PyOS_AfterFork_Child()".

* "PySlice_GetIndicesEx()": Verwende stattdessen "PySlice_Unpack()"
  und "PySlice_AdjustIndices()".

* "PyUnicode_READY()": seit Python 3.12 nicht mehr nötig

* "PyErr_Display()": Verwende stattdessen "PyErr_DisplayException()".

* "_PyErr_ChainExceptions()": Verwende stattdessen
  "_PyErr_ChainExceptions1()".

* Element "PyBytesObject.ob_shash": rufe stattdessen "PyObject_Hash()"
  auf.

* API für Thread Local Storage (TLS):

  * "PyThread_create_key()": Verwende stattdessen
    "PyThread_tss_alloc()".

  * "PyThread_delete_key()": Verwende stattdessen
    "PyThread_tss_free()".

  * "PyThread_set_key_value()": Verwende stattdessen
    "PyThread_tss_set()".

  * "PyThread_get_key_value()": Verwende stattdessen
    "PyThread_tss_get()".

  * "PyThread_delete_key_value()": Verwende stattdessen
    "PyThread_tss_delete()".

  * "PyThread_ReInitTLS()": seit Python 3.7 nicht mehr nötig.


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