Was ist neu in Python 3.13
**************************

Herausgeber:
   Adam Turner und Thomas Wouters

Dieser Artikel erklärt die neuen Features in Python 3.13 im Vergleich
zu 3.12. Python 3.13 wurde am 7. Oktober 2024 veröffentlicht. Alle
Einzelheiten stehen im Änderungsprotokoll.

Siehe auch:

  **PEP 719** -- Zeitplan für die Veröffentlichung von Python 3.13


Zusammenfassung -- Highlights des Releases
==========================================

Python 3.13 ist eine stabile Ausgabe der Programmiersprache Python,
mit einer Mischung aus Änderungen an der Sprache, an der
Implementierung und an der Standardbibliothek. Zu den größten
Änderungen gehören eine neue interaktive Shell, die versuchsweise
Unterstützung für den Betrieb in einem Free-Threaded-Modus (**PEP
703**) und ein Just-in-time-Compiler (**PEP 744**).

Die Fehlermeldungen werden weiter besser: Rückverfolgungen werden
jetzt standardmäßig farbig hervorgehoben. Die eingebaute Funktion
"locals()" hat jetzt eine festgelegte Semantik für Änderungen am
zurückgegebenen Mapping, und Typparameter unterstützen jetzt
Standardwerte.

Zu den Änderungen an der Bibliothek gehört die Entfernung als veraltet
markierter APIs und Module sowie die üblichen Verbesserungen bei
Benutzerfreundlichkeit und Korrektheit. Mehrere alte Module der
Standardbibliothek sind jetzt entfernt worden, nachdem sie in Python
3.11 als veraltet markiert wurden (**PEP 594**).

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. Hinweise zum Umstieg von früheren Python-
Versionen findest du unter Portierung auf Python 3.13.

======================================================================

Verbesserungen am Interpreter:

* Eine deutlich verbesserte interaktive Shell und verbesserte
  Fehlermeldungen.

* **PEP 667**: Die eingebaute Funktion "locals()" hat jetzt eine
  festgelegte Semantik, wenn das zurückgegebene Mapping verändert
  wird. Python-Debugger und ähnliche Werkzeuge können lokale Variablen
  in optimierten Geltungsbereichen jetzt verlässlicher aktualisieren,
  auch während Code nebenläufig ausgeführt wird.

* **PEP 703**: CPython 3.13 unterstützt versuchsweise den Betrieb mit
  abgeschaltetem *Global Interpreter Lock*. Näheres unter Free-
  Threaded CPython.

* **PEP 744**: Ein einfacher JIT-Compiler ist hinzugekommen. Derzeit
  ist er standardmäßig abgeschaltet (wir schalten ihn vielleicht
  später ein). Die Geschwindigkeitsgewinne sind bescheiden -- wir
  rechnen damit, das in den nächsten Veröffentlichungen zu verbessern.

* Farbunterstützung in der neuen interaktiven Shell sowie in
  Rückverfolgungen und in der Ausgabe von doctest. Abschalten lässt
  sich das über die Umgebungsvariablen "PYTHON_COLORS" und "NO_COLOR".

Verbesserungen am Python-Datenmodell:

* "__static_attributes__" enthält die Namen der Attribute, auf die in
  einer Funktion im Körper einer Klasse über "self.X" zugegriffen
  wird.

* "__firstlineno__" hält die erste Zeilennummer einer
  Klassendefinition fest.

Wesentliche Verbesserungen in der Standardbibliothek:

* Eine neue Ausnahme "PythonFinalizationError" ist hinzugekommen. Sie
  wird ausgelöst, wenn eine Operation während der *Finalisierung*
  blockiert wird.

* Das Modul "argparse" unterstützt jetzt, Befehlszeilenoptionen,
  positionsbezogene Argumente und Unterbefehle als veraltet zu
  markieren.

* Die neuen Funktionen "base64.z85encode()" und "base64.z85decode()"
  unterstützen das Kodieren und Dekodieren von Z85 data.

* Das Modul "copy" hat jetzt eine Funktion "copy.replace()", die viele
  eingebaute Typen und jede Klasse unterstützt, die die Methode
  "__replace__()" definiert.

* Das neue Modul "dbm.sqlite3" ist jetzt das voreingestellte Backend
  von "dbm".

* Das Modul "os" hat eine Reihe neuer Funktionen, um mit den
  Dateideskriptoren für Timer-Benachrichtigungen von Linux zu
  arbeiten.

* Das Modul "random" hat jetzt eine Befehlszeilenschnittstelle.

Verbesserungen bei der Sicherheit:

* "ssl.create_default_context()" setzt "ssl.VERIFY_X509_PARTIAL_CHAIN"
  und "ssl.VERIFY_X509_STRICT" als voreingestellte Schalter.

Verbesserungen der C-API:

* Der Slot "Py_mod_gil" wird jetzt verwendet, um anzuzeigen, dass ein
  Erweiterungsmodul den Betrieb mit abgeschaltetem *GIL* unterstützt.

* Die PyTime-C-API ist hinzugekommen. Sie gibt Zugriff auf die Uhren
  des Systems.

* "PyMutex" ist ein neuer, leichtgewichtiger Mutex, der ein einzelnes
  Byte belegt.

* Es gibt eine neue Reihe von Funktionen, um in der C-API
  Überwachungsereignisse nach **PEP 669** zu erzeugen.

Neue Typisierungsfunktionen:

* **PEP 696**: Typparameter ("typing.TypeVar", "typing.ParamSpec" und
  "typing.TypeVarTuple") unterstützen jetzt Standardwerte.

* **PEP 702**: Der neue Dekorator "warnings.deprecated()" unterstützt
  es, Abkündigungen im Typsystem und zur Laufzeit zu kennzeichnen.

* **PEP 705**: Mit "typing.ReadOnly" lässt sich ein Element eines
  "typing.TypedDict" für Typprüfer als nur lesbar kennzeichnen.

* **PEP 742**: "typing.TypeIs" bietet als Alternative zu
  "typing.TypeGuard" ein eingängigeres Verhalten beim Einengen von
  Typen.

Unterstützte Plattformen:

* **PEP 730**: Apples iOS ist jetzt eine offiziell unterstützte
  Plattform, auf **Stufe 3**.

* **PEP 738**: Android ist jetzt eine offiziell unterstützte
  Plattform, auf **Stufe 3**.

* "wasm32-wasi" wird jetzt als Plattform der **Stufe 2** unterstützt.

* "wasm32-emscripten" ist keine offiziell unterstützte Plattform mehr.

Wichtige Entfernungen:

* PEP 594: Die restlichen 19 „leeren Batterien“ (alte Module der
  Standardbibliothek) sind aus der Standardbibliothek entfernt:
  "aifc", "audioop", "cgi", "cgitb", "chunk", "crypt", "imghdr",
  "mailcap", "msilib", "nis", "nntplib", "ossaudiodev", "pipes",
  "sndhdr", "spwd", "sunau", "telnetlib", "uu" und "xdrlib".

* Das Werkzeug **2to3** und das Modul "lib2to3" sind entfernt (in
  Python 3.11 als veraltet markiert).

* Das Modul "tkinter.tix" ist entfernt (in Python 3.6 als veraltet
  markiert).

* Die Funktion "locale.resetlocale()" ist entfernt.

* Die Namensräume "typing.io" und "typing.re" sind entfernt.

* Verkettete "classmethod"-Deskriptoren sind entfernt.

Änderungen am Veröffentlichungszeitplan:

**PEP 602** („Annual Release Cycle for Python“) ist dahin geändert,
dass der Zeitraum der vollen Unterstützung („bugfix“) für neue
Veröffentlichungen auf zwei Jahre verlängert wird. Diese geänderte
Richtlinie bedeutet:

* Python 3.9 bis 3.12 haben eineinhalb Jahre volle Unterstützung,
  danach dreieinhalb Jahre Sicherheitskorrekturen.

* Python 3.13 und später haben zwei Jahre volle Unterstützung, danach
  drei Jahre Sicherheitskorrekturen.


Neue Funktionen
===============


Eine bessere interaktive Shell
------------------------------

Python verwendet jetzt standardmäßig eine neue *interaktive* Shell,
die auf Code aus dem PyPy project aufbaut. Startet man die *REPL* von
einem interaktiven Terminal aus, werden jetzt die folgenden neuen
Features unterstützt:

* Mehrzeiliges Bearbeiten mit erhaltener Chronik.

* Unmittelbare Unterstützung für REPL-eigene Befehle wie "help",
  "exit" und "quit", ohne sie als Funktionen aufrufen zu müssen.

* Eingabeaufforderungen und Rückverfolgungen mit standardmäßig
  eingeschalteter Farbe.

* Interaktives Blättern in der Hilfe über "F1", mit eigener
  Befehlschronik.

* Blättern in der Chronik über "F2", das die Ausgabe sowie die
  Eingabeaufforderungen *>>>* und *...* überspringt.

* Ein „Einfügemodus“ über "F3", der das Einfügen größerer Codeblöcke
  erleichtert ("F3" erneut drücken, um zur gewöhnlichen
  Eingabeaufforderung zurückzukehren).

Um die neue interaktive Shell abzuschalten, setze die
Umgebungsvariable "PYTHON_BASIC_REPL". Mehr zum interaktiven Modus
unter Interaktiver Modus.

(Beigetragen von Pablo Galindo Salgado, Łukasz Langa und Lysandros
Nikolaou in gh-111201, auf der Grundlage von Code aus dem PyPy-
Projekt. Die Unterstützung für Windows wurde von Dino Viehland und
Anthony Shaw beigetragen.)


Verbesserte Fehlermeldungen
---------------------------

* Der Interpreter verwendet jetzt standardmäßig Farbe, wenn er
  Rückverfolgungen im Terminal anzeigt. Dieses Feature lässt sich
  steuern, über die neue Umgebungsvariable "PYTHON_COLORS" sowie über
  die gängigen Umgebungsvariablen "NO_COLOR" und "FORCE_COLOR".
  (Beigetragen von Pablo Galindo Salgado in gh-112730.)

* Ein häufiger Fehler ist, ein Skript so zu benennen wie ein Modul der
  Standardbibliothek. Führt das zu Fehlern, zeigen wir jetzt eine
  hilfreichere Fehlermeldung an:

     $ python random.py
     Traceback (most recent call last):
       File "/home/me/random.py", line 1, in <module>
         import random
       File "/home/me/random.py", line 3, in <module>
         print(random.randint(5))
               ^^^^^^^^^^^^^^
     AttributeError: module 'random' has no attribute 'randint' (consider renaming '/home/me/random.py' since it has the same name as the standard library module named 'random' and prevents importing that standard library module)

  Ebenso zeigen wir eine hilfreichere Fehlermeldung an, wenn ein
  Skript so heißt wie ein Modul eines Dritten, das es zu importieren
  versucht, und das zu Fehlern führt:

     $ python numpy.py
     Traceback (most recent call last):
       File "/home/me/numpy.py", line 1, in <module>
         import numpy as np
       File "/home/me/numpy.py", line 3, in <module>
         np.array([1, 2, 3])
         ^^^^^^^^
     AttributeError: module 'numpy' has no attribute 'array' (consider renaming '/home/me/numpy.py' if it has the same name as a library you intended to import)

  (Beigetragen von Shantanu Jain in gh-95754.)

* Die Fehlermeldung versucht jetzt, das richtige Schlüsselwortargument
  vorzuschlagen, wenn einer Funktion ein falsches
  Schlüsselwortargument übergeben wird.

     >>> "Better error messages!".split(max_split=1)
     Traceback (most recent call last):
       File "<python-input-0>", line 1, in <module>
         "Better error messages!".split(max_split=1)
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
     TypeError: split() got an unexpected keyword argument 'max_split'. Did you mean 'maxsplit'?

  (Beigetragen von Pablo Galindo Salgado und Shantanu Jain in
  gh-107944.)


Free-Threaded CPython
---------------------

CPython unterstützt jetzt versuchsweise den Betrieb in einem Free-
Threaded-Modus, mit abgeschaltetem *Global Interpreter Lock* (GIL).
Das ist ein Feature im Versuchsstadium und daher nicht standardmäßig
eingeschaltet. Der Free-Threaded-Modus braucht eine andere ausführbare
Datei, üblicherweise "python3.13t" oder "python3.13t.exe".
Vorgefertigte Binärpakete, die als *free-threaded* gekennzeichnet
sind, lassen sich als Teil der offiziellen Installationsprogramme für
Windows und macOS installieren. Alternativ lässt sich CPython mit der
Option "--disable-gil" aus dem Quellcode bauen.

Free-Threaded-Ausführung erlaubt es, die verfügbare Rechenleistung
voll auszuschöpfen, indem Threads parallel auf den vorhandenen CPU-
Kernen laufen. Nicht jede Software profitiert davon von sich aus, aber
Programme, die von Anfang an auf Threads ausgelegt sind, laufen auf
Mehrkern-Hardware schneller. **Der Free-Threaded-Modus ist ein
Versuch**, und die Arbeit an seiner Verbesserung läuft weiter: Rechne
mit einigen Fehlern und einem erheblichen Geschwindigkeitsverlust bei
einem einzelnen Thread. Free-Threaded-Builds von CPython erlauben
wahlweise den Betrieb mit zur Laufzeit eingeschaltetem GIL, über die
Umgebungsvariable "PYTHON_GIL" oder die Befehlszeilenoption "-X
gil=1".

Um zu prüfen, ob der laufende Interpreter Free-Threading unterstützt,
enthalten "python -VV" und "sys.version" den Text „experimental free-
threading build“. Mit der neuen Funktion "sys._is_gil_enabled()" lässt
sich prüfen, ob das GIL im laufenden Prozess tatsächlich abgeschaltet
ist.

Erweiterungsmodule der C-API müssen eigens für den Free-Threaded-Build
gebaut werden. Erweiterungen, die den Betrieb mit abgeschaltetem *GIL*
unterstützen, sollten den Slot "Py_mod_gil" verwenden. Erweiterungen
mit einphasiger Initialisierung sollten "PyUnstable_Module_SetGIL()"
verwenden, um anzuzeigen, ob sie den Betrieb mit abgeschaltetem GIL
unterstützen. Importiert man C-Erweiterungen, die diese Mechanismen
nicht verwenden, wird das GIL eingeschaltet, sofern es nicht
ausdrücklich über die Umgebungsvariable "PYTHON_GIL" oder die Option
"-X gil=0" abgeschaltet wurde. Um Pakete mit C-Erweiterungen im Free-
Threaded-Build zu installieren, wird pip 24.1 oder neuer benötigt.

Möglich wurde diese Arbeit durch viele Einzelpersonen und
Organisationen, darunter die große Gemeinschaft derer, die zu Python
und zu Projekten Dritter beigetragen haben, um die Unterstützung für
Free-Threading zu testen und zu ermöglichen. Zu den wichtigsten
Beitragenden gehören Sam Gross, Ken Jin, Donghee Na, Itamar Oren, Matt
Page, Brett Simmers, Dino Viehland, Carl Meyer, Nathan Goldbaum, Ralf
Gommers, Lysandros Nikolaou und viele weitere. Viele von ihnen sind
bei Meta angestellt, das erhebliche Entwicklungsressourcen zur
Unterstützung dieses Projekts bereitgestellt hat.

Siehe auch:

  **PEP 703** „Making the Global Interpreter Lock Optional in CPython“
  enthält die Begründung und weitere Informationen zu dieser Arbeit.

  Erweiterungsmodule auf Free-Threading portieren: ein von der
  Gemeinschaft gepflegter Portierungsleitfaden für Autoren von
  Erweiterungen.


Ein versuchsweiser Just-in-time-Compiler (JIT)
----------------------------------------------

Wird CPython mit der Option "--enable-experimental-jit" konfiguriert
und gebaut, kommt ein Just-in-time-Compiler (JIT) hinzu, der manche
Python-Programme beschleunigen kann. Unter Windows schaltet
"PCbuild/build.bat --experimental-jit" den JIT ein und "--
experimental-jit-interpreter" den Tier-2-Interpreter. Die
Voraussetzungen für den Build und weitere Hinweise dazu stehen in
"Tools/jit/README.md".

Die Option "--enable-experimental-jit" nimmt die folgenden
(optionalen) Werte an. Ohne den optionalen Wert gilt "yes", wenn "--
enable-experimental-jit" angegeben ist.

* "no": schaltet die gesamte Tier-2- und JIT-Verarbeitung ab.

* "yes": schaltet den JIT ein. Um den JIT zur Laufzeit abzuschalten,
  übergib die Umgebungsvariable "PYTHON_JIT=0".

* "yes-off": baut den JIT, schaltet ihn aber standardmäßig ab. Um den
  JIT zur Laufzeit einzuschalten, übergib die Umgebungsvariable
  "PYTHON_JIT=1".

* "interpreter": schaltet den Tier-2-Interpreter ein, aber den JIT ab.
  Der Interpreter lässt sich abschalten, indem man mit "PYTHON_JIT=0"
  arbeitet.

Die innere Architektur sieht grob so aus:

* Wir beginnen mit spezialisiertem *Tier-1-Bytecode*. Einzelheiten
  unter Was ist neu in 3.11.

* Wird der Tier-1-Bytecode heiß genug, wird er in eine neue, rein
  interne Zwischendarstellung (IR) übersetzt, die *Tier-2-IR*,
  manchmal auch Micro-Ops („Uops“) genannt.

* Die Tier-2-IR verwendet dieselbe stapelbasierte virtuelle Maschine
  wie Tier 1, das Anweisungsformat eignet sich aber besser für die
  Übersetzung in Maschinencode.

* Für die Tier-2-IR gibt es mehrere Optimierungsdurchläufe, die
  angewendet werden, bevor sie interpretiert oder in Maschinencode
  übersetzt wird.

* Es gibt einen Tier-2-Interpreter, er ist aber vor allem dazu
  gedacht, die früheren Stufen der Optimierung zu untersuchen.
  Einschalten lässt sich der Tier-2-Interpreter, indem man Python mit
  "--enable-experimental-jit=interpreter" konfiguriert.

* Ist der JIT eingeschaltet, wird die optimierte Tier-2-IR in
  Maschinencode übersetzt, der dann ausgeführt wird.

* Die Übersetzung in Maschinencode arbeitet mit einem Verfahren namens
  *copy-and-patch*. Zur Laufzeit bringt es keine Abhängigkeiten mit,
  zur Build-Zeit kommt aber eine neue Abhängigkeit von LLVM hinzu.

Siehe auch: **PEP 744**

(JIT von Brandt Bucher, angeregt durch eine Arbeit von Haoran Xu und
Fredrik Kjolstad. Tier-2-IR von Mark Shannon und Guido van Rossum.
Tier-2-Optimierer von Ken Jin.)


Festgelegte Semantik für Änderungen an "locals()"
-------------------------------------------------

Bisher war es den einzelnen Python-Implementierungen überlassen,
festzulegen, was zu erwarten ist, wenn der Rückgabewert von "locals()"
verändert wird. Ab Python 3.13 vereinheitlicht **PEP 667** das
bisherige Verhalten von CPython für die meisten Geltungsbereiche, in
denen Code ausgeführt wird, ändert aber *optimierte Geltungsbereiche*
(Funktionen, Generatoren, Coroutinen, Comprehensions und
Generatorausdrücke) dahin, dass sie ausdrücklich eigenständige
Momentaufnahmen der derzeit zugewiesenen lokalen Variablen
zurückgeben, einschließlich lokal referenzierter nichtlokaler
Variablen, die in Closures eingefangen sind.

Diese Änderung an der Semantik von "locals()" in optimierten
Geltungsbereichen wirkt sich auch auf das voreingestellte Verhalten
jener Funktionen aus, die Code ausführen und dabei stillschweigend auf
"locals()" zielen, wenn kein Namensraum ausdrücklich angegeben ist
(etwa "exec()" und "eval()"). In früheren Versionen war es von der
Implementierung abhängig, ob auf Änderungen zugegriffen werden konnte,
indem man "locals()" nach dem Aufruf der Code ausführenden Funktion
aufrief. In CPython schien solcher Code üblicherweise wie gewünscht zu
arbeiten, konnte aber in optimierten Geltungsbereichen manchmal
fehlschlagen, weil anderer Code (darunter Debugger und Werkzeuge zur
Ablaufverfolgung) die gemeinsam genutzte Momentaufnahme in diesem
Geltungsbereich zurücksetzen konnte. Jetzt arbeitet der Code in
optimierten Geltungsbereichen immer gegen eine eigenständige
Momentaufnahme der lokalen Variablen, und die Änderungen sind daher in
späteren Aufrufen von "locals()" nie sichtbar. Um in diesen Fällen auf
die vorgenommenen Änderungen zuzugreifen, muss der betreffenden
Funktion jetzt ausdrücklich ein Namensraum übergeben werden. Es kann
auch sinnvoll sein, betroffenen Code auf eine höher gelegene API zum
Ausführen von Code umzustellen, die den entstandenen Namensraum
zurückgibt (etwa "runpy.run_path()", um Python-Dateien von der
Festplatte auszuführen).

Damit Debugger und ähnliche Werkzeuge lokale Variablen in den von
dieser Änderung betroffenen Geltungsbereichen verlässlich
aktualisieren können, gibt "FrameType.f_locals" in diesen
Geltungsbereichen jetzt einen durchschreibenden Stellvertreter auf die
lokalen und die lokal referenzierten nichtlokalen Variablen des
Rahmens zurück, statt eine ungleichmäßig aktualisierte, gemeinsam
genutzte "dict"-Instanz mit unbestimmter Semantik zur Laufzeit.

Näheres unter **PEP 667**, einschließlich der zugehörigen Änderungen
und Abkündigungen in der C-API. Hinweise zur Portierung stehen
außerdem weiter unten bei den betroffenen Python-APIs und C-APIs.

(PEP und Umsetzung beigetragen von Mark Shannon und Tian Gao in
gh-74929. Aktualisierungen der Dokumentation von Guido van Rossum und
Alyssa Coghlan.)


Unterstützung für mobile Plattformen
------------------------------------

**PEP 730**: iOS ist jetzt eine nach **PEP 11** unterstützte
Plattform, mit den Zielen "arm64-apple-ios" und "arm64-apple-ios-
simulator" auf Stufe 3 (iPhone- und iPad-Geräte, die nach 2013
erschienen sind, beziehungsweise der iOS-Simulator von Xcode auf
Apple-Silicon-Hardware). "x86_64-apple-ios-simulator" (der iOS-
Simulator von Xcode auf älterer "x86_64"-Hardware) ist keine auf Stufe
3 unterstützte Plattform, wird aber nach Kräften unterstützt. (PEP
verfasst und Umsetzung beigetragen von Russell Keith-Magee in
gh-114099.)

**PEP 738**: Android ist jetzt eine nach **PEP 11** unterstützte
Plattform, mit den Zielen "aarch64-linux-android" und "x86_64-linux-
android" auf Stufe 3. Die 32-Bit-Ziele "arm-linux-androideabi" und
"i686-linux-android" sind keine auf Stufe 3 unterstützten Plattformen,
werden aber nach Kräften unterstützt. (PEP verfasst und Umsetzung
beigetragen von Malcolm Smith in gh-116622.)

Siehe auch: **PEP 730**, **PEP 738**


Andere sprachliche Änderungen
=============================

* Der Compiler entfernt jetzt den gemeinsamen führenden Leerraum aus
  jeder Zeile eines Docstrings. Das verkleinert den *Bytecode-
  Zwischenspeicher* (etwa ".pyc"-Dateien) um etwa 5 % an Dateigröße,
  zum Beispiel bei "sqlalchemy.orm.session" aus SQLAlchemy 2.0. Diese
  Änderung betrifft Werkzeuge, die Docstrings verwenden, etwa
  "doctest".

     >>> def spam():
     ...     """
     ...         This is a docstring with
     ...           leading whitespace.
     ...
     ...         It even has multiple paragraphs!
     ...     """
     ...
     >>> spam.__doc__
     '\nThis is a docstring with\n  leading whitespace.\n\nIt even has multiple paragraphs!\n'

  (Beigetragen von Inada Naoki in gh-81283.)

* Annotationsgeltungsbereiche innerhalb von Klassengeltungsbereichen
  dürfen jetzt Lambdas und Comprehensions enthalten. Comprehensions,
  die in einem Klassengeltungsbereich liegen, werden nicht in den
  übergeordneten Geltungsbereich eingebettet.

     class C[T]:
         type Alias = lambda: T

  (Beigetragen von Jelle Zijlstra in gh-109118 und gh-118160.)

* Future-Anweisungen werden nicht mehr durch relative Importe des
  Moduls "__future__" ausgelöst, das heißt, Anweisungen der Form "from
  .__future__ import ..." sind jetzt einfach gewöhnliche relative
  Importe, bei denen keine besonderen Features eingeschaltet werden.
  (Beigetragen von Jeremiah Gabriel Pascual in gh-118216.)

* "global"-Deklarationen sind jetzt in "except"-Blöcken erlaubt, wenn
  diese globale Variable im "else"-Block verwendet wird. Vorher löste
  das irrtümlich einen "SyntaxError" aus. (Beigetragen von Irit
  Katriel in gh-111123.)

* "PYTHON_FROZEN_MODULES" ist hinzugekommen, eine neue
  Umgebungsvariable, die bestimmt, ob eingefrorene Module von der
  Importmaschinerie übergangen werden. Sie entspricht der
  Befehlszeilenoption "-X frozen_modules". (Beigetragen von Yilei Yang
  in gh-111374.)

* Unterstützung für den perf-Profiler ohne Frame-Pointer ist
  hinzugekommen, über die neue Umgebungsvariable
  "PYTHON_PERF_JIT_SUPPORT" und die Befehlszeilenoption "-X perf_jit".
  (Beigetragen von Pablo Galindo in gh-118518.)

* Der Ort einer ".python_history"-Datei lässt sich über die neue
  Umgebungsvariable "PYTHON_HISTORY" ändern. (Beigetragen von Levi
  Sabah, Zackery Spytz und Hugo van Kemenade in gh-73965.)

* Klassen haben ein neues Attribut "__static_attributes__". Der
  Compiler füllt es mit einem Tupel der Attributnamen der Klasse, die
  in einer Funktion in ihrem Körper über "self.<name>" zugewiesen
  werden. (Beigetragen von Irit Katriel in gh-115775.)

* Der Compiler erzeugt an Klassen jetzt ein Attribut "__firstlineno__"
  mit der Zeilennummer der ersten Zeile der Klassendefinition.
  (Beigetragen von Serhiy Storchaka in gh-118465.)

* Die eingebauten Funktionen "exec()" und "eval()" nehmen die
  Argumente *globals* und *locals* jetzt auch als
  Schlüsselwortargumente an. (Beigetragen von Raphael Gaschignard in
  gh-105879)

* Die eingebaute Funktion "compile()" nimmt jetzt einen neuen Schalter
  "ast.PyCF_OPTIMIZED_AST" an, der "ast.PyCF_ONLY_AST" gleicht, außer
  dass der zurückgegebene AST entsprechend dem Wert des Arguments
  *optimize* optimiert wird. (Beigetragen von Irit Katriel in
  gh-108113).

* An "property"-Objekten ist ein Attribut "__name__" hinzugekommen.
  (Beigetragen von Eugene Toder in gh-101860.)

* "PythonFinalizationError" ist hinzugekommen, eine neue von
  "RuntimeError" abgeleitete Ausnahme, die anzeigt, dass Operationen
  während der *Finalisierung* blockiert sind. Die folgenden
  aufrufbaren Objekte lösen jetzt "PythonFinalizationError" aus statt
  "RuntimeError":

  * "_thread.start_new_thread()"

  * "os.fork()"

  * "os.forkpty()"

  * "subprocess.Popen"

  (Beigetragen von Victor Stinner in gh-114570.)

* Das Argument *count* von "str.replace()" darf jetzt ein
  Schlüsselwortargument sein. (Beigetragen von Hugo van Kemenade in
  gh-106487.)

* Viele Funktionen geben jetzt eine Warnung aus, wenn ein boolescher
  Wert als Argument für einen Dateideskriptor übergeben wird. Damit
  lassen sich manche Fehler früher erkennen. (Beigetragen von Serhiy
  Storchaka in gh-82626.)

* Die Attribute "name" und "mode" sind für komprimierte und
  archivierte dateiähnliche Objekte in den Modulen "bz2", "lzma",
  "tarfile" und "zipfile" hinzugekommen. (Beigetragen von Serhiy
  Storchaka in gh-115961.)


Neue Module
===========

* "dbm.sqlite3": ein SQLite-Backend für "dbm". (Beigetragen von
  Raymond Hettinger und Erlend E. Aasland in gh-100414.)


Verbesserte Module
==================


argparse
--------

* Der Parameter *deprecated* ist zu den Methoden "add_argument()" und
  "add_parser()" hinzugekommen, um Befehlszeilenoptionen,
  positionsbezogene Argumente und Unterbefehle als veraltet markieren
  zu können. (Beigetragen von Serhiy Storchaka in gh-83648.)


Array
-----

* Der Typcode "'w'" ("Py_UCS4") für Unicode-Zeichen ist hinzugekommen.
  Er sollte an der Stelle des als veraltet markierten Typcodes "'u'"
  verwendet werden. (Beigetragen von Inada Naoki in gh-80480.)

* "array.array" ist als "MutableSequence" angemeldet, indem die
  Methode "clear()" umgesetzt wurde. (Beigetragen von Mike Zimin in
  gh-114894.)


ast
---

* Die Konstruktoren der Knotentypen im Modul "ast" sind jetzt strenger
  bei den Argumenten, die sie annehmen, und verhalten sich
  eingängiger, wenn Argumente weggelassen werden.

  Wird ein optionales Feld eines AST-Knotens beim Erzeugen einer
  Instanz nicht als Argument angegeben, wird das Feld jetzt auf "None"
  gesetzt. Ebenso wird ein weggelassenes Listenfeld jetzt auf eine
  leere Liste gesetzt, und ein weggelassenes "expr_context"-Feld auf
  "Load()". (Vorher fehlte das Attribut in allen diesen Fällen an der
  neu erzeugten AST-Knoteninstanz.)

  In allen anderen Fällen, in denen ein benötigtes Argument
  weggelassen wird, gibt der Knotenkonstruktor eine
  "DeprecationWarning" aus. In Python 3.15 wird daraus eine Ausnahme.
  Ebenso ist es jetzt als veraltet markiert, dem Konstruktor ein
  Schlüsselwortargument zu übergeben, das keinem Feld des AST-Knotens
  entspricht. In Python 3.15 wird daraus eine Ausnahme.

  Diese Änderungen gelten nicht für selbst definierte Unterklassen von
  "ast.AST", es sei denn, die Klasse entscheidet sich für das neue
  Verhalten, indem sie das Mapping "AST._field_types" definiert.

  (Beigetragen von Jelle Zijlstra in gh-105858, gh-117486 und
  gh-118851.)

* "ast.parse()" nimmt jetzt ein optionales Argument *optimize* an, das
  an "compile()" weitergegeben wird. Damit lässt sich ein optimierter
  AST gewinnen. (Beigetragen von Irit Katriel in gh-108113.)


asyncio
-------

* "asyncio.as_completed()" gibt jetzt ein Objekt zurück, das sowohl
  ein *asynchroner Iterator* als auch ein gewöhnlicher *Iterator* über
  *Awaitables* ist. Zu den Awaitables, die die asynchrone Iteration
  liefert, gehören die ursprünglich übergebenen Auftrags- oder Future-
  Objekte, wodurch sich Ergebnisse leichter den jeweils
  abgeschlossenen Aufträgen zuordnen lassen. (Beigetragen von Justin
  Arthur in gh-77714.)

* "asyncio.loop.create_unix_server()" entfernt den Unix-Socket jetzt
  selbsttätig, wenn der Server geschlossen wird. (Beigetragen von
  Pierre Ossman in gh-111246.)

* "DatagramTransport.sendto()" sendet jetzt Datagramme der Länge null,
  wenn es mit einem leeren bytes-Objekt aufgerufen wird. Die
  Flusssteuerung des Transports berücksichtigt bei der Berechnung der
  Puffergröße jetzt außerdem den Datagramm-Kopf. (Beigetragen von
  Jamie Phan in gh-115199.)

* "Queue.shutdown" und "QueueShutDown" sind hinzugekommen, um das
  Beenden einer Warteschlange zu steuern. (Beigetragen von Laurie
  Opperman und Yves Duprat in gh-104228.)

* Die Methoden "Server.close_clients()" und "Server.abort_clients()"
  sind hinzugekommen. Sie schließen einen asyncio-Server
  nachdrücklicher. (Beigetragen von Pierre Ossman in gh-113538.)

* "StreamReader.readuntil()" nimmt jetzt ein Tupel von Trennzeichen an
  und hält an, sobald eines von ihnen auftritt. (Beigetragen von Bruce
  Merry in gh-81322.)

* Das Verhalten von "TaskGroup" ist verbessert, wenn ein Abbruch von
  außen mit einem internen Abbruch zusammentrifft. Waren zum Beispiel
  zwei Auftragsgruppen verschachtelt und trat in beiden gleichzeitig
  eine Ausnahme in einem Kindauftrag auf, konnte die äußere
  Auftragsgruppe hängen bleiben, weil ihr interner Abbruch von der
  inneren Auftragsgruppe verschluckt wurde.

  Wird eine Auftragsgruppe von außen abgebrochen und muss zugleich
  eine "ExceptionGroup" auslösen, ruft sie jetzt die Methode
  "cancel()" des übergeordneten Auftrags auf. Damit ist
  sichergestellt, dass beim nächsten "await" ein "CancelledError"
  ausgelöst wird und der Abbruch nicht verloren geht.

  Ein weiterer Vorteil dieser Änderungen ist, dass Auftragsgruppen
  jetzt den Abbruchzähler ("cancelling()") erhalten.

  Um einige Randfälle zu behandeln, darf "uncancel()" den nicht
  dokumentierten Schalter "_must_cancel" jetzt zurücksetzen, wenn der
  Abbruchzähler null erreicht.

  (Angeregt durch ein von Arthur Tacca in gh-116720 gemeldetes
  Problem.)

* Wird "TaskGroup.create_task()" auf einer nicht aktiven "TaskGroup"
  aufgerufen, wird die übergebene Coroutine geschlossen (was eine
  "RuntimeWarning" darüber verhindert, dass die übergebene Coroutine
  nie erwartet wurde). (Beigetragen von Arthur Tacca und Jason Zhang
  in gh-115957.)

* Die Funktion und die Methoden namens "create_task" haben ein neues
  Argument "**kwargs" erhalten, das an den Auftragskonstruktor
  weitergegeben wird. Diese Änderung kam in 3.13.3 versehentlich hinzu
  und brach den API-Vertrag für eigene Auftrags-Factorys. Mehrere
  Auftrags-Factorys von Dritten haben Umgehungen dafür umgesetzt. In
  3.13.4 und späteren Veröffentlichungen gilt der alte Vertrag der
  Factorys wieder (bis 3.14). Damit die Umgehungen weiter
  funktionieren, erlaubt das zusätzliche Argument "**kwargs"
  weiterhin, zusätzliche Schlüsselwortargumente an "Task" und an
  eigene Auftrags-Factorys zu übergeben.

  Betroffen sind die folgende Funktion und die folgenden Methoden:
  "asyncio.create_task()", "asyncio.loop.create_task()",
  "asyncio.TaskGroup.create_task()". (Beigetragen von Thomas Grainger
  in gh-128307.)


base64
------

* Die Funktionen "z85encode()" und "z85decode()" sind hinzugekommen,
  um "bytes" als Z85 data zu kodieren und Z85-kodierte Daten nach
  "bytes" zu dekodieren. (Beigetragen von Matan Perelman in gh-75299.)


compileall
----------

* Die voreingestellte Anzahl der Arbeits-Threads und -Prozesse wird
  jetzt mit "os.process_cpu_count()" statt mit "os.cpu_count()"
  bestimmt. (Beigetragen von Victor Stinner in gh-109649.)


concurrent.futures
------------------

* Die voreingestellte Anzahl der Arbeits-Threads und -Prozesse wird
  jetzt mit "os.process_cpu_count()" statt mit "os.cpu_count()"
  bestimmt. (Beigetragen von Victor Stinner in gh-109649.)


configparser
------------

* "ConfigParser" unterstützt jetzt unbenannte Abschnitte, womit
  Schlüssel-Wert-Paare auf oberster Ebene möglich sind. Einschalten
  lässt sich das über den neuen Parameter *allow_unnamed_section*.
  (Beigetragen von Pedro Sousa Lacerda in gh-66449.)


copy
----

* Die neue Funktion "replace()" und das "Replace-Protokoll" machen es
  viel einfacher, geänderte Kopien von Objekten zu erzeugen. Besonders
  nützlich ist das bei unveränderlichen Objekten. Die folgenden Typen
  unterstützen die Funktion "replace()" und setzen das Replace-
  Protokoll um:

  * "collections.namedtuple()"

  * "dataclasses.dataclass"

  * "datetime.datetime", "datetime.date", "datetime.time"

  * "inspect.Signature", "inspect.Parameter"

  * "types.SimpleNamespace"

  * Code-Objekte

  Jede selbst definierte Klasse kann "copy.replace()" ebenfalls
  unterstützen, indem sie die Methode "__replace__()" definiert.
  (Beigetragen von Serhiy Storchaka in gh-108751.)


ctypes
------

* Als Folge eines nötigen internen Umbaus geschieht die
  Initialisierung interner Metaklassen jetzt in "__init__" statt in
  "__new__". Das betrifft Projekte, die von diesen internen
  Metaklassen ableiten, um eigene Initialisierung bereitzustellen.
  Allgemein gilt:

  * Eigene Logik, die in "__new__" nach dem Aufruf von
    "super().__new__" ausgeführt wurde, sollte nach "__init__"
    wandern.

  * Um eine Klasse zu erzeugen, rufe die Metaklasse auf, nicht nur die
    Methode "__new__" der Metaklasse.

  Zur Diskussion und zu Verweisen auf Änderungen in einigen
  betroffenen Projekten siehe gh-124520.

* "ctypes.Structure"-Objekte haben ein neues Attribut "_align_", mit
  dem sich die Ausrichtung der Struktur beim Packen in den und aus dem
  Speicher ausdrücklich angeben lässt. (Beigetragen von Matt Sanderson
  in gh-112433)


dbm
---

* "dbm.sqlite3" ist hinzugekommen, ein neues Modul, das ein SQLite-
  Backend umsetzt und jetzt das voreingestellte Backend von "dbm" ist.
  (Beigetragen von Raymond Hettinger und Erlend E. Aasland in
  gh-100414.)

* Über die neuen "clear()"-Methoden der GDBM- und NDBM-
  Datenbankobjekte lassen sich jetzt alle Einträge aus der Datenbank
  entfernen. (Beigetragen von Donghee Na in gh-107122.)


dis
---

* Die Ausgabe der Funktionen des Moduls "dis" zeigt für Sprungziele
  und Ausnahmebehandler jetzt logische Marken statt Offsets. Die
  Offsets lassen sich über die neue Befehlszeilenoption "-O" oder das
  Argument *show_offsets* hinzufügen. (Beigetragen von Irit Katriel in
  gh-112137.)

* "get_instructions()" stellt Einträge des Zwischenspeichers nicht
  mehr als eigene Anweisungen dar. Stattdessen gibt es sie als Teil
  der "Instruction" im neuen Feld *cache_info* zurück. Das Argument
  *show_caches* von "get_instructions()" ist als veraltet markiert und
  hat keine Wirkung mehr. (Beigetragen von Irit Katriel in gh-112962.)


doctest
-------

* Die Ausgabe von "doctest" ist jetzt standardmäßig farbig. Steuern
  lässt sich das über die neue Umgebungsvariable "PYTHON_COLORS" sowie
  über die gängigen Umgebungsvariablen "NO_COLOR" und "FORCE_COLOR".
  Siehe auch Farbsteuerung. (Beigetragen von Hugo van Kemenade in
  gh-117225.)

* Die Methode "DocTestRunner.run()" zählt jetzt die Anzahl der
  übersprungenen Tests. Die Attribute "DocTestRunner.skips" und
  "TestResults.skipped" sind hinzugekommen. (Beigetragen von Victor
  Stinner in gh-108794.)


email
-----

* Kopfzeilen mit eingebetteten Zeilenumbrüchen werden bei der Ausgabe
  jetzt in Anführungszeichen gesetzt. Der "generator" weigert sich
  jetzt, Kopfzeilen zu serialisieren (zu schreiben), die unsauber
  umbrochen oder begrenzt sind, sodass sie als mehrere Kopfzeilen
  ausgewertet oder mit angrenzenden Daten verbunden würden. Wenn du
  dieses Sicherheitsfeature abschalten musst, setze
  "verify_generated_headers". (Beigetragen von Bas Bloemsaat und Petr
  Viktorin in gh-121650.)

* "getaddresses()" und "parseaddr()" geben jetzt in mehr Fällen, in
  denen ungültige E-Mail-Adressen auftreten, Paare "('', '')" zurück
  statt möglicherweise unzutreffender Werte. Die beiden Funktionen
  haben einen neuen optionalen Parameter *strict* (Voreinstellung
  "True"). Um das alte Verhalten zu bekommen (unsaubere Eingaben
  werden angenommen), verwende "strict=False". Mit
  "getattr(email.utils, 'supports_strict_parsing', False)" lässt sich
  prüfen, ob der Parameter *strict* verfügbar ist. (Beigetragen von
  Thomas Dwyer und Victor Stinner für gh-102988, um die Korrektur zu
  **CVE 2023-27043** zu verbessern.)


enum
----

* "EnumDict" ist öffentlich geworden, um das Ableiten von "EnumType"
  besser zu unterstützen.


fractions
---------

* "Fraction"-Objekte unterstützen jetzt die gewöhnlichen Regeln der
  Mini-Sprache für Formatangaben für Füllzeichen, Ausrichtung,
  Vorzeichenbehandlung, Mindestbreite und Gruppierung. (Beigetragen
  von Mark Dickinson in gh-111320.)


glob
----

* "translate()" ist hinzugekommen, eine Funktion, die eine Pfadangabe
  mit Jokerzeichen im Shell-Stil in einen regulären Ausdruck
  umwandelt. (Beigetragen von Barney Gale in gh-72904.)


importlib
---------

* Die folgenden Funktionen in "importlib.resources" erlauben jetzt den
  Zugriff auf ein Verzeichnis (oder einen Baum) von Ressourcen, über
  mehrere positionsbezogene Argumente (die Argumente *encoding* und
  *errors* der Funktionen zum Lesen von Text sind jetzt nur noch als
  Schlüsselwortargumente möglich):

  * "is_resource()"

  * "open_binary()"

  * "open_text()"

  * "path()"

  * "read_binary()"

  * "read_text()"

  Diese Funktionen sind nicht mehr als veraltet markiert, und ihre
  Entfernung ist nicht geplant. (Beigetragen von Petr Viktorin in
  gh-116608.)

* "contents()" bleibt als veraltet markiert, zugunsten der
  vollwertigen API "Traversable". Es ist jetzt allerdings nicht
  geplant, sie zu entfernen. (Beigetragen von Petr Viktorin in
  gh-116608.)


io
--

* Der Finalizer von "IOBase" protokolliert Fehler, die die Methode
  "close()" auslöst, jetzt über "sys.unraisablehook". Vorher wurden
  Fehler standardmäßig stillschweigend übergangen und nur im Python-
  Entwicklungsmodus oder in einem Debug-Build von Python
  protokolliert. (Beigetragen von Victor Stinner in gh-62948.)


ipaddress
---------

* Die Eigenschaft "IPv4Address.ipv6_mapped" ist hinzugekommen. Sie
  gibt die als IPv6 abgebildete IPv4-Adresse zurück. (Beigetragen von
  Charles Machalow in gh-109466.)

* Das Verhalten von "is_global" und "is_private" in "IPv4Address",
  "IPv6Address", "IPv4Network" und "IPv6Network" ist ausgebessert.
  (Beigetragen von Jakub Stasiak in gh-113171.)


itertools
---------

* "batched()" hat einen neuen Parameter *strict*, der einen
  "ValueError" auslöst, wenn die letzte Teilmenge kürzer ist als die
  angegebene Größe. (Beigetragen von Raymond Hettinger in gh-113202.)


marshal
-------

* Der Parameter *allow_code* ist in den Modulfunktionen hinzugekommen.
  "allow_code=False" zu übergeben verhindert das Serialisieren und
  Deserialisieren von Code-Objekten, die zwischen Python-Versionen
  unverträglich sind. (Beigetragen von Serhiy Storchaka in gh-113626.)


math
----

* Die neue Funktion "fma()" führt verschmolzene Multiplikations-
  Additionen aus. Sie berechnet "x * y + z" mit nur einer einzigen
  Rundung und vermeidet damit jeden Genauigkeitsverlust im
  Zwischenergebnis. Sie hüllt die von C99 bereitgestellte Funktion
  "fma()" ein und folgt bei Sonderfällen der Spezifikation der
  IEEE-754-Operation „fusedMultiplyAdd“. (Beigetragen von Mark
  Dickinson und Victor Stinner in gh-73468.)


mimetypes
---------

* Die Funktion "guess_file_type()" ist hinzugekommen, um einen MIME-
  Typ aus einem Dateisystempfad zu erraten. Pfade mit "guess_type()"
  zu verwenden ist jetzt *sanft abgekündigt*. (Beigetragen von Serhiy
  Storchaka in gh-66543.)


mmap
----

* "mmap" ist jetzt davor geschützt, unter Windows abzustürzen, wenn
  der abgebildete Speicher wegen Dateisystemfehlern oder
  Zugriffsverletzungen nicht erreichbar ist. (Beigetragen von Jannis
  Weigend in gh-118209.)

* "mmap" hat eine neue Methode "seekable()", die sich verwenden lässt,
  wenn ein dateiähnliches Objekt mit Positionierung benötigt wird. Die
  Methode "seek()" gibt jetzt die neue absolute Position zurück.
  (Beigetragen von Donghee Na und Sylvie Liberman in gh-111835.)

* Der neue, nur unter UNIX verfügbare Parameter *trackfd* von "mmap"
  steuert das Vervielfachen des Dateideskriptors. Ist er falsch, wird
  der mit *fileno* angegebene Dateideskriptor nicht vervielfacht.
  (Beigetragen von Zackery Spytz und Petr Viktorin in gh-78502.)


multiprocessing
---------------

* Die voreingestellte Anzahl der Arbeits-Threads und -Prozesse wird
  jetzt mit "os.process_cpu_count()" statt mit "os.cpu_count()"
  bestimmt. (Beigetragen von Victor Stinner in gh-109649.)


os
--

* Die Funktion "process_cpu_count()" ist hinzugekommen, um die Anzahl
  der logischen CPU-Kerne zu ermitteln, die der aufrufende Thread des
  aktuellen Prozesses nutzen kann. (Beigetragen von Victor Stinner in
  gh-109649.)

* "cpu_count()" und "process_cpu_count()" lassen sich über die neue
  Umgebungsvariable "PYTHON_CPU_COUNT" oder die neue
  Befehlszeilenoption "-X cpu_count" überschreiben. Diese Option ist
  nützlich, wenn man die CPU-Ressourcen eines Container-Systems
  begrenzen muss, ohne den Anwendungscode oder den Container selbst zu
  ändern. (Beigetragen von Donghee Na in gh-109595.)

* Eine tief liegende Schnittstelle zu den *Timer-Dateideskriptoren*
  von Linux ist hinzugekommen, über "timerfd_create()",
  "timerfd_settime()", "timerfd_settime_ns()", "timerfd_gettime()",
  "timerfd_gettime_ns()", "TFD_NONBLOCK", "TFD_CLOEXEC",
  "TFD_TIMER_ABSTIME" und "TFD_TIMER_CANCEL_ON_SET" (Beigetragen von
  Masaru Tsuchiyama in gh-108277.)

* "lchmod()" und das Argument *follow_symlinks* von "chmod()" sind
  jetzt beide auch unter Windows verfügbar. Beachte, dass der
  voreingestellte Wert von *follow_symlinks* in "lchmod()" unter
  Windows "False" ist. (Beigetragen von Serhiy Storchaka in gh-59616.)

* "fchmod()" und die Unterstützung für Dateideskriptoren in "chmod()"
  sind jetzt beide auch unter Windows verfügbar. (Beigetragen von
  Serhiy Storchaka in gh-113191.)

* Unter Windows unterstützen "mkdir()" und "makedirs()" jetzt einen
  *mode*-Wert von "0o700", um Zugriffsrechte auf das neue Verzeichnis
  anzuwenden. Das wirkt sich stillschweigend auf "tempfile.mkdtemp()"
  aus und entschärft **CVE 2024-4030**. Andere Werte für *mode* werden
  weiterhin übergangen. (Beigetragen von Steve Dower in gh-118486.)

* "posix_spawn()" nimmt für das Argument *env* jetzt "None" an,
  wodurch der neu gestartete Prozess die Umgebung des aktuellen
  Prozesses verwendet. (Beigetragen von Jakub Kulik in gh-113119.)

* "posix_spawn()" darf im Parameter *file_actions* jetzt das Attribut
  "POSIX_SPAWN_CLOSEFROM" verwenden, auf Plattformen, die
  "posix_spawn_file_actions_addclosefrom_np()" unterstützen.
  (Beigetragen von Jakub Kulik in gh-113117.)


os.path
-------

* "isreserved()" ist hinzugekommen, um zu prüfen, ob ein Pfad auf dem
  aktuellen System vorbehalten ist. Diese Funktion ist nur unter
  Windows verfügbar. (Beigetragen von Barney Gale in gh-88569.)

* Unter Windows gelten Pfade, die mit genau einem Schrägstrich ("\"
  oder "/") beginnen, für "isabs()" nicht mehr als absolut.
  (Beigetragen von Barney Gale und Jon Foster in gh-44626.)

* "realpath()" löst Dateinamen im MS-DOS-Stil jetzt auch dann auf,
  wenn die Datei nicht erreichbar ist. (Beigetragen von Moonsik Park
  in gh-82367.)


pathlib
-------

* "UnsupportedOperation" ist hinzugekommen. Sie wird an der Stelle von
  "NotImplementedError" ausgelöst, wenn eine Pfadoperation nicht
  unterstützt wird. (Beigetragen von Barney Gale in gh-89812.)

* Ein neuer Konstruktor ist hinzugekommen, um "Path"-Objekte aus
  „file“-URIs ("file:///") zu erzeugen: "Path.from_uri()".
  (Beigetragen von Barney Gale in gh-107465.)

* "PurePath.full_match()" ist hinzugekommen, um Pfade mit Jokerzeichen
  im Shell-Stil abzugleichen, einschließlich des rekursiven
  Jokerzeichens „"**"“. (Beigetragen von Barney Gale in gh-73435.)

* Das Klassenattribut "PurePath.parser" ist hinzugekommen. Es hält die
  Umsetzung von "os.path" fest, die für das tief liegende Auswerten
  und Zusammensetzen von Pfaden verwendet wird. Das ist entweder
  "posixpath" oder "ntpath".

* Das nur über Schlüsselwort angebbare Argument *recurse_symlinks* ist
  zu "Path.glob()" und "rglob()" hinzugekommen. (Beigetragen von
  Barney Gale in gh-77609.)

* "Path.glob()" und "rglob()" geben jetzt Dateien und Verzeichnisse
  zurück, wenn ihnen ein Muster übergeben wird, das auf „"**"“ endet.
  Vorher wurden nur Verzeichnisse zurückgegeben. (Beigetragen von
  Barney Gale in gh-70303.)

* Das nur über Schlüsselwort angebbare Argument *follow_symlinks* ist
  zu "Path.is_file", "Path.is_dir", "Path.owner()" und "Path.group()"
  hinzugekommen. (Beigetragen von Barney Gale in gh-105793 und Kamil
  Turek in gh-107962.)


pdb
---

* "breakpoint()" und "set_trace()" gehen jetzt unmittelbar in den
  Debugger, nicht erst bei der nächsten auszuführenden Codezeile.
  Diese Änderung verhindert, dass der Debugger außerhalb des Kontexts
  anhält, wenn "breakpoint()" am Ende des Kontexts steht. (Beigetragen
  von Tian Gao in gh-118579.)

* "sys.path[0]" wird nicht mehr durch das Verzeichnis des untersuchten
  Skripts ersetzt, wenn "sys.flags.safe_path" gesetzt ist.
  (Beigetragen von Tian Gao und Christian Walther in gh-111762.)

* "zipapp" wird jetzt als Ziel der Fehlersuche unterstützt.
  (Beigetragen von Tian Gao in gh-118501.)

* Bei der Fehlersuche nach dem Absturz mit "pm()" lässt sich jetzt
  zwischen verketteten Ausnahmen wechseln, über den neuen Pdb-Befehl
  "exceptions [exc_number]". (Beigetragen von Matthias Bussonnier in
  gh-106676.)

* Ausdrücke und Anweisungen, deren Anfang ein pdb-Befehl ist, werden
  jetzt richtig erkannt und ausgeführt. (Beigetragen von Tian Gao in
  gh-108464.)


queue
-----

* "Queue.shutdown" und "ShutDown" sind hinzugekommen, um das Beenden
  einer Warteschlange zu steuern. (Beigetragen von Laurie Opperman und
  Yves Duprat in gh-104750.)


random
------

* Eine Befehlszeilenschnittstelle ist hinzugekommen. (Beigetragen von
  Hugo van Kemenade in gh-118131.)


re
--

* "re.error" ist zur besseren Verständlichkeit in "PatternError"
  umbenannt. "re.error" bleibt aus Gründen der
  Rückwärtsverträglichkeit erhalten.


shutil
------

* Die Schlüsselwortargumente *dir_fd* und *follow_symlinks* werden in
  "chown()" unterstützt. (Beigetragen von Berker Peksag und Tahia K in
  gh-62308)


site
----

* ".pth"-Dateien werden jetzt zuerst mit UTF-8 dekodiert und, wenn das
  fehlschlägt, mit der *Locale-Kodierung*. (Beigetragen von Inada
  Naoki in gh-117802.)


sqlite3
-------

* Eine "ResourceWarning" wird jetzt ausgegeben, wenn ein
  "Connection"-Objekt nicht ausdrücklich "geschlossen" wird.
  (Beigetragen von Erlend E. Aasland in gh-105539.)

* Der nur über Schlüsselwort angebbare Parameter *filter* ist zu
  "Connection.iterdump()" hinzugekommen, um die auszugebenden
  Datenbankobjekte zu filtern. (Beigetragen von Mariusz Felisiak in
  gh-91602.)


ssl
---

* Die API "create_default_context()" enthält jetzt
  "VERIFY_X509_PARTIAL_CHAIN" und "VERIFY_X509_STRICT" in ihren
  voreingestellten Schaltern.

  Bemerkung:

    "VERIFY_X509_STRICT" kann Zertifikate zurückweisen, die älter als
    **RFC 5280** oder unsauber sind und die die darunterliegende
    OpenSSL-Umsetzung sonst annehmen würde. Das abzuschalten ist nicht
    empfohlen, möglich ist es aber so:

       import ssl

       ctx = ssl.create_default_context()
       ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT

  (Beigetragen von William Woodruff in gh-112389.)


statistics
----------

* "kde()" ist für die Kerndichteschätzung hinzugekommen. Damit lässt
  sich aus einer festen Anzahl diskreter Stichproben eine stetige
  Wahrscheinlichkeitsdichtefunktion schätzen. (Beigetragen von Raymond
  Hettinger in gh-115863.)

* "kde_random()" ist hinzugekommen, um aus einer geschätzten
  Wahrscheinlichkeitsdichtefunktion zu ziehen, die "kde()" erzeugt
  hat. (Beigetragen von Raymond Hettinger in gh-115863.)


subprocess
----------

* Das Modul "subprocess" verwendet die Funktion "posix_spawn()" jetzt
  in mehr Fällen.

  Insbesondere wird "posix_spawn()" verwendet, wenn *close_fds* "True"
  ist (die Voreinstellung) und die C-Bibliothek
  "posix_spawn_file_actions_addclosefrom_np()" bereitstellt, was auf
  neuere Versionen von Linux, FreeBSD und Solaris zutrifft. Unter
  Linux sollte das ähnlich schnell sein wie der bisherige Code auf der
  Grundlage von "vfork()".

  Ein privater Schalter "subprocess._USE_POSIX_SPAWN" lässt sich auf
  "False" setzen, wenn "subprocess" dazu gezwungen werden muss,
  "posix_spawn()" nie zu verwenden. Bitte melde deinen Grund und die
  Einzelheiten zu deiner Plattform im Fehlerverfolgungssystem, wenn du
  das setzt, damit wir die Auswahllogik für alle verbessern können.
  (Beigetragen von Jakub Kulik in gh-113117.)


sys
---

* Die Funktion "_is_interned()" ist hinzugekommen, um zu prüfen, ob
  eine Zeichenkette interniert wurde. Es ist nicht zugesagt, dass
  diese Funktion in allen Implementierungen von Python vorhanden ist.
  (Beigetragen von Serhiy Storchaka in gh-78573.)


tempfile
--------

* Unter Windows begrenzt der von "tempfile.mkdtemp()" verwendete
  voreingestellte Modus "0o700" wegen der Änderungen an "os.mkdir()"
  jetzt den Zugriff auf das neue Verzeichnis. Das entschärft **CVE
  2024-4030**. (Beigetragen von Steve Dower in gh-118486.)


time
----

* Unter Windows verwendet "monotonic()" jetzt die Uhr
  "QueryPerformanceCounter()" mit einer Auflösung von 1 Mikrosekunde
  statt der Uhr "GetTickCount64()", die eine Auflösung von 15,6
  Millisekunden hat. (Beigetragen von Victor Stinner in gh-88494.)

* Unter Windows verwendet "time()" jetzt die Uhr
  "GetSystemTimePreciseAsFileTime()" mit einer Auflösung von 1
  Mikrosekunde statt der Uhr "GetSystemTimeAsFileTime()", die eine
  Auflösung von 15,6 Millisekunden hat. (Beigetragen von Victor
  Stinner in gh-63207.)


tkinter
-------

* "tkinter"-Widget-Methoden sind hinzugekommen: "tk_busy_hold()",
  "tk_busy_configure()", "tk_busy_cget()", "tk_busy_forget()",
  "tk_busy_current()" und "tk_busy_status()". (Beigetragen von Miguel,
  klappnase und Serhiy Storchaka in gh-72684.)

* Die "tkinter"-Widget-Methode "wm_attributes()" nimmt jetzt den
  Attributnamen ohne vorangestelltes Minus an, um Fensterattribute
  abzufragen, etwa "w.wm_attributes('alpha')", und erlaubt es, zu
  setzende Attribute und Werte als Schlüsselwortargumente anzugeben,
  etwa "w.wm_attributes(alpha=0.5)". (Beigetragen von Serhiy Storchaka
  in gh-43457.)

* "wm_attributes()" darf Attribute jetzt als "dict" zurückgeben, über
  den neuen optionalen, nur über Schlüsselwort angebbaren Parameter
  *return_python_dict*. (Beigetragen von Serhiy Storchaka in
  gh-43457.)

* "Text.count()" darf jetzt ein einfaches "int" zurückgeben, wenn der
  neue optionale, nur über Schlüsselwort angebbare Parameter
  *return_ints* verwendet wird. Andernfalls wird der einzelne Zählwert
  als Ein-Element-Tupel oder als "None" zurückgegeben. (Beigetragen
  von Serhiy Storchaka in gh-97928.)

* Der Elementtyp „vsapi“ wird in der Methode "element_create()" von
  "tkinter.ttk.Style" unterstützt. (Beigetragen von Serhiy Storchaka
  in gh-68166.)

* Die Methode "after_info()" für Tkinter-Widgets ist hinzugekommen.
  (Beigetragen von Cheryl Sabella in gh-77020.)

* Eine neue Methode "copy_replace()" ist zu "PhotoImage"
  hinzugekommen, um einen Bereich von einem Bild in ein anderes zu
  kopieren, wahlweise mit Pixelvergrößerung, Unterabtastung oder
  beidem. (Beigetragen von Serhiy Storchaka in gh-118225.)

* Der Parameter *from_coords* ist zu den "PhotoImage"-Methoden
  "copy()", "zoom()" und "subsample()" hinzugekommen. Die Parameter
  *zoom* und *subsample* sind zur "PhotoImage"-Methode "copy()"
  hinzugekommen. (Beigetragen von Serhiy Storchaka in gh-118225.)

* Die "PhotoImage"-Methoden "read()", um ein Bild aus einer Datei zu
  lesen, und "data()", um die Bilddaten zu holen, sind hinzugekommen.
  Die Parameter *background* und *grayscale* sind zur Methode
  "write()" hinzugekommen. (Beigetragen von Serhiy Storchaka in
  gh-118271.)


Traceback
---------

* Das Attribut "exc_type_str" ist zu "TracebackException"
  hinzugekommen. Es enthält eine Zeichenkettendarstellung des
  *exc_type*. Das Attribut "exc_type", das das Typobjekt selbst
  enthält, ist als veraltet markiert. Der Parameter *save_exc_type*
  (Voreinstellung "True") ist hinzugekommen, um anzugeben, ob
  "exc_type" gespeichert werden soll. (Beigetragen von Irit Katriel in
  gh-112332.)

* Ein neuer, nur über Schlüsselwort angebbarer Parameter *show_group*
  ist zu "TracebackException.format_exception_only()" hinzugekommen,
  um die verschachtelten Ausnahmen einer "BaseExceptionGroup"-Instanz
  (rekursiv) zu formatieren. (Beigetragen von Irit Katriel in
  gh-105292.)


types
-----

* "SimpleNamespace" darf jetzt ein einzelnes positionsbezogenes
  Argument annehmen, um die Argumente des Namensraums vorzubelegen.
  Dieses Argument muss entweder ein Mapping oder ein Iterable von
  Schlüssel-Wert-Paaren sein. (Beigetragen von Serhiy Storchaka in
  gh-108191.)


typing
------

* **PEP 705**: "ReadOnly" ist hinzugekommen, ein besonderes Typing-
  Konstrukt, um ein Element eines "TypedDict" für Typprüfer als nur
  lesbar zu kennzeichnen.

* **PEP 742**: "TypeIs" ist hinzugekommen, ein Typing-Konstrukt, mit
  dem sich einem Typprüfer mitteilen lässt, wie er einen Typ einengen
  soll.

* "NoDefault" ist hinzugekommen, ein Wächterobjekt, das die
  Voreinstellungen einiger Parameter im Modul "typing" darstellt.
  (Beigetragen von Jelle Zijlstra in gh-116126.)

* "get_protocol_members()" ist hinzugekommen, um die Menge der
  Mitglieder zurückzugeben, die ein "typing.Protocol" definieren.
  (Beigetragen von Jelle Zijlstra in gh-104873.)

* "is_protocol()" ist hinzugekommen, um zu prüfen, ob eine Klasse ein
  "Protocol" ist. (Beigetragen von Jelle Zijlstra in gh-104873.)

* "ClassVar" darf jetzt in "Final" verschachtelt werden und umgekehrt.
  (Beigetragen von Mehdi Drissi in gh-89547.)


unicodedata
-----------

* Die Unicode-Datenbank ist auf Version 15.1.0 aktualisiert.
  (Beigetragen von James Gerity in gh-109559.)


venv
----

* Unterstützung dafür, im Verzeichnis einer virtuellen Umgebung
  Ignorier-Dateien für die Versionsverwaltung (SCM) zu erzeugen, ist
  hinzugekommen. Standardmäßig wird Git unterstützt. Über die API ist
  es ausdrücklich einzuschalten, und sie lässt sich für weitere
  Versionsverwaltungen erweitern ("EnvBuilder" und "create()"). Über
  die Befehlszeile lässt es sich mit "--without-scm-ignore-files"
  abschalten. (Beigetragen von Brett Cannon in gh-108125.)


warnings
--------

* **PEP 702**: Der neue Dekorator "warnings.deprecated()" bietet einen
  Weg, Abkündigungen an einen *statischen Typprüfer* zu melden und bei
  der Verwendung als veraltet markierter Klassen und Funktionen zu
  warnen. Zur Laufzeit kann außerdem eine "DeprecationWarning"
  ausgegeben werden, wenn eine dekorierte Funktion oder Klasse
  verwendet wird. (Beigetragen von Jelle Zijlstra in gh-104003.)


xml
---

* Das aufgeschobene erneute Auswerten in Expat ab 2.6.0 (**CVE
  2023-52425**) lässt sich jetzt steuern. Dazu sind fünf neue Methoden
  hinzugekommen:

  * "xml.etree.ElementTree.XMLParser.flush()"

  * "xml.etree.ElementTree.XMLPullParser.flush()"

  * "xml.parsers.expat.xmlparser.GetReparseDeferralEnabled()"

  * "xml.parsers.expat.xmlparser.SetReparseDeferralEnabled()"

  * "xml.sax.expatreader.ExpatParser.flush()"

  (Beigetragen von Sebastian Pipping in gh-115623.)

* Die Methode "close()" ist für den Iterator hinzugekommen, den
  "iterparse()" zurückgibt, um ausdrücklich aufzuräumen. (Beigetragen
  von Serhiy Storchaka in gh-69893.)


zipimport
---------

* Unterstützung für Dateien im Format ZIP64 ist hinzugekommen. Alle
  lieben riesige Daten, nicht wahr? (Beigetragen von Tim Hatch in
  gh-94146.)


Optimierungen
=============

* Bei mehreren Modulen der Standardbibliothek ist die Importzeit
  deutlich besser geworden. Die Importzeit des Moduls "typing" ist zum
  Beispiel um etwa ein Drittel gesunken, weil die Abhängigkeiten von
  "re" und "contextlib" entfallen sind. Weitere Module, die schneller
  importiert werden, sind "email.utils", "enum", "functools",
  "importlib.metadata" und "threading". (Beigetragen von Alex Waygood,
  Shantanu Jain, Adam Turner, Daniel Hollas und anderen in gh-109653.)

* "textwrap.indent()" ist bei großen Eingaben jetzt etwa 30 %
  schneller als vorher. (Beigetragen von Inada Naoki in gh-107369.)

* Das Modul "subprocess" verwendet die Funktion "posix_spawn()" jetzt
  in mehr Fällen, darunter auf vielen neueren Plattformen auch dann,
  wenn *close_fds* "True" ist (die Voreinstellung). Das sollte beim
  Starten von Prozessen unter FreeBSD und Solaris einen merklichen
  Geschwindigkeitsgewinn bringen. Einzelheiten im Abschnitt subprocess
  weiter oben. (Beigetragen von Jakub Kulik in gh-113117.)


Entfernte Module und APIs
=========================


PEP 594: „leere Batterien“ aus der Standardbibliothek entfernt
--------------------------------------------------------------

**PEP 594** hat vorgeschlagen, 19 Module aus der Standardbibliothek zu
entfernen, die wegen ihres überholten, veralteten oder unsicheren
Zustands umgangssprachlich „leere Batterien“ genannt werden. Alle
folgenden Module waren in Python 3.11 als veraltet markiert und sind
jetzt entfernt:

* "aifc"

  * standard-aifc: Verwende die Weiterverteilung der Bibliothek "aifc"
    von PyPI.

* "audioop"

  * audioop-lts: Verwende die Bibliothek "audioop-lts" von PyPI.

* "chunk"

  * standard-chunk: Verwende die Weiterverteilung der Bibliothek
    "chunk" von PyPI.

* "cgi" und "cgitb"

  * "cgi.FieldStorage" lässt sich bei "GET"- und "HEAD"-Anfragen
    üblicherweise durch "urllib.parse.parse_qsl()" ersetzen und bei
    "POST"- und "PUT"-Anfragen durch das Modul "email.message" oder
    die Bibliothek multipart.

  * "cgi.parse()" lässt sich ersetzen, indem man
    "urllib.parse.parse_qs()" unmittelbar auf die gewünschte
    Abfragezeichenkette anwendet – außer wenn die Eingabe "multipart
    /form-data" ist. Dann ist zu ersetzen, wie es weiter unten für
    "cgi.parse_multipart()" beschrieben ist.

  * "cgi.parse_header()" lässt sich durch die Funktionalität des
    Pakets "email" ersetzen, das dieselben MIME-RFCs umsetzt. Zum
    Beispiel mit "email.message.EmailMessage":

       from email.message import EmailMessage

       msg = EmailMessage()
       msg['content-type'] = 'application/json; charset="utf8"'
       main, params = msg.get_content_type(), msg['content-type'].params

  * "cgi.parse_multipart()" lässt sich durch die Funktionalität des
    Pakets "email" ersetzen, das dieselben MIME-RFCs umsetzt, oder
    durch die Bibliothek multipart. Zum Beispiel durch die Klassen
    "email.message.EmailMessage" und "email.message.Message".

  * standard-cgi: und standard-cgitb: Verwende die Weiterverteilung
    der Bibliotheken "cgi" und "cgitb" von PyPI.

* "crypt" und die private Erweiterung "_crypt". Das Modul "hashlib"
  kann ein passender Ersatz sein, wenn es nur darum geht, einen Wert
  zu hashen. Andernfalls stehen auf PyPI verschiedene Bibliotheken von
  Dritten bereit:

  * bcrypt: modernes Hashen von Passwörtern für deine Software und
    deine Server.

  * argon2-cffi: der sichere Passwort-Hash-Algorithmus Argon2.

  * legacycrypt: "ctypes"-Hülle um den POSIX-Bibliotheksaufruf crypt
    und die zugehörige Funktionalität.

  * crypt_r: Abspaltung des Moduls "crypt", Hülle um den
    Bibliotheksaufruf *crypt_r(3)* und die zugehörige Funktionalität.

  * standard-crypt und deprecated-crypt-alternative: Verwende die
    Weiterverteilung von "crypt" und die Neuumsetzung von "_crypt" von
    PyPI.

* "imghdr": Als Ersatz sollten die Bibliotheken filetype, puremagic
  oder python-magic verwendet werden. Zum Beispiel lässt sich die
  Funktion "puremagic.what()" an der Stelle der Funktion
  "imghdr.what()" für alle Dateiformate verwenden, die "imghdr"
  unterstützt hat.

  * standard-imghdr: Verwende die Weiterverteilung der Bibliothek
    "imghdr" von PyPI.

* "mailcap": Verwende stattdessen das Modul "mimetypes".

  * standard-mailcap: Verwende die Weiterverteilung der Bibliothek
    "mailcap" von PyPI.

* "msilib"

* "nis"

* "nntplib": Verwende stattdessen die Bibliothek pynntp von PyPI.

  * standard-nntplib: Verwende die Weiterverteilung der Bibliothek
    "nntplib" von PyPI.

* "ossaudiodev": Verwende zur Audio-Wiedergabe stattdessen die
  Bibliothek pygame von PyPI.

* "pipes": Verwende stattdessen das Modul "subprocess". Verwende
  "shlex.quote()" an der Stelle der nicht dokumentierten Funktion
  "pipes.quote".

  * standard-pipes: Verwende die Weiterverteilung der Bibliothek
    "pipes" von PyPI.

* "sndhdr": Als Ersatz sollten die Bibliotheken filetype, puremagic
  oder python-magic verwendet werden.

  * standard-sndhdr: Verwende die Weiterverteilung der Bibliothek
    "sndhdr" von PyPI.

* "spwd": Verwende stattdessen die Bibliothek python-pam von PyPI.

* "sunau"

  * standard-sunau: Verwende die Weiterverteilung der Bibliothek
    "sunau" von PyPI.

* "telnetlib": Verwende stattdessen die Bibliotheken telnetlib3 oder
  Exscript von PyPI.

  * standard-telnetlib: Verwende die Weiterverteilung der Bibliothek
    "telnetlib" von PyPI.

* "uu": Verwende als neuzeitliche Alternative stattdessen das Modul
  "base64".

  * standard-uu: Verwende die Weiterverteilung der Bibliothek "uu" von
    PyPI.

* "xdrlib"

  * standard-xdrlib: Verwende die Weiterverteilung der Bibliothek
    "xdrlib" von PyPI.

(Beigetragen von Victor Stinner und Zachary Ware in gh-104773 und
gh-104780.)


2to3
----

* Das Programm **2to3** und das Modul "lib2to3" sind entfernt. Sie
  waren in Python 3.11 als veraltet markiert. (Beigetragen von Victor
  Stinner in gh-104780.)


builtins
--------

* Die Unterstützung für verkettete "classmethod"-Deskriptoren
  (eingeführt in gh-63272) ist entfernt. Damit lassen sich keine
  anderen Deskriptoren mehr einhüllen, etwa "property". Der
  Grundentwurf dieses Features war fehlerhaft und hat zu mehreren
  Problemen geführt. Um eine "classmethod" „durchzureichen“, kommt das
  Attribut "__wrapped__" in Betracht, das in Python 3.10 hinzugekommen
  ist. (Beigetragen von Raymond Hettinger in gh-89519.)

* Ein "RuntimeError" wird ausgelöst, wenn "frame.clear()" auf einem
  angehaltenen Rahmen aufgerufen wird (wie es bei einem gerade
  ausgeführten Rahmen schon immer der Fall war). (Beigetragen von Irit
  Katriel in gh-79932.)


configparser
------------

* Die nicht dokumentierte Klasse "LegacyInterpolation" ist entfernt.
  Sie war seit Python 3.2 im Docstring und seit Python 3.11 zur
  Laufzeit als veraltet markiert. (Beigetragen von Hugo van Kemenade
  in gh-104886.)


importlib.metadata
------------------

* Der als veraltet markierte Zugriff über Indizierung
  ("__getitem__()") auf EntryPoint-Objekte ist entfernt. (Beigetragen
  von Jason R. Coombs in gh-113175.)


locale
------

* Die Funktion "locale.resetlocale()" ist entfernt. Sie war in Python
  3.11 als veraltet markiert. Verwende stattdessen
  "locale.setlocale(locale.LC_ALL, "")". (Beigetragen von Victor
  Stinner in gh-104783.)


opcode
------

* "opcode.ENABLE_SPECIALIZATION" ist nach
  "_opcode.ENABLE_SPECIALIZATION" umgezogen. Dieses Feld kam in 3.12
  hinzu, war nie dokumentiert und ist nicht für die Verwendung von
  außen gedacht. (Beigetragen von Irit Katriel in gh-105481.)

* "opcode.is_pseudo()", "opcode.MIN_PSEUDO_OPCODE" und
  "opcode.MAX_PSEUDO_OPCODE" sind entfernt. Sie kamen in Python 3.12
  hinzu, waren aber weder dokumentiert noch über "dis" zugänglich und
  nicht für die Verwendung von außen gedacht. (Beigetragen von Irit
  Katriel in gh-105481.)


optparse
--------

* Dieses Modul gilt nicht mehr als *sanft abgekündigt*. Für neue
  Projekte, die keine Bibliothek eines Dritten zur Verarbeitung von
  Befehlszeilenargumenten verwenden, bleibt "argparse" vorzuziehen. Es
  gibt aber Eigenheiten in der Arbeitsweise von "argparse", die dazu
  führen, dass das tiefer liegende Modul "optparse" die bessere
  Grundlage dafür sein kann, Bibliotheken zur Verarbeitung von
  Argumenten zu *schreiben* und Befehlszeilenanwendungen umzusetzen,
  die sich strenger als "argparse" an die verschiedenen Unix-
  Gepflogenheiten der Befehlszeilenverarbeitung halten, die auf das
  Verhalten der C-Funktion "getopt()" zurückgehen . (Beigetragen von
  Alyssa Coghlan und Serhiy Storchaka in gh-126180.)


pathlib
-------

* Die Möglichkeit, "Path"-Objekte als Kontextmanager zu verwenden, ist
  entfernt. Diese Funktionalität war als veraltet markiert und hatte
  seit Python 3.9 keine Wirkung. (Beigetragen von Barney Gale in
  gh-83863.)


re
--

* Die nicht dokumentierte, als veraltet markierte und fehlerhafte
  Funktion "re.template()" und der Schalter "re.TEMPLATE" / "re.T"
  sind entfernt. (Beigetragen von Serhiy Storchaka und Nikita Sobolev
  in gh-105687.)


tkinter.tix
-----------

* Das Modul "tkinter.tix" ist entfernt. Es war in Python 3.6 als
  veraltet markiert. Die Tix-Bibliothek eines Dritten, die das Modul
  eingehüllt hat, wird nicht mehr gepflegt. (Beigetragen von Zachary
  Ware in gh-75552.)


turtle
------

* Die Methode "RawTurtle.settiltangle()" ist entfernt. Sie war seit
  Python 3.1 in der Dokumentation und seit Python 3.11 zur Laufzeit
  als veraltet markiert. (Beigetragen von Hugo van Kemenade in
  gh-104876.)


typing
------

* Die Namensräume "typing.io" und "typing.re" sind entfernt. Sie waren
  seit Python 3.8 als veraltet markiert. Die Elemente aus diesen
  Namensräumen lassen sich unmittelbar aus dem Modul "typing"
  importieren. (Beigetragen von Sebastian Rittau in gh-92871.)

* Die Möglichkeit, "TypedDict"-Typen über Schlüsselwortargumente zu
  erzeugen, ist entfernt. Sie war in Python 3.11 als veraltet
  markiert. (Beigetragen von Tomas Roun in gh-104786.)


unittest
--------

* Die folgenden "unittest"-Funktionen sind entfernt. Sie waren in
  Python 3.11 als veraltet markiert:

  * "unittest.findTestCases()"

  * "unittest.makeSuite()"

  * "unittest.getTestCaseNames()"

  Verwende stattdessen die Methoden von "TestLoader":

  * "loadTestsFromModule()"

  * "loadTestsFromTestCase()"

  * "getTestCaseNames()"

  (Beigetragen von Hugo van Kemenade in gh-104835.)

* Die ungetestete und nicht dokumentierte Methode
  "TestProgram.usageExit()" ist entfernt. Sie war in Python 3.11 als
  veraltet markiert. (Beigetragen von Hugo van Kemenade in gh-104992.)


urllib
------

* Die Parameter *cafile*, *capath* und *cadefault* der Funktion
  "urllib.request.urlopen()" sind entfernt. Sie waren in Python 3.6
  als veraltet markiert. Verwende stattdessen den Parameter *context*
  mit einer "SSLContext"-Instanz. Mit der Funktion
  "ssl.SSLContext.load_cert_chain()" lassen sich bestimmte Zertifikate
  laden. Alternativ lässt man "ssl.create_default_context()" die vom
  Betriebssystem als vertrauenswürdig eingestuften Zertifikate der
  Zertifizierungsstellen (CA) auswählen. (Beigetragen von Victor
  Stinner in gh-105382.)


webbrowser
----------

* Die ungetestete und nicht dokumentierte Klasse "MacOSX" ist
  entfernt. Sie war in Python 3.11 als veraltet markiert. Verwende
  stattdessen die Klasse "MacOSXOSAScript" (in Python 3.2
  hinzugekommen). (Beigetragen von Hugo van Kemenade in gh-104804.)

* Das als veraltet markierte Attribut "MacOSXOSAScript._name" ist
  entfernt. Verwende stattdessen das Attribut "MacOSXOSAScript.name".
  (Beigetragen von Nikita Sobolev in gh-105546.)


Neu als veraltet markiert
=========================

* Selbst definierte Funktionen:

  * Zuweisungen an das Attribut "__code__" einer Funktion sind als
    veraltet markiert, wenn der Typ des neuen Code-Objekts nicht zum
    Typ der Funktion passt. Die verschiedenen Typen sind: gewöhnliche
    Funktion, Generator, asynchroner Generator und Coroutine.
    (Beigetragen von Irit Katriel in gh-81137.)

* "array":

  * Der Formatcode "'u'" ("wchar_t") ist zur Laufzeit als veraltet
    markiert. Dieser Formatcode war seit Python 3.3 in der
    Dokumentation als veraltet markiert und wird in Python 3.16
    entfernt. Verwende für Unicode-Zeichen stattdessen den Formatcode
    "'w'" ("Py_UCS4"). (Beigetragen von Hugo van Kemenade in
    gh-80480.)

* "ctypes":

  * Die nicht dokumentierte Funktion "SetPointerType()" ist als
    veraltet markiert und wird in Python 3.15 entfernt. (Beigetragen
    von Victor Stinner in gh-105733.)

  * Die Funktion "ARRAY()" ist zugunsten der Multiplikation "type *
    length" *sanft abgekündigt*. (Beigetragen von Victor Stinner in
    gh-105733.)

* "decimal":

  * Die nicht normgerechte und nicht dokumentierte
    "Decimal"-Formatangabe "'N'", die nur die C-Umsetzung des Moduls
    "decimal" unterstützt, ist als veraltet markiert. Entfernt werden
    soll sie in Python 3.18. (Beigetragen von Serhiy Storchaka in
    gh-89902.)

* "dis":

  * Der Trenner "HAVE_ARGUMENT" ist als veraltet markiert. Prüfe
    stattdessen die Mitgliedschaft in "hasarg". (Beigetragen von Irit
    Katriel in gh-109319.)

* "gettext":

  * Nicht ganzzahlige Zahlen als Argumente für Funktionen und Methoden
    des Moduls "gettext", die Pluralformen berücksichtigen, sind als
    veraltet markiert, auch wenn keine Übersetzung gefunden wurde.
    (Beigetragen von Serhiy Storchaka in gh-88434.)

* "glob":

  * Die nicht dokumentierten Funktionen "glob0()" und "glob1()" sind
    als veraltet markiert. Verwende stattdessen "glob()" und übergib
    dem Parameter *root_dir* ein *pfadähnliches Objekt*, das das
    Wurzelverzeichnis angibt. (Beigetragen von Barney Gale in
    gh-117337.)

* "http.server":

  * "CGIHTTPRequestHandler" ist als veraltet markiert und wird in
    Python 3.15 entfernt. Prozessbasierte CGI-HTTP-Server sind schon
    sehr lange aus der Mode. Dieser Code war überholt, ungepflegt und
    selten verwendet. Er bringt eine hohe Gefahr für Sicherheits- und
    Funktionsfehler mit. (Beigetragen von Gregory P. Smith in
    gh-109096.)

  * Der Schalter "--cgi" der Befehlszeilenschnittstelle **python -m
    http.server** ist als veraltet markiert und wird in Python 3.15
    entfernt. (Beigetragen von Gregory P. Smith in gh-109096.)

* "mimetypes":

  * Dateipfade als Argumente für "guess_type()" sind *sanft
    abgekündigt*. Verwende stattdessen "guess_file_type()".
    (Beigetragen von Serhiy Storchaka in gh-66543.)

* "re":

  * Die optionalen Argumente *maxsplit*, *count* oder *flags* als
    positionsbezogene Argumente an die Modulfunktionen "split()",
    "sub()" und "subn()" zu übergeben ist als veraltet markiert. Diese
    Parameter werden in einer künftigen Python-Version nur noch über
    Schlüsselwort angebbar sein. (Beigetragen von Serhiy Storchaka in
    gh-56166.)

* "pathlib":

  * ".PurePath.is_reserved()" ist als veraltet markiert und wird in
    Python 3.15 entfernt. Verwende "os.path.isreserved()", um unter
    Windows vorbehaltene Pfade zu erkennen. (Beigetragen von Barney
    Gale in gh-88569.)

* "platform":

  * "platform.java_ver()" ist als veraltet markiert und wird in Python
    3.15 entfernt. Diese Funktion ist nur für die Unterstützung von
    Jython nützlich, hat eine verwirrende API und ist kaum getestet.
    (Beigetragen von Nikita Sobolev in gh-116349.)

* "pydoc":

  * Die nicht dokumentierte Funktion "ispackage()" ist als veraltet
    markiert. (Beigetragen von Zackery Spytz in gh-64020.)

* "sqlite3"

  * Mehr als ein positionsbezogenes Argument an die Funktion
    "connect()" und an den Konstruktor von "Connection" zu übergeben
    ist als veraltet markiert. Die übrigen Parameter werden in Python
    3.15 nur noch über Schlüsselwort angebbar sein. (Beigetragen von
    Erlend E. Aasland in gh-107948.)

  * Namen, Anzahl der Argumente und das aufrufbare Objekt als
    Schlüsselwortargumente an "Connection.create_function()" und
    "Connection.create_aggregate()" zu übergeben ist als veraltet
    markiert. Diese Parameter werden in Python 3.15 nur noch
    positionsbezogen angebbar sein. (Beigetragen von Erlend E. Aasland
    in gh-108278.)

  * Das aufrufbare Rückrufobjekt über Schlüsselwort an die
    "Connection"-Methoden "set_authorizer()", "set_progress_handler()"
    und "set_trace_callback()" zu übergeben ist als veraltet markiert.
    Die aufrufbaren Rückrufobjekte werden in Python 3.15 nur noch
    positionsbezogen angebbar sein. (Beigetragen von Erlend E. Aasland
    in gh-108278.)

* "sys":

  * Die Funktion "_enablelegacywindowsfsencoding()" ist als veraltet
    markiert und wird in Python 3.16 entfernt. Verwende stattdessen
    die Umgebungsvariable "PYTHONLEGACYWINDOWSFSENCODING".
    (Beigetragen von Inada Naoki in gh-73427.)

* "tarfile":

  * Das nicht dokumentierte und unbenutzte Attribut "TarFile.tarfile"
    ist als veraltet markiert und wird in Python 3.16 entfernt.
    (Beigetragen in gh-115256.)

* "traceback":

  * Das Attribut "TracebackException.exc_type" ist als veraltet
    markiert. Verwende stattdessen "TracebackException.exc_type_str".
    (Beigetragen von Irit Katriel in gh-112332.)

* "typing":

  * Die nicht dokumentierte Schreibweise mit Schlüsselwortargumenten,
    um "NamedTuple"-Klassen zu erzeugen (etwa "Point =
    NamedTuple("Point", x=int, y=int)"), ist als veraltet markiert und
    wird in Python 3.15 entfernt. Verwende stattdessen die
    klassenbasierte oder die funktionale Schreibweise. (Beigetragen
    von Alex Waygood in gh-105566.)

  * Den Parameter *fields* beim Erzeugen einer "NamedTuple"- oder
    "typing.TypedDict"-Klasse weglassen ist als veraltet markiert,
    ebenso "None" an den Parameter *fields* beider Typen zu übergeben.
    Python 3.15 wird für den Parameter *fields* eine gültige Folge
    verlangen. Um eine NamedTuple-Klasse ohne Felder zu erzeugen,
    verwende "class NT(NamedTuple): pass" oder "NT = NamedTuple("NT",
    ())". Um eine TypedDict-Klasse ohne Felder zu erzeugen, verwende
    "class TD(TypedDict): pass" oder "TD = TypedDict("TD", {})".
    (Beigetragen von Alex Waygood in gh-105566 und gh-105570.)

  * Die Dekoratorfunktion "@typing.no_type_check_decorator" ist als
    veraltet markiert und wird in Python 3.15 entfernt. Nach acht
    Jahren im Modul "typing" wird sie noch von keinem größeren
    Typprüfer unterstützt. (Beigetragen von Alex Waygood in
    gh-106309.)

  * "typing.AnyStr" ist als veraltet markiert. In Python 3.16 wird es
    aus "typing.__all__" entfernt, und beim Importieren oder beim
    Zugriff wird zur Laufzeit eine "DeprecationWarning" ausgegeben.
    Vollständig entfernt wird es in Python 3.18. Verwende stattdessen
    die neue Schreibweise für Typparameter. (Beigetragen von Michael
    The in gh-107116.)

* "wave":

  * Die Methoden "getmark()", "setmark()" und "getmarkers()" der
    Klassen "Wave_read" und "Wave_write" sind als veraltet markiert
    und werden in Python 3.15 entfernt. (Beigetragen von Victor
    Stinner in gh-105096.)


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

* Es wird kein boolescher Wert mehr akzeptiert, wenn ein
  Dateideskriptor erwartet wird. (Beigetragen von Serhiy Storchaka in
  gh-82626.)

* "decimal":

  * Der nicht standardkonforme und undokumentierte Formatbezeichner
    "'N'" für "Decimal", der nur in der C-Implementierung des Moduls
    "decimal" unterstützt wird, ist seit Python 3.13 veraltet.
    (Beigetragen von Serhiy Storchaka in gh-89902.)

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

  * Zeilen mit "import" in Dateien vom Typ "*name*.pth" werden
    stillschweigend ignoriert.

  (Beigetragen von Barry Warsaw in gh-148641.)


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


Änderungen am Bytecode von CPython
==================================

* Das Oparg von "YIELD_VALUE" ist jetzt "1", wenn das yield Teil eines
  yield-from oder await ist, und andernfalls "0". Das Oparg von
  "RESUME" ist um ein Bit erweitert, das anzeigt, ob die Except-Tiefe
  1 ist, was zum Optimieren des Schließens von Generatoren gebraucht
  wird. (Beigetragen von Irit Katriel in gh-111354.)


C API Änderungen
================


Neue Funktionen
---------------

* Die PyMonitoring-C-API ist hinzugekommen, um Überwachungsereignisse
  nach **PEP 669** zu erzeugen:

  * "PyMonitoringState"

  * "PyMonitoring_FirePyStartEvent()"

  * "PyMonitoring_FirePyResumeEvent()"

  * "PyMonitoring_FirePyReturnEvent()"

  * "PyMonitoring_FirePyYieldEvent()"

  * "PyMonitoring_FireCallEvent()"

  * "PyMonitoring_FireLineEvent()"

  * "PyMonitoring_FireJumpEvent()"

  * "PyMonitoring_FireBranchEvent"

  * "PyMonitoring_FireCReturnEvent()"

  * "PyMonitoring_FirePyThrowEvent()"

  * "PyMonitoring_FireRaiseEvent()"

  * "PyMonitoring_FireCRaiseEvent()"

  * "PyMonitoring_FireReraiseEvent()"

  * "PyMonitoring_FireExceptionHandledEvent()"

  * "PyMonitoring_FirePyUnwindEvent()"

  * "PyMonitoring_FireStopIterationEvent()"

  * "PyMonitoring_EnterScope()"

  * "PyMonitoring_ExitScope()"

  (Beigetragen von Irit Katriel in gh-111997).

* "PyMutex" ist hinzugekommen, ein leichtgewichtiger Mutex, der ein
  einzelnes Byte belegt, dazu die neuen Funktionen "PyMutex_Lock()"
  und "PyMutex_Unlock()". "PyMutex_Lock()" gibt das *GIL* frei (sofern
  es gerade gehalten wird), wenn die Operation blockieren muss.
  (Beigetragen von Sam Gross in gh-108724.)

* Die PyTime-C-API ist hinzugekommen, um Zugriff auf die Uhren des
  Systems zu geben:

  * "PyTime_t".

  * "PyTime_MIN" und "PyTime_MAX".

  * "PyTime_AsSecondsDouble()".

  * "PyTime_Monotonic()".

  * "PyTime_MonotonicRaw()".

  * "PyTime_PerfCounter()".

  * "PyTime_PerfCounterRaw()".

  * "PyTime_Time()".

  * "PyTime_TimeRaw()".

  (Beigetragen von Victor Stinner und Petr Viktorin in gh-110850.)

* Die Funktion "PyDict_ContainsString()" ist hinzugekommen. Sie
  verhält sich wie "PyDict_Contains()", *key* wird aber als
  UTF-8-kodierte Bytezeichenkette vom Typ const char* angegeben statt
  als PyObject*. (Beigetragen von Victor Stinner in gh-108314.)

* Die Funktionen "PyDict_GetItemRef()" und "PyDict_GetItemStringRef()"
  sind hinzugekommen. Sie verhalten sich ähnlich wie
  "PyDict_GetItemWithError()", geben aber eine *starke Referenz*
  zurück statt einer *geliehenen Referenz*. Außerdem geben diese
  Funktionen im Fehlerfall "-1" zurück, wodurch die Prüfung von
  "PyErr_Occurred()" entfällt. (Beigetragen von Victor Stinner in
  gh-106004.)

* Die Funktion "PyDict_SetDefaultRef()" ist hinzugekommen. Sie verhält
  sich ähnlich wie "PyDict_SetDefault()", gibt aber eine *starke
  Referenz* zurück statt einer *geliehenen Referenz*. Diese Funktion
  gibt im Fehlerfall "-1" zurück, beim Einfügen "0" und "1", wenn der
  Schlüssel im Dictionary schon vorhanden war. (Beigetragen von Sam
  Gross in gh-112066.)

* Die Funktionen "PyDict_Pop()" und "PyDict_PopString()" sind
  hinzugekommen, um einen Schlüssel aus einem Dictionary zu entfernen
  und wahlweise den entfernten Wert zurückzugeben. Das gleicht
  "dict.pop()", allerdings gibt es keinen Standardwert, und für
  fehlende Schlüssel wird kein "KeyError" ausgelöst. (Beigetragen von
  Stefan Behnel und Victor Stinner in gh-111262.)

* Die Funktionen "PyMapping_GetOptionalItem()" und
  "PyMapping_GetOptionalItemString()" sind als Alternativen zu
  "PyObject_GetItem()" beziehungsweise "PyMapping_GetItemString()"
  hinzugekommen. Die neuen Funktionen lösen keinen "KeyError" aus,
  wenn der angefragte Schlüssel im Mapping fehlt. Diese Varianten sind
  bequemer und schneller, wenn ein fehlender Schlüssel nicht als
  Fehler gelten soll. (Beigetragen von Serhiy Storchaka in gh-106307.)

* Die Funktionen "PyObject_GetOptionalAttr()" und
  "PyObject_GetOptionalAttrString()" sind als Alternativen zu
  "PyObject_GetAttr()" beziehungsweise "PyObject_GetAttrString()"
  hinzugekommen. Die neuen Funktionen lösen keinen "AttributeError"
  aus, wenn das angefragte Attribut am Objekt nicht gefunden wird.
  Diese Varianten sind bequemer und schneller, wenn ein fehlendes
  Attribut nicht als Fehler gelten soll. (Beigetragen von Serhiy
  Storchaka in gh-106521.)

* Die Funktion "PyErr_FormatUnraisable()" ist als Erweiterung von
  "PyErr_WriteUnraisable()" hinzugekommen. Mit ihr lässt sich die
  Warnmeldung anpassen. (Beigetragen von Serhiy Storchaka in
  gh-108082.)

* Neue Funktionen sind hinzugekommen, die für die lokalen, globalen
  und eingebauten Variablen eines Rahmens eine *starke Referenz* statt
  einer *geliehenen Referenz* zurückgeben, als Teil von PEP 667:

  * "PyEval_GetFrameBuiltins()" ersetzt "PyEval_GetBuiltins()"

  * "PyEval_GetFrameGlobals()" ersetzt "PyEval_GetGlobals()"

  * "PyEval_GetFrameLocals()" ersetzt "PyEval_GetLocals()"

  (Beigetragen von Mark Shannon und Tian Gao in gh-74929.)

* Die Funktionen "Py_GetConstant()" und "Py_GetConstantBorrowed()"
  sind hinzugekommen, um *starke* oder *geliehene* Referenzen auf
  Konstanten zu bekommen. "Py_GetConstant(Py_CONSTANT_ZERO)" gibt zum
  Beispiel eine starke Referenz auf die Konstante null zurück.
  (Beigetragen von Victor  Stinner in gh-115754.)

* Die Funktion "PyImport_AddModuleRef()" ist als Ersatz für
  "PyImport_AddModule()" hinzugekommen. Sie gibt eine *starke
  Referenz* zurück statt einer *geliehenen Referenz*. (Beigetragen von
  Victor Stinner in gh-105922.)

* Die Funktion "Py_IsFinalizing()" ist hinzugekommen, um zu prüfen, ob
  der Haupt-Python-Interpreter *herunterfährt*. (Beigetragen von
  Victor Stinner in gh-108014.)

* Die Funktion "PyList_GetItemRef()" ist als Ersatz für
  "PyList_GetItem()" hinzugekommen. Sie gibt eine *starke Referenz*
  zurück statt einer *geliehenen Referenz*. (Beigetragen von Sam Gross
  in gh-114329.)

* Die Funktionen "PyList_Extend()" und "PyList_Clear()" sind
  hinzugekommen. Sie spiegeln die Python-Methoden "list.extend()" und
  "list.clear()". (Beigetragen von Victor Stinner in gh-111138.)

* Die Funktion "PyLong_AsInt()" ist hinzugekommen. Sie verhält sich
  ähnlich wie "PyLong_AsLong()", legt das Ergebnis aber in einem C-int
  ab statt in einem C-long. (Beigetragen von Victor Stinner in
  gh-108014.)

* Die Funktionen "PyLong_AsNativeBytes()", "PyLong_FromNativeBytes()"
  und "PyLong_FromUnsignedNativeBytes()" sind hinzugekommen, um das
  Umwandeln zwischen nativen Ganzzahltypen und Python-"int"-Objekten
  zu vereinfachen. (Beigetragen von Steve Dower in gh-111140.)

* Die Funktion "PyModule_Add()" ist hinzugekommen. Sie gleicht
  "PyModule_AddObjectRef()" und "PyModule_AddObject()", stiehlt aber
  immer eine Referenz auf den Wert. (Beigetragen von Serhiy Storchaka
  in gh-86493.)

* Die Funktion "PyObject_GenericHash()" ist hinzugekommen. Sie setzt
  die voreingestellte Hash-Funktion eines Python-Objekts um.
  (Beigetragen von Serhiy Storchaka in gh-113024.)

* Die Funktion "Py_HashPointer()" ist hinzugekommen, um einen rohen
  Zeiger zu hashen. (Beigetragen von Victor Stinner in gh-111545.)

* Die Funktionen "PyObject_VisitManagedDict()" und
  "PyObject_ClearManagedDict()" sind hinzugekommen. Sie müssen von den
  Traverse- und Clear-Funktionen eines Typs aufgerufen werden, der den
  Schalter "Py_TPFLAGS_MANAGED_DICT" verwendet. Mit dem pythoncapi-
  compat project lassen sich diese Funktionen unter Python 3.11 und
  3.12 nutzen. (Beigetragen von Victor Stinner in gh-107073.)

* Die Funktionen "PyRefTracer_SetTracer()" und
  "PyRefTracer_GetTracer()" sind hinzugekommen. Mit ihnen lässt sich
  das Erzeugen und Zerstören von Objekten auf dieselbe Weise
  verfolgen, wie es das Modul "tracemalloc" tut. (Beigetragen von
  Pablo Galindo in gh-93502.)

* Die Funktion "PySys_AuditTuple()" ist als Alternative zu
  "PySys_Audit()" hinzugekommen. Sie nimmt die Ereignisargumente als
  Python-"tuple"-Objekt. (Beigetragen von Victor Stinner in gh-85283.)

* Die Funktion "PyThreadState_GetUnchecked()" ist als Alternative zu
  "PyThreadState_Get()" hinzugekommen. Sie beendet den Prozess nicht
  mit einem schweren Fehler, wenn er "NULL" ist. Der Aufrufer muss
  selbst prüfen, ob das Ergebnis "NULL" ist. (Beigetragen von Victor
  Stinner in gh-108867.)

* Die Funktion "PyType_GetFullyQualifiedName()" ist hinzugekommen, um
  den vollständig qualifizierten Namen des Typs zu ermitteln. Der
  Modulname wird vorangestellt, wenn "type.__module__" eine
  Zeichenkette ist und weder "'builtins'" noch "'__main__'" lautet.
  (Beigetragen von Victor Stinner in gh-111696.)

* Die Funktion "PyType_GetModuleName()" ist hinzugekommen, um den
  Modulnamen des Typs zu ermitteln. Das entspricht dem Abfragen des
  Attributs "type.__module__". (Beigetragen von Eric Snow und Victor
  Stinner in gh-111696.)

* Die Funktionen "PyUnicode_EqualToUTF8AndSize()" und
  "PyUnicode_EqualToUTF8()" sind hinzugekommen, um ein Unicode-Objekt
  mit einer UTF-8-kodierten Zeichenkette vom Typ const char* zu
  vergleichen. Sie geben "1" zurück, wenn beide gleich sind, und
  andernfalls "0". Diese Funktionen lösen keine Ausnahmen aus.
  (Beigetragen von Serhiy Storchaka in gh-110289.)

* Die Funktion "PyWeakref_GetRef()" ist als Alternative zu
  "PyWeakref_GetObject()" hinzugekommen. Sie gibt eine *starke
  Referenz* zurück oder "NULL", wenn das Bezugsobjekt nicht mehr lebt.
  (Beigetragen von Victor Stinner in gh-105927.)

* Ausgebesserte Varianten von Funktionen, die Fehler stillschweigend
  übergehen, sind hinzugekommen:

  * "PyObject_HasAttrWithError()" ersetzt "PyObject_HasAttr()".

  * "PyObject_HasAttrStringWithError()" ersetzt
    "PyObject_HasAttrString()".

  * "PyMapping_HasKeyWithError()" ersetzt "PyMapping_HasKey()".

  * "PyMapping_HasKeyStringWithError()" ersetzt
    "PyMapping_HasKeyString()".

  Die neuen Funktionen geben im Fehlerfall "-1" zurück und wie üblich
  "1" für wahr und "0" für falsch.

  (Beigetragen von Serhiy Storchaka in gh-108511.)


Geänderte C-APIs
----------------

* Der Parameter *keywords* von "PyArg_ParseTupleAndKeywords()" und
  "PyArg_VaParseTupleAndKeywords()" hat jetzt in C den Typ char
  *const* und in C++ const char *const* statt char**. In C++ sind
  diese Funktionen damit ohne ausdrückliche Typumwandlung mit
  Argumenten der Typen const char *const*, const char** oder char
  *const* verträglich. In C unterstützen die Funktionen nur Argumente
  des Typs char *const*. Überschreiben lässt sich das mit dem Makro
  "PY_CXX_CONST". (Beigetragen von Serhiy Storchaka in gh-65210.)

* "PyArg_ParseTupleAndKeywords()" unterstützt jetzt Namen von
  Schlüsselwortparametern, die nicht ASCII sind. (Beigetragen von
  Serhiy Storchaka in gh-110815.)

* Die Funktion "PyCode_GetFirstFree()" ist jetzt instabile API und
  heißt jetzt "PyUnstable_Code_GetFirstFree()". (Beigetragen von
  Bogdan Romanyuk in gh-115781.)

* Die Funktionen "PyDict_GetItem()", "PyDict_GetItemString()",
  "PyMapping_HasKey()", "PyMapping_HasKeyString()",
  "PyObject_HasAttr()", "PyObject_HasAttrString()" und
  "PySys_GetObject()", die jeweils alle beim Aufruf aufgetretenen
  Fehler verwerfen, melden diese Fehler jetzt über
  "sys.unraisablehook()". Du kannst sie durch andere Funktionen
  ersetzen, wie es die Dokumentation empfiehlt. (Beigetragen von
  Serhiy Storchaka in gh-106672.)

* Unterstützung für die Formate "%T", "%#T", "%N" und "%#N" ist in
  "PyUnicode_FromFormat()" hinzugekommen:

  * "%T": ermittelt den vollständig qualifizierten Namen eines
    Objekttyps

  * "%#T": wie oben, aber mit einem Doppelpunkt als Trennzeichen

  * "%N": ermittelt den vollständig qualifizierten Namen eines Typs

  * "%#N": wie oben, aber mit einem Doppelpunkt als Trennzeichen

  Näheres unter **PEP 737**. (Beigetragen von Victor Stinner in
  gh-111696.)

* Du musst das Makro "PY_SSIZE_T_CLEAN" nicht mehr definieren, bevor
  du "Python.h" einbindest, wenn du "#"-Formate in Formatcodes
  verwendest. APIs, die die Formatcodes annehmen, verwenden für
  "#"-Formate immer "Py_ssize_t". (Beigetragen von Inada Naoki in
  gh-104922.)

* Ist Python im Debug-Modus oder "mit Assertions" gebaut, prüfen
  "PyTuple_SET_ITEM()" und "PyList_SET_ITEM()" das Indexargument jetzt
  mit einer Assertion. (Beigetragen von Victor Stinner in gh-106168.)


Änderungen an der eingeschränkten C-API
---------------------------------------

* Die folgenden Funktionen sind jetzt in der eingeschränkten C-API
  enthalten:

  * "PyMem_RawMalloc()"

  * "PyMem_RawCalloc()"

  * "PyMem_RawRealloc()"

  * "PyMem_RawFree()"

  * "PySys_Audit()"

  * "PySys_AuditTuple()"

  * "PyType_GetModuleByDef()"

  (Beigetragen von Victor Stinner in gh-85283 und gh-116936.)

* Mit "--with-trace-refs" gebautes Python (Verfolgung von Referenzen)
  unterstützt jetzt die eingeschränkte API. (Beigetragen von Victor
  Stinner in gh-108634.)


Entfernte C-APIs
----------------

* Mehrere Funktionen, Makros, Variablen und Ähnliches mit dem
  Namenspräfix "_Py" oder "_PY" (die als privat gelten) sind entfernt.
  Ist dein Projekt von einer dieser Entfernungen betroffen  und meinst
  du, die entfernte API sollte weiter verfügbar sein, dann eröffne
  bitte einen neuen Eintrag, um eine öffentliche C-API zu beantragen,
  und ergänze "cc: @vstinner", um Victor Stinner zu benachrichtigen.
  (Beigetragen von Victor Stinner in gh-106320.)

* Die in Python 3.0 als veraltet markierten alten Puffer-Protokolle
  sind entfernt. Verwende stattdessen Buffer-Protokoll.

  * "PyObject_CheckReadBuffer()": Verwende "PyObject_CheckBuffer()",
    um zu prüfen, ob das Objekt das Puffer-Protokoll unterstützt.
    Beachte, dass "PyObject_CheckBuffer()" nicht zusagt, dass
    "PyObject_GetBuffer()" gelingt. Um zu prüfen, ob das Objekt
    tatsächlich lesbar ist, siehe das folgende Beispiel zu
    "PyObject_GetBuffer()".

  * "PyObject_AsCharBuffer()", "PyObject_AsReadBuffer()": Verwende
    stattdessen "PyObject_GetBuffer()" und "PyBuffer_Release()":

       Py_buffer view;
       if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) < 0) {
           return NULL;
       }
       // Use `view.buf` and `view.len` to read from the buffer.
       // You may need to cast buf as `(const char*)view.buf`.
       PyBuffer_Release(&view);

  * "PyObject_AsWriteBuffer()": Verwende stattdessen
    "PyObject_GetBuffer()" und "PyBuffer_Release()":

       Py_buffer view;
       if (PyObject_GetBuffer(obj, &view, PyBUF_WRITABLE) < 0) {
           return NULL;
       }
       // Use `view.buf` and `view.len` to write to the buffer.
       PyBuffer_Release(&view);

  (Beigetragen von Inada Naoki in gh-85275.)

* Verschiedene in Python 3.9 als veraltet markierte Funktionen sind
  entfernt:

  * "PyEval_CallObject()", "PyEval_CallObjectWithKeywords()": Verwende
    stattdessen "PyObject_CallNoArgs()" oder "PyObject_Call()".

    Warnung:

      In "PyObject_Call()" müssen positionsbezogene Argumente ein
      "tuple" sein und dürfen nicht "NULL" sein, und
      Schlüsselwortargumente müssen ein "dict" oder "NULL" sein,
      während die entfernten Funktionen die Argumenttypen geprüft und
      "NULL" für positionsbezogene und Schlüsselwortargumente
      angenommen haben. Um "PyEval_CallObjectWithKeywords(func, NULL,
      kwargs)" durch "PyObject_Call()" zu ersetzen, übergib mit
      "PyTuple_New(0)" ein leeres Tupel als positionsbezogene
      Argumente.

  * "PyEval_CallFunction()": Verwende stattdessen
    "PyObject_CallFunction()".

  * "PyEval_CallMethod()": Verwende stattdessen
    "PyObject_CallMethod()".

  * "PyCFunction_Call()": Verwende stattdessen "PyObject_Call()".

  (Beigetragen von Victor Stinner in gh-105107.)

* Die folgenden alten Funktionen, um die Initialisierung von Python
  einzustellen, sind entfernt. Sie waren in Python 3.11 als veraltet
  markiert:

  * "PySys_AddWarnOptionUnicode()": Verwende stattdessen
    "PyConfig.warnoptions".

  * "PySys_AddWarnOption()": Verwende stattdessen
    "PyConfig.warnoptions".

  * "PySys_AddXOption()": Verwende stattdessen "PyConfig.xoptions".

  * "PySys_HasWarnOptions()": Verwende stattdessen
    "PyConfig.xoptions".

  * "PySys_SetPath()": Setze stattdessen
    "PyConfig.module_search_paths".

  * "Py_SetPath()": Setze stattdessen "PyConfig.module_search_paths".

  * "Py_SetStandardStreamEncoding()": Setze stattdessen
    "PyConfig.stdio_encoding" und gegebenenfalls auch
    "PyConfig.legacy_windows_stdio" (unter Windows).

  * "_Py_SetProgramFullPath()": Setze stattdessen
    "PyConfig.executable".

  Verwende stattdessen die neue "PyConfig"-API der Konfiguration der
  Python-Initialisierung (**PEP 587**), die in Python 3.8
  hinzugekommen ist. (Beigetragen von Victor Stinner in gh-105145.)

* Die Funktionen "PyEval_AcquireLock()" und "PyEval_ReleaseLock()"
  sind entfernt. Sie waren in Python 3.2 als veraltet markiert. Sie
  haben den aktuellen Thread-Zustand nicht aktualisiert. Ersetzen
  lassen sie sich durch:

  * "PyEval_SaveThread()" und "PyEval_RestoreThread()",

  * die tief liegenden "PyEval_AcquireThread()" und
    "PyEval_RestoreThread()"

  * oder "PyGILState_Ensure()" und "PyGILState_Release()".

  (Beigetragen von Victor Stinner in gh-105182.)

* Die Funktion "PyEval_ThreadsInitialized()" ist entfernt. Sie war in
  Python 3.9 als veraltet markiert. Seit Python 3.7 erzeugt
  "Py_Initialize()" immer das GIL: "PyEval_InitThreads()" aufzurufen
  tut nichts, und "PyEval_ThreadsInitialized()" gibt immer einen Wert
  ungleich null zurück. (Beigetragen von Victor Stinner in gh-105182.)

* Der andere Name "_PyInterpreterState_Get()" für
  "PyInterpreterState_Get()" ist entfernt. Er war aus
  Rückwärtsverträglichkeit mit Python 3.8 erhalten geblieben. Mit dem
  pythoncapi-compat project lässt sich "PyInterpreterState_Get()"
  unter Python 3.8 und älter nutzen. (Beigetragen von Victor Stinner
  in gh-106320.)

* Die private Funktion "_PyObject_FastCall()" ist entfernt. Verwende
  "PyObject_Vectorcall()", das seit Python 3.8 verfügbar ist (**PEP
  590**). (Beigetragen von Victor Stinner in gh-106023.)

* Die Header-Datei "cpython/pytime.h", die nur private Funktionen
  enthielt, ist entfernt. (Beigetragen von Victor Stinner in
  gh-106316.)

* Die nicht dokumentierte Konstante "PY_TIMEOUT_MAX" ist aus der
  eingeschränkten C-API entfernt. (Beigetragen von Victor Stinner in
  gh-110014.)

* Die alten Trashcan-Makros "Py_TRASHCAN_SAFE_BEGIN" und
  "Py_TRASHCAN_SAFE_END" sind entfernt. Ersetze beide durch die neuen
  Makros "Py_TRASHCAN_BEGIN" und "Py_TRASHCAN_END". (Beigetragen von
  Irit Katriel in gh-105111.)


Veraltete C-APIs
----------------

* Alte Funktionen zur Initialisierung von Python sind als veraltet
  markiert:

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

  * "Py_GetExecPrefix()": Frage stattdessen "sys.exec_prefix" ab.

  * "Py_GetPath()": Frage stattdessen "sys.path" ab.

  * "Py_GetPrefix()": Frage stattdessen "sys.prefix" ab.

  * "Py_GetProgramFullPath()": Frage stattdessen "sys.executable" ab.

  * "Py_GetProgramName()": Frage stattdessen "sys.executable" ab.

  * "Py_GetPythonHome()": Frage stattdessen "PyConfig.home" oder die
    Umgebungsvariable "PYTHONHOME" ab.

  (Beigetragen von Victor Stinner in gh-105145.)

* Die Funktionen "PyEval_GetBuiltins()", "PyEval_GetGlobals()" und
  "PyEval_GetLocals()", die eine *geliehene Referenz* zurückgeben,
  sind *sanft abgekündigt*. (Sanft abgekündigt als Teil von **PEP
  667**.)

* Die Funktion "PyImport_ImportModuleNoBlock()" ist als veraltet
  markiert. Sie ist seit Python 3.3 nur ein anderer Name für
  "PyImport_ImportModule()". (Beigetragen von Victor Stinner in
  gh-105396.)

* Die Funktion "PyModule_AddObject()" ist *sanft abgekündigt*. Sie
  sollte durch "PyModule_Add()" oder "PyModule_AddObjectRef()" ersetzt
  werden. (Beigetragen von Serhiy Storchaka in gh-86493.)

* Die alten Typen "Py_UNICODE" und "PY_UNICODE_TYPE" sowie die
  Definition "Py_UNICODE_WIDE" sind als veraltet markiert. Verwende
  stattdessen unmittelbar den Typ "wchar_t". Seit Python 3.3 sind
  "Py_UNICODE" und "PY_UNICODE_TYPE" nur andere Namen für "wchar_t".
  (Beigetragen von Victor Stinner in gh-105156.)

* Die Funktionen "PyWeakref_GetObject()" und "PyWeakref_GET_OBJECT()",
  die eine *geliehene Referenz* zurückgeben, sind als veraltet
  markiert. Ersetze sie durch die neue Funktion "PyWeakref_GetRef()",
  die eine *starke Referenz* zurückgibt. Mit dem pythoncapi-compat
  project lässt sich "PyWeakref_GetRef()" unter Python 3.12 und älter
  nutzen. (Beigetragen von Victor Stinner in gh-105927.)


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 Python 3.18
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* Die folgenden privaten Funktionen sind als veraltet markiert, die
  Entfernung ist für Python 3.18 geplant:

  * "_PyBytes_Join()": verwende "PyBytes_Join()".

  * "_PyDict_GetItemStringWithError()": verwende
    "PyDict_GetItemStringRef()".

  * "_PyDict_Pop()": verwende "PyDict_Pop()".

  * "_PyLong_Sign()": verwende "PyLong_GetSign()".

  * "_PyLong_FromDigits()" und "_PyLong_New()": verwende
    "PyLongWriter_Create()".

  * "_PyThreadState_UncheckedGet()": verwende
    "PyThreadState_GetUnchecked()".

  * "_PyUnicode_AsString()": verwende "PyUnicode_AsUTF8()".

  * "_PyUnicodeWriter_Init()": ersetze
    "_PyUnicodeWriter_Init(&writer)" durch "writer =
    PyUnicodeWriter_Create(0)".

  * "_PyUnicodeWriter_Finish()": ersetze
    "_PyUnicodeWriter_Finish(&writer)" durch
    "PyUnicodeWriter_Finish(writer)".

  * "_PyUnicodeWriter_Dealloc()": ersetze
    "_PyUnicodeWriter_Dealloc(&writer)" durch
    "PyUnicodeWriter_Discard(writer)".

  * "_PyUnicodeWriter_WriteChar()": ersetze
    "_PyUnicodeWriter_WriteChar(&writer, ch)" durch
    "PyUnicodeWriter_WriteChar(writer, ch)".

  * "_PyUnicodeWriter_WriteStr()": ersetze
    "_PyUnicodeWriter_WriteStr(&writer, str)" durch
    "PyUnicodeWriter_WriteStr(writer, str)".

  * "_PyUnicodeWriter_WriteSubstring()": ersetze
    "_PyUnicodeWriter_WriteSubstring(&writer, str, start, end)" durch
    "PyUnicodeWriter_WriteSubstring(writer, str, start, end)".

  * "_PyUnicodeWriter_WriteASCIIString()": ersetze
    "_PyUnicodeWriter_WriteASCIIString(&writer, str)" durch
    "PyUnicodeWriter_WriteASCII(writer, str)".

  * "_PyUnicodeWriter_WriteLatin1String()": ersetze
    "_PyUnicodeWriter_WriteLatin1String(&writer, str)" durch
    "PyUnicodeWriter_WriteUTF8(writer, str)".

  * "_PyUnicodeWriter_Prepare()": (kein Ersatz).

  * "_PyUnicodeWriter_PrepareKind()": (kein Ersatz).

  * "_Py_HashPointer()": verwende "Py_HashPointer()".

  * "_Py_fopen_obj()": verwende "Py_fopen()".

  Mit dem Projekt pythoncapi-compat lassen sich diese neuen
  öffentlichen Funktionen auch unter Python 3.13 und älter nutzen.
  (Beigetragen von Victor Stinner in gh-128863.)


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.


Build Änderungen
================

* "arm64-apple-ios" und "arm64-apple-ios-simulator" sind jetzt beide
  Plattformen der Stufe 3 nach **PEP 11**. (PEP 730 verfasst und
  Umsetzung beigetragen von Russell Keith-Magee in gh-114099.)

* "aarch64-linux-android" und "x86_64-linux-android" sind jetzt beide
  Plattformen der Stufe 3 nach **PEP 11**. (PEP 738 verfasst und
  Umsetzung beigetragen von Malcolm Smith in gh-116622.)

* "wasm32-wasi" ist jetzt eine Plattform der Stufe 2 nach **PEP 11**.
  (Beigetragen von Brett Cannon in gh-115192.)

* "wasm32-emscripten" ist keine nach **PEP 11** unterstützte Plattform
  mehr. (Beigetragen von Brett Cannon in gh-115192.)

* Um CPython zu bauen, wird jetzt ein Compiler benötigt, der die C11
  -Atomic-Bibliothek, die eingebauten Atomic-Funktionen von GCC oder
  die Interlocked-Intrinsics von MSVC unterstützt.

* Um das Skript "configure" neu zu erzeugen, werden jetzt Autoconf
  2.71 und aclocal 1.16.5 benötigt. (Beigetragen von Christian Heimes
  in gh-89886 und von Victor Stinner in gh-112090.)

* Um das Erweiterungsmodul "sqlite3" zu bauen, wird SQLite 3.15.2 oder
  neuer benötigt. (Beigetragen von Erlend Aasland in gh-105875.)

* CPython liefert jetzt standardmäßig die mimalloc library mit. Sie
  steht unter der MIT-Lizenz, siehe mimalloc-Lizenz. Das mitgelieferte
  mimalloc enthält eigene Änderungen, Einzelheiten unter gh-113141.
  (Beigetragen von Dino Viehland in gh-109914.)

* Die "configure"-Option "--with-system-libmpdec" steht jetzt
  standardmäßig auf "yes". Die mitgelieferte Kopie von "libmpdec" wird
  in Python 3.16 entfernt.

* Mit "configure" "--with-trace-refs" gebautes Python (Verfolgung von
  Referenzen) ist jetzt ABI-verträglich mit dem Release-Build und dem
  Debug-Build von Python. (Beigetragen von Victor Stinner in
  gh-108634.)

* Auf POSIX-Systemen enthalten die Dateinamen für pkg-config (".pc")
  jetzt die ABI-Schalter.  Der Free-Threaded-Build erzeugt zum
  Beispiel "python-3.13t.pc" und der Debug-Build "python-3.13d.pc".

* Die C-Erweiterungen "errno", "fcntl", "grp", "md5", "pwd",
  "resource", "termios", "winsound", "_ctypes_test",
  "_multiprocessing.posixshmem", "_scproxy", "_stat", "_statistics",
  "_testconsole", "_testimportmultiple" und "_uuid" werden jetzt mit
  der eingeschränkten C-API gebaut. (Beigetragen von Victor Stinner in
  gh-85283.)


Portierung auf Python 3.13
==========================

Dieser Abschnitt listet bereits beschriebene Änderungen und weitere
Fehlerbehebungen auf, die Änderungen an deinem Code erfordern können.


Änderungen in der Python API
----------------------------

* PEP 667 bringt mehrere Änderungen an der Semantik von "locals()" und
  "f_locals":

  * "locals()" in einem *optimierten Geltungsbereich* aufzurufen
    erzeugt jetzt bei jedem Aufruf eine eigenständige Momentaufnahme
    und aktualisiert damit vorher zurückgegebene Referenzen nicht mehr
    stillschweigend. Um das alte Verhalten von CPython zu bekommen,
    muss man das zuerst zurückgegebene Dictionary jetzt ausdrücklich
    mit den Ergebnissen späterer Aufrufe von "locals()" aktualisieren.
    Funktionen, die Code ausführen und dabei stillschweigend auf
    "locals()" zielen (etwa "exec" und "eval"), muss ein
    ausdrücklicher Namensraum übergeben werden, damit man in einem
    optimierten Geltungsbereich an ihre Ergebnisse kommt. (Geändert
    als Teil von **PEP 667**.)

  * "locals()" aus einer Comprehension im Modul- oder
    Klassengeltungsbereich aufzurufen (auch über "exec" oder "eval")
    verhält sich wieder so, als liefe die Comprehension als
    eigenständige verschachtelte Funktion (das heißt, die lokalen
    Variablen des umgebenden Geltungsbereichs sind nicht enthalten).
    In Python 3.12 war das mit der Umsetzung von **PEP 709** dahin
    geändert worden, dass die lokalen Variablen des umgebenden
    Geltungsbereichs enthalten waren. (Geändert als Teil von **PEP
    667**.)

  * Der Zugriff auf "FrameType.f_locals" in einem *optimierten
    Geltungsbereich* gibt jetzt einen durchschreibenden Stellvertreter
    zurück statt einer Momentaufnahme, die zu ungenau festgelegten
    Zeitpunkten aktualisiert wird. Ist eine Momentaufnahme gewünscht,
    muss sie ausdrücklich mit "dict" oder der Methode ".copy()" des
    Stellvertreters erzeugt werden. (Geändert als Teil von **PEP
    667**.)

* "functools.partial" gibt jetzt eine "FutureWarning" aus, wenn es als
  Methode verwendet wird. Das Verhalten wird sich in künftigen Python-
  Versionen ändern. Hülle es in "staticmethod()" ein, wenn du das alte
  Verhalten beibehalten willst. (Beigetragen von Serhiy Storchaka in
  gh-121027.)

* "getpass.getuser()" löst jetzt bei jedem Fehlschlag beim Ermitteln
  eines Benutzernamens einen "OSError" aus, statt auf Plattformen
  außer Unix einen "ImportError" oder auf Unix-Plattformen mit leerer
  Passwortdatenbank einen "KeyError".

* Der Wert des Attributs "mode" von "gzip.GzipFile" ist jetzt eine
  Zeichenkette ("'rb'" oder "'wb'") statt einer ganzen Zahl ("1" oder
  "2"). Der Wert des Attributs "mode" des lesbaren dateiähnlichen
  Objekts, das "zipfile.ZipFile.open()" zurückgibt, ist jetzt "'rb'"
  statt "'r'". (Beigetragen von Serhiy Storchaka in gh-115961.)

* "mailbox.Maildir" übergeht jetzt Dateien, die mit einem Punkt (".")
  beginnen. (Beigetragen von Zackery Spytz in gh-65559.)

* "pathlib.Path.glob()" und "rglob()" geben jetzt Dateien und
  Verzeichnisse zurück, wenn ein Muster angegeben ist, das auf „"**"“
  endet, und nicht mehr nur Verzeichnisse. Hänge einen Schrägstrich
  an, um das bisherige Verhalten zu behalten und nur Verzeichnisse
  abzugleichen.

* Das Modul "threading" erwartet jetzt, dass das Modul "_thread" eine
  Funktion "_is_main_interpreter()" hat. Diese Funktion nimmt keine
  Argumente und gibt "True" zurück, wenn der laufende Interpreter der
  Hauptinterpreter ist.

  Jede Bibliothek und jede Anwendung, die ein eigenes Modul "_thread"
  bereitstellt, muss "_is_main_interpreter()" mitbringen, genau wie
  die anderen „privaten“ Attribute des Moduls. (gh-112826.)


Änderungen an der C-API
-----------------------

* "Python.h" bindet den Standard-Header "<ieeefp.h>" nicht mehr ein.
  Er war wegen der Funktion "finite()" eingebunden, die jetzt der
  Header "<math.h>" bereitstellt. Er muss jetzt bei Bedarf
  ausdrücklich eingebunden werden. Auch das Makro "HAVE_IEEEFP_H" ist
  entfernt. (Beigetragen von Victor Stinner in gh-108765.)

* "Python.h" bindet diese Standard-Header-Dateien nicht mehr ein:
  "<time.h>", "<sys/select.h>" und "<sys/time.h>". Bei Bedarf müssen
  sie jetzt ausdrücklich eingebunden werden. "<time.h>" stellt zum
  Beispiel die Funktionen "clock()" und "gmtime()" bereit,
  "<sys/select.h>" die Funktion "select()" und "<sys/time.h>" die
  Funktionen "futimes()", "gettimeofday()" und "setitimer()".
  (Beigetragen von Victor Stinner in gh-108765.)

* Unter Windows bindet "Python.h" die Standard-Header-Datei
  "<stddef.h>" nicht mehr ein. Bei Bedarf muss sie jetzt ausdrücklich
  eingebunden werden. Sie stellt zum Beispiel die Funktion
  "offsetof()" sowie die Typen "size_t" und "ptrdiff_t" bereit. Auf
  allen anderen Plattformen war es ohnehin nötig, "<stddef.h>"
  ausdrücklich einzubinden. Das Makro "HAVE_STDDEF_H" ist nur unter
  Windows definiert. (Beigetragen von Victor Stinner in gh-108765.)

* Ist das Makro "Py_LIMITED_API" definiert, hebt "<Python.h>" die
  Makros "Py_BUILD_CORE", "Py_BUILD_CORE_BUILTIN" und
  "Py_BUILD_CORE_MODULE" jetzt auf. (Beigetragen von Victor Stinner in
  gh-85283.)

* Die alten Trashcan-Makros "Py_TRASHCAN_SAFE_BEGIN" und
  "Py_TRASHCAN_SAFE_END" sind entfernt. Sie sollten durch die neuen
  Makros "Py_TRASHCAN_BEGIN" und "Py_TRASHCAN_END" ersetzt werden.

  Eine "tp_dealloc"-Funktion mit den alten Makros, etwa:

     static void
     mytype_dealloc(mytype *p)
     {
         PyObject_GC_UnTrack(p);
         Py_TRASHCAN_SAFE_BEGIN(p);
         ...
         Py_TRASHCAN_SAFE_END
     }

  sollte folgendermaßen auf die neuen Makros umgestellt werden:

     static void
     mytype_dealloc(mytype *p)
     {
         PyObject_GC_UnTrack(p);
         Py_TRASHCAN_BEGIN(p, mytype_dealloc)
         ...
         Py_TRASHCAN_END
     }

  Beachte, dass "Py_TRASHCAN_BEGIN" ein zweites Argument hat, nämlich
  die Freigabefunktion, in der es steht. Die neuen Makros kamen in
  Python 3.8 hinzu, die alten Makros waren in Python 3.11 als veraltet
  markiert. (Beigetragen von Irit Katriel in gh-105111.)

* PEP 667 bringt mehrere Änderungen an den Funktionen rund um Rahmen:

  * Was es bewirkt, das von "PyEval_GetLocals()" zurückgegebene
    Dictionary in einem *optimierten Geltungsbereich* zu verändern,
    hat sich geändert. Auf diesem Weg neu hinzugefügte Dictionary-
    Einträge sind jetzt *nur* für spätere Aufrufe von
    "PyEval_GetLocals()" in diesem Rahmen sichtbar, denn
    "PyFrame_GetLocals()", "locals()" und "FrameType.f_locals" greifen
    nicht mehr auf dasselbe darunterliegende zwischengespeicherte
    Dictionary zu. Änderungen an Einträgen für tatsächliche
    Variablennamen und an Namen, die über die durchschreibenden
    Stellvertreter-Schnittstellen hinzugekommen sind, werden bei
    späteren Aufrufen von "PyEval_GetLocals()" in diesem Rahmen
    überschrieben. Wie der Code am besten angepasst wird, hängt davon
    ab, wie die Funktion verwendet wurde; Einzelheiten stehen im
    Abkündigungshinweis zu der Funktion.

  * "PyFrame_GetLocals()" in einem *optimierten Geltungsbereich*
    aufzurufen gibt jetzt einen durchschreibenden Stellvertreter
    zurück statt einer Momentaufnahme, die zu ungenau festgelegten
    Zeitpunkten aktualisiert wird. Ist eine Momentaufnahme gewünscht,
    muss sie ausdrücklich erzeugt werden (etwa mit "PyDict_Copy()")
    oder über einen Aufruf der neuen API "PyEval_GetFrameLocals()".

  * "PyFrame_FastToLocals()" und "PyFrame_FastToLocalsWithError()"
    haben keine Wirkung mehr. Diese Funktionen aufzurufen ist seit
    Python 3.11 überflüssig, als "PyFrame_GetLocals()" erstmals
    hinzukam.

  * "PyFrame_LocalsToFast()" hat keine Wirkung mehr. Diese Funktion
    aufzurufen ist überflüssig, da "PyFrame_GetLocals()" für
    *optimierte Geltungsbereiche* jetzt einen durchschreibenden
    Stellvertreter zurückgibt.

* Python 3.13 hat viele private Funktionen entfernt. Einige davon
  lassen sich durch diese Alternativen ersetzen:

  * "_PyDict_Pop()": "PyDict_Pop()" oder "PyDict_PopString()",

  * "_PyDict_GetItemWithError()": "PyDict_GetItemRef()",

  * "_PyErr_WriteUnraisableMsg()":  "PyErr_FormatUnraisable()",

  * "_PyEval_SetTrace()": "PyEval_SetTrace()" oder
    "PyEval_SetTraceAllThreads()",

  * "_PyList_Extend()": "PyList_Extend()",

  * "_PyLong_AsInt()": "PyLong_AsInt()",

  * "_PyMem_RawStrdup()": "strdup()",

  * "_PyMem_Strdup()": "strdup()",

  * "_PyObject_ClearManagedDict()": "PyObject_ClearManagedDict()",

  * "_PyObject_VisitManagedDict()": "PyObject_VisitManagedDict()",

  * "_PyThreadState_UncheckedGet()": "PyThreadState_GetUnchecked()",

  * "_PyTime_AsSecondsDouble()": "PyTime_AsSecondsDouble()",

  * "_PyTime_GetMonotonicClock()": "PyTime_Monotonic()" oder
    "PyTime_MonotonicRaw()",

  * "_PyTime_GetPerfCounter()": "PyTime_PerfCounter()" oder
    "PyTime_PerfCounterRaw()",

  * "_PyTime_GetSystemClock()": "PyTime_Time()" oder
    "PyTime_TimeRaw()",

  * "_PyTime_MAX": "PyTime_MAX",

  * "_PyTime_MIN": "PyTime_MIN",

  * "_PyTime_t": "PyTime_t",

  * "_Py_HashPointer()": "Py_HashPointer()",

  * "_Py_IsFinalizing()": "Py_IsFinalizing()".

  Mit dem pythoncapi-compat project lassen sich die meisten dieser
  neuen Funktionen auch unter Python 3.12 und älter nutzen.


Änderungen an den Regressionstests
==================================

* Mit "configure" "--with-pydebug" gebautes Python unterstützt jetzt
  die Befehlszeilenoption "-X presite=package.module". Wird sie
  verwendet, gibt sie ein Modul an, das früh im Lebenszyklus des
  Interpreters importiert werden soll, bevor "site.py" ausgeführt
  wird. (Beigetragen von Łukasz Langa in gh-110769.)
