Was ist neu in Python 3.15
**************************

Herausgeber:
   Hugo van Kemenade

This article explains the new features in Python 3.15, compared to
3.14. Python 3.15 was released on 9 October 2026. For full details,
see the changelog.

Siehe auch: **PEP 790** -- Python 3.15 release schedule


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

Python 3.15 is the latest stable release of the Python programming
language, with a mix of changes to the language, the implementation,
and the standard library. The biggest changes include lazy imports,
frozendict and sentinel builtins, UTF-8 as the default encoding,
unpacking in comprehensions, and a stable ABI for free-threaded
builds.

Zu den Änderungen an der Bibliothek gehören ein neues Profiling-Paket
mit Tachyon, einem hochfrequenten statistischen Sampling-Profiler,
mehr Farbe in der Kommandozeilenausgabe sowie die üblichen
Abkündigungen und Entfernungen und Verbesserungen bei
Benutzerfreundlichkeit und Korrektheit.

Dieser Artikel versucht nicht, eine vollständige Spezifikation aller
neuen Features zu liefern, sondern bietet stattdessen einen
praktischen Überblick. Ausführliche Informationen findest du in der
Dokumentation, etwa in der Referenz der Standardbibliothek und der
Sprachreferenz. Um die vollständige Implementierung und die
Designbegründung einer Änderung zu verstehen, lies das PEP zum
jeweiligen neuen Feature. Beachte aber, dass PEPs in der Regel nicht
mehr aktualisiert werden, sobald ein Feature vollständig implementiert
ist.

Unter Porting to Python 3.15 findest du Hinweise zum Upgrade von
früheren Python-Versionen.

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

Verbesserungen am Interpreter:

* **PEP 661**: Neuer integrierter Typ sentinel

* **PEP 686**: Python verwendet jetzt standardmäßig UTF-8 als
  Kodierung

* **PEP 798**: Entpacken in Comprehensions

* **PEP 810**: Explizite Lazy Imports für schnellere Startzeiten

* **PEP 814**: Neuer integrierter Typ frozendict

* **PEP 829**: Startkonfigurationsdateien für Pakete

* Der experimentelle JIT-Compiler wurde erheblich verbessert

* Verbesserte Fehlermeldungen

Wesentliche Verbesserungen in der Standardbibliothek:

* **PEP 799**: Ein eigenes Profiling-Paket zur Organisation der
  Python-Profiling-Werkzeuge

* **PEP 799**: Tachyon: Hochfrequenter statistischer Sampling-Profiler

* Mehr Farbe

Neue Typing-Features:

* **PEP 728**: TypedDict mit typisierten zusätzlichen Einträgen

* **PEP 747**: Annotieren von Typformen mit TypeForm

* **PEP 800**: Disjunkte Basisklassen im Typsystem

Verbesserungen der C-API:

* **PEP 782**: Eine neue C-API PyBytesWriter zum Erzeugen eines
  Python-bytes-Objekts

* **PEP 788**: Schutz vor der Finalisierung in der C-API

* **PEP 803**, **820**, **793**: Stabile ABI für Builds mit freien
  Threads und zugehörige C-API

Änderungen am Build:

* **PEP 831**: Frame-Pointer sind standardmäßig aktiviert, um die
  Beobachtbarkeit auf Systemebene zu verbessern

Änderungen an den Releases:

* Die offiziellen 64-Bit-Binärdateien für Windows verwenden jetzt den
  Tail-Calling-Interpreter

* The official macOS binaries now install free-threading support by
  default


Neue Features
=============


**PEP 810**: Explizite Lazy Imports
-----------------------------------

Große Python-Anwendungen leiden oft unter langen Startzeiten. Ein
wesentlicher Grund dafür ist das Importsystem: Wenn ein Modul
importiert wird, muss Python die Datei finden, sie von der Festplatte
lesen, sie zu Bytecode kompilieren und den gesamten Code auf oberster
Ebene ausführen. Bei Anwendungen mit tiefen Abhängigkeitsbäumen kann
dieser Vorgang Sekunden dauern, selbst wenn der größte Teil des
importierten Codes während eines bestimmten Laufs nie tatsächlich
verwendet wird.

Entwickler haben dies bisher umgangen, indem sie Importe in Funktionen
verschoben, Module mit "importlib" bei Bedarf geladen oder Code
umstrukturiert haben, um unnötige Abhängigkeiten zu vermeiden. Diese
Ansätze funktionieren, machen den Code aber schwerer lesbar und
wartbar, verteilen Import-Anweisungen über die gesamte Codebasis und
erfordern Disziplin, um konsequent angewendet zu werden.

Python bietet jetzt eine sauberere Lösung: explizite Importe mit
"lazy" über das neue Soft Keyword "lazy". Wenn du einen Import als
lazy markierst, verschiebt Python das eigentliche Laden des Moduls,
bis der importierte Name zum ersten Mal verwendet wird. So hast du den
organisatorischen Vorteil, alle Importe am Anfang der Datei zu
deklarieren, zahlst die Ladekosten aber nur für Module, die du
tatsächlich verwendest.

Das Schlüsselwort "lazy" funktioniert sowohl mit Anweisungen der Form
"import" als auch "from ... import". Wenn du "lazy import
heavy_module" schreibst, lädt Python das Modul nicht sofort.
Stattdessen erzeugt es ein leichtgewichtiges Proxy-Objekt. Das
eigentliche Laden des Moduls geschieht transparent, sobald du zum
ersten Mal auf den Namen zugreifst:

   lazy import json
   lazy from pathlib import Path

   print("Starting up...")  # json and pathlib are not fully imported yet

   data = json.loads('{"key": "value"}')  # json gets fully imported here
   p = Path(".")  # pathlib gets fully imported here

Dieser Mechanismus ist besonders nützlich für Anwendungen, die viele
Module auf oberster Ebene importieren, bei einem bestimmten Lauf aber
möglicherweise nur einen Teil davon verwenden. Das verzögerte Laden
verringert die Startlatenz, ohne dass Code umstrukturiert oder
bedingte Importe über die gesamte Codebasis verteilt werden müssen.

Schlägt das Laden eines lazy importierten Moduls fehl (zum Beispiel,
weil das Modul nicht existiert), löst Python die Ausnahme an der
Stelle der ersten Verwendung aus und nicht beim Import. Der zugehörige
Traceback enthält sowohl die Stelle, an der auf den Namen zugegriffen
wurde, als auch die ursprüngliche Import-Anweisung, sodass sich der
Fehler einfach diagnostizieren und debuggen lässt.

Wenn du Lazy Loading global aktivieren möchtest, ohne den Quellcode zu
ändern, bietet Python die Kommandozeilenoption "-X lazy_imports" und
die Umgebungsvariable "PYTHON_LAZY_IMPORTS". Beide akzeptieren zwei
Werte: "all" macht standardmäßig alle Importe lazy, und "normal" (der
Standard) berücksichtigt das Schlüsselwort "lazy" im Quellcode. Mit
den Funktionen "sys.set_lazy_imports()" und "sys.get_lazy_imports()"
lässt sich dieser Modus zur Laufzeit ändern und abfragen.

Für eine gezieltere Steuerung akzeptiert
"sys.set_lazy_imports_filter()" ein aufrufbares Objekt, das festlegt,
ob ein bestimmtes Modul lazy geladen werden soll. Der Filter erhält
drei Argumente: den Namen des importierenden Moduls (oder "None"), den
Namen des importierten Moduls und die fromlist (oder "None" bei
regulären Importen). Er sollte "True" zurückgeben, um den Import lazy
zu erlauben, oder "False", um sofortiges Laden zu erzwingen. Damit
sind Muster möglich, bei denen nur die Module deiner eigenen Anwendung
lazy sind, während Abhängigkeiten von Drittanbietern sofort geladen
werden:

   import sys

   def myapp_filter(importing, imported, fromlist):
       return imported.startswith("myapp.")
   sys.set_lazy_imports_filter(myapp_filter)
   sys.set_lazy_imports("all")

   import myapp.slow_module  # lazy (matches filter)
   import json               # eager (does not match filter)

Der Proxy-Typ selbst steht als "types.LazyImportType" für Code zur
Verfügung, der Lazy Imports programmatisch erkennen muss.

Es gibt einige Einschränkungen, wo das Schlüsselwort "lazy" verwendet
werden darf. Lazy Imports sind nur auf Modulebene erlaubt. Die
Verwendung von "lazy" innerhalb einer Funktion, eines Klassenrumpfs
oder eines Blocks "try"/"except"/"finally" löst einen "SyntaxError"
aus. Weder Stern-Importe noch Future-Importe können lazy sein ("lazy
from module import *" und "lazy from __future__ import ..." lösen
beide einen "SyntaxError" aus).

Für Code, der das Schlüsselwort "lazy" nicht direkt verwenden kann
(zum Beispiel, wenn Python-Versionen vor 3.15 unterstützt, unter 3.15+
aber trotzdem Lazy Imports genutzt werden sollen), kann ein Modul
"__lazy_modules__" als Container mit Zeichenketten vollständig
qualifizierter Modulnamen definieren. Normale Anweisungen "import" für
diese Module werden dann als lazy behandelt, mit derselben Semantik
wie beim Schlüsselwort "lazy":

   __lazy_modules__ = ["json", "pathlib"]

   import json     # lazy
   import os       # still eager

(Beigetragen von Pablo Galindo Salgado und Dino Viehland in
gh-142349.)

Siehe auch:

  **PEP 810** enthält die vollständige Spezifikation und Begründung.


**PEP 814**: Neuer integrierter Typ frozendict
----------------------------------------------

Ein neuer *unveränderlicher* Typ, "frozendict", wird dem Modul
"builtins" hinzugefügt. Er erlaubt nach der Erzeugung keine
Änderungen. Ein "frozendict" ist keine Unterklasse von "dict". Er erbt
direkt von "object". Ein "frozendict" ist *hashbar*, solange alle
seine Schlüssel und Werte hashbar sind. Ein "frozendict" behält die
Einfügereihenfolge bei, beim Vergleich wird die Reihenfolge jedoch
nicht berücksichtigt.

Zum Beispiel:

   >>> a = frozendict(x=1, y=2)
   >>> a
   frozendict({'x': 1, 'y': 2})
   >>> a['z'] = 3
   Traceback (most recent call last):
     File "<python-input-2>", line 1, in <module>
       a['z'] = 3
       ~^^^^^
   TypeError: 'frozendict' object does not support item assignment
   >>> b = frozendict(y=2, x=1)
   >>> hash(a) == hash(b)
   True
   >>> a == b
   True

Die folgenden Module der Standardbibliothek wurden aktualisiert,
sodass sie "frozendict" akzeptieren: "copy", "decimal", "json",
"marshal", "plistlib" (nur für die Serialisierung), "pickle", "pprint"
und "xml.etree.ElementTree".

"eval()" und "exec()" akzeptieren "frozendict" für *globals*, und
"type()" sowie "str.maketrans()" akzeptieren "frozendict" für *dict*.

Code, der mit "isinstance(arg, dict)" auf den Typ "dict" prüft, kann
auf "isinstance(arg, (dict, frozendict))" umgestellt werden, um auch
den Typ "frozendict" zu akzeptieren, oder auf "isinstance(arg,
collections.abc.Mapping)", um auch andere Mapping-Typen wie
"MappingProxyType" zu akzeptieren.

(Beigetragen von Victor Stinner und Donghee Na in gh-141510.)

Siehe auch:

  **PEP 814** enthält die vollständige Spezifikation und Begründung.


**PEP 661**: Neuer integrierter Typ sentinel
--------------------------------------------

Ein neuer Typ "sentinel" wird dem Modul "builtins" hinzugefügt, mit
dem sich eindeutige Sentinel-Werte mit einer knappen Darstellung
erzeugen lassen. Sentinel-Objekte behalten beim Kopieren ihre
Identität, können in Typausdrücken mit dem Operator "|" verwendet
werden und lassen sich mit pickle serialisieren, wenn sie über Modul
und Namen importierbar sind.

(Beigetragen von Jelle Zijlstra in gh-148829; PEP 661 verfasst von Tal
Einat.)

Siehe auch: **PEP 661** enthält weitere Details.


**PEP 799**: Ein eigenes Profiling-Paket
----------------------------------------

Ein neues Modul "profiling" wurde hinzugefügt, um die integrierten
Profiling-Werkzeuge von Python unter einem einzigen, kohärenten
Namensraum zusammenzufassen. Dieses Modul enthält:

* "profiling.tracing": deterministisches Tracing von Funktionsaufrufen
  (verschoben aus "cProfile").

* "profiling.sampling": ein neuer statistischer Sampling-Profiler
  (namens Tachyon).

Das Modul "cProfile" bleibt aus Gründen der Abwärtskompatibilität als
Alias erhalten. Das Modul "profile" ist veraltet und wird in Python
3.17 entfernt.

(Beigetragen von Pablo Galindo und László Kiss Kollár in gh-138122.)

Siehe auch: **PEP 799** enthält weitere Details.


Tachyon: Hochfrequenter statistischer Sampling-Profiler
-------------------------------------------------------

[Bild: Logo des Tachyon-Profilers][Bild]

Ein neuer statistischer Sampling-Profiler (Tachyon) wurde als
"profiling.sampling" hinzugefügt. Dieser Profiler ermöglicht eine
Performance-Analyse laufender Python-Prozesse mit geringem Overhead,
ohne dass Code geändert oder der Prozess neu gestartet werden muss.

Im Gegensatz zu deterministischen Profilern (wie "profiling.tracing"),
die jeden Funktionsaufruf instrumentieren, erfasst der Sampling-
Profiler in regelmäßigen Abständen Stacktraces laufender Prozesse.
Dieser Ansatz verursacht praktisch keinen Overhead und erreicht dabei
Abtastraten von **bis zu 1.000.000 Hz**. Damit ist er der schnellste
verfügbare Sampling-Profiler für Python (zum Zeitpunkt seiner
Einführung) und ideal, um Performance-Probleme in
Produktionsumgebungen zu debuggen. Diese Fähigkeit ist besonders
wertvoll für die Fehlersuche bei Performance-Problemen in
Produktivsystemen, in denen herkömmliche Profiling-Ansätze zu stark
eingreifen würden.

Zu den wichtigsten Features gehören:

* **Profiling ohne Overhead**: Hänge dich an jeden laufenden Python-
  Prozess an, ohne seine Performance zu beeinträchtigen. Ideal für das
  Debugging in Produktion, wenn du es dir nicht leisten kannst, deine
  Anwendung neu zu starten oder zu verlangsamen.

* **Keine Codeänderungen nötig**: Untersuche bestehende Anwendungen
  ohne Neustart. Richte den Profiler einfach über die PID auf einen
  laufenden Prozess und beginne mit dem Sammeln von Daten.

* **Flexible Zielmodi**:

  * Laufende Prozesse über die PID profilen ("attach") - an bereits
    laufende Anwendungen anhängen

  * Skripte direkt ausführen und profilen ("run") - Profiling ab dem
    allerersten Moment der Ausführung

  * Module ausführen und profilen ("run -m") - Pakete profilen, die
    als "python -m module" ausgeführt werden

  * Einen einmaligen Schnappschuss eines laufenden Prozesses erfassen
    ("dump") - gibt für jeden Thread einen Stack im Traceback-Stil aus
    (oder für alle asyncio-Tasks mit "--async-aware"). Nützlich, um
    hängende Prozesse zu untersuchen.

* **Mehrere Profiling-Modi**: Wähle je nach Performance-Untersuchung
  aus, was gemessen werden soll:

  * **Wall-Clock-Zeit** ("--mode wall", Standard): Misst die
    tatsächlich verstrichene Zeit einschließlich I/O, Wartezeiten im
    Netzwerk und blockierender Operationen. Verwende diesen Modus, um
    zu verstehen, wo dein Programm reale Zeit verbringt, auch beim
    Warten auf externe Ressourcen.

  * **CPU-Zeit** ("--mode cpu"): Misst nur die aktive CPU-
    Ausführungszeit, ohne I/O-Wartezeiten und Blockierungen. Verwende
    diesen Modus, um CPU-gebundene Engpässe zu finden und Rechenarbeit
    zu optimieren.

  * **GIL-Haltezeit** ("--mode gil"): Misst die Zeit, in der Pythons
    Global Interpreter Lock gehalten wird. Verwende diesen Modus, um
    herauszufinden, welche Threads die GIL-Nutzung in Multithread-
    Anwendungen dominieren.

  * **Zeit für Ausnahmebehandlung** ("--mode exception"): Erfasst
    Samples nur von Threads mit einer aktiven Ausnahme. Verwende
    diesen Modus, um den Overhead der Ausnahmebehandlung zu
    analysieren.

* **Thread-bewusstes Profiling**: Option, alle Threads ("-a") oder nur
  den Haupt-Thread zu profilen – unverzichtbar, um das Verhalten von
  Multithread-Anwendungen zu verstehen.

* **Mehrere Ausgabeformate**: Wähle die Visualisierung, die am besten
  zu deinem Workflow passt:

  * "--pstats": Detaillierte tabellarische Statistiken, kompatibel mit
    "pstats". Zeigt Zeitangaben auf Funktionsebene mit direkten und
    kumulativen Samples. Am besten geeignet für detaillierte Analysen
    und die Integration mit bestehenden Python-Profiling-Werkzeugen.

  * "--collapsed": Erzeugt zusammengefasste Stacktraces (eine Zeile
    pro Stack). Dieses Format ist speziell dafür gedacht, Flame Graphs
    mit externen Werkzeugen wie den FlameGraph-Skripten von Brendan
    Gregg oder speedscope zu erstellen.

  * "--flamegraph": Erzeugt einen eigenständigen, interaktiven HTML-
    Flame-Graph mit D3.js. Er öffnet sich direkt in deinem Browser für
    eine sofortige visuelle Analyse. Flame Graphs zeigen die
    Aufrufhierarchie, wobei die Breite die verbrauchte Zeit darstellt.
    So lassen sich Engpässe auf einen Blick erkennen.

  * "--gecko": Erzeugt das Gecko-Profiler-Format, kompatibel mit dem
    Firefox Profiler. Lade die Ausgabe in den Firefox Profiler hoch,
    um erweiterte zeitleistenbasierte Analysen mit Features wie Stack-
    Charts, Markern und Netzwerkaktivität durchzuführen.

  * "--heatmap": Erzeugt eine interaktive HTML-Heatmap mit Sample-
    Zahlen pro Zeile. Legt ein Verzeichnis mit Heatmaps pro Datei an,
    die genau zeigen, wo auf Quellcodeebene Zeit verbraucht wird.

* **Interaktiver Live-Modus**: Echtzeit-TUI-Profiler mit einer
  Oberfläche ähnlich wie top ("--live"). Beobachte die Performance,
  während deine Anwendung läuft, mit interaktivem Sortieren und
  Filtern.

* **Async-bewusstes Profiling**: Profiling von async/await-Code mit
  taskbasierter Rekonstruktion des Stacks ("--async-aware"). Sieh,
  welche Koroutinen Zeit verbrauchen, mit Optionen, nur laufende Tasks
  oder alle Tasks einschließlich wartender anzuzeigen.

* **Profiling auf Opcode-Ebene**: Sammle Informationen zu Bytecode-
  Opcodes für Profiling auf Instruktionsebene ("--opcodes"). Zeigt,
  welche Bytecode-Instruktionen ausgeführt werden, einschließlich der
  Spezialisierungen des adaptiven Interpreters.

Die vollständige Dokumentation mit allen verfügbaren Ausgabeformaten,
Profiling-Modi und Konfigurationsoptionen findest du unter
"profiling.sampling".

(Beigetragen von Pablo Galindo und László Kiss Kollár in gh-135953 und
gh-138122.)


**PEP 831**: Frame-Pointer standardmäßig aktiviert
--------------------------------------------------

CPython wird jetzt auf Plattformen, die dies unterstützen,
standardmäßig mit Frame-Pointern gebaut. Dabei werden die Compiler-
Flags "-fno-omit-frame-pointer" und "-mno-omit-leaf-frame-pointer"
verwendet, wodurch das native Stack-Unwinding für System-Profiler,
Debugger, Werkzeuge zur Absturzanalyse und eBPF-basierte
Observability-Werkzeuge schneller und zuverlässiger wird.

Die Flags werden über "sysconfig" bereitgestellt, sodass
Erweiterungsmodule, die von Werkzeugen gebaut werden, welche die
Build-Konfiguration von Python übernehmen, standardmäßig Frame-Pointer
erben. Diese Weitergabe ist beabsichtigt: Gemischtes Python/natives
Profiling benötigt eine lückenlose Kette von Frame-Pointern durch den
Interpreter, Erweiterungsmodule, einbettende Anwendungen und native
Bibliotheken.

Wichtig:

  Build-Backends von Drittanbietern und native Build-Systeme sollten
  diese Flags beibehalten, wenn sie die Werte aus Pythons "sysconfig"
  übernehmen. Build-Systeme, die C, C++, Rust oder anderen nativen
  Code kompilieren, ohne die Compiler-Flags von Python zu erben,
  sollten selbst gleichwertige Frame-Pointer-Flags aktivieren. Eine
  einzige native Komponente, die ohne Frame-Pointer gebaut wurde, kann
  das Stack-Unwinding für den gesamten Python-Prozess unterbrechen.

(Beigetragen von Pablo Galindo Salgado und Savannah Ostrowski in
gh-149201; PEP 831 verfasst von Pablo Galindo Salgado, Ken Jin,
Savannah Ostrowski und Diego Russo.)

Siehe auch: **PEP 831** enthält weitere Details.


**PEP 798**: Entpacken in Comprehensions
----------------------------------------

List-, Set- und Dictionary-Comprehensions sowie Generator-Ausdrücke
unterstützen jetzt das Entpacken mit "*" und "**". Damit wird die
Entpack-Syntax aus **PEP 448** auf Comprehensions erweitert. Sie
bietet eine neue Syntax, um eine beliebige Anzahl iterierbarer Objekte
oder Dictionaries zu einer einzigen flachen Struktur zusammenzuführen.
Diese neue Syntax ist eine direkte Alternative zu verschachtelten
Comprehensions, "itertools.chain()" und
"itertools.chain.from_iterable()". Zum Beispiel:

   >>> lists = [[1, 2], [3, 4], [5]]
   >>> [*L for L in lists]  # equivalent to [x for L in lists for x in L]
   [1, 2, 3, 4, 5]

   >>> sets = [{1, 2}, {2, 3}, {3, 4}]
   >>> {*s for s in sets}  # equivalent to {x for s in sets for x in s}
   {1, 2, 3, 4}

   >>> dicts = [{'a': 1}, {'b': 2}, {'a': 3}]
   >>> {**d for d in dicts}  # equivalent to {k: v for d in dicts for k,v in d.items()}
   {'a': 3, 'b': 2}

Generator-Ausdrücke können das Entpacken auf ähnliche Weise nutzen, um
Werte aus mehreren iterierbaren Objekten zu liefern:

   >>> gen = (*L for L in lists)  # equivalent to (x for L in lists for x in L)
   >>> list(gen)
   [1, 2, 3, 4, 5]

Diese Änderung gilt auch für asynchrone Generator-Ausdrücke. So ist
zum Beispiel "(*a async for a in agen())" gleichwertig zu "(x async
for a in agen() for x in a)".

(Beigetragen von Adam Hartz in gh-143055.)

Siehe auch: **PEP 798** enthält weitere Details.


**PEP 829**: Startkonfigurationsdateien für Pakete
--------------------------------------------------

Die vom Modul "site" geladenen .pth-Dateien (sofern "-S" nicht
angegeben ist) können Zeilen enthalten, die "sys.path" erweitern, aber
auch beliebigen Code ausführen, wenn die Zeile mit "import" beginnt
(gefolgt von einem Leerzeichen oder Tabulator). Letztere
Funktionalität kann problematisch sein, da schwer nachzuvollziehen
ist, was genau beim Start von Python ausgeführt wird.

Als Schritt hin zu einer besseren Überprüfbarkeit von Code, der vor
dem Start ausgeführt wird, führt Python 3.15 .start-Dateien ein. Sie
enthalten Einstiegspunkt-Angaben der Form "pkg.mod:callable", wobei
"pkg.mod" der Importpfad zum jeweiligen aufrufbaren Objekt ist. Beim
Start von Python wird das aufrufbare Objekt gesucht und ohne Argumente
aufgerufen.

Zeilen mit "import" in Dateien vom Typ ".pth" sind stillschweigend
veraltet. Wird eine passende Datei vom Typ ".start" gefunden, werden
Zeilen mit "import" in Dateien vom Typ ".pth" ignoriert. Für Zeilen,
die "sys.path" erweitern, ändert sich in Dateien vom Typ ".pth"
nichts.

Das Modul "site" stellt außerdem "site.StartupState" bereit, um die
Startverarbeitung für mehrere Site-Verzeichnisse zu bündeln. Dadurch
wird sichergestellt, dass alle statischen Pfaderweiterungen angewendet
werden, bevor Startcode ausgeführt wird. "site.main()" verwendet
implizit eine Instanz dieser Klasse, um beim normalen Start des
Interpreters alle Startkonfigurationsdateien gebündelt zu verarbeiten.
Wenn du dasselbe Bündelungsverhalten benötigst, kannst du direkt ein
"StartupState" erzeugen, es mit "addsitedir()",
"addusersitepackages()" und "addsitepackages()" steuern und am Ende
einmal "process()" aufrufen.

(Beigetragen von Barry Warsaw in gh-148641 und gh-150228.)


**PEP 803**: Stabile ABI für Builds mit freien Threads
------------------------------------------------------

C-Erweiterungen, die auf die stabile ABI abzielen, können jetzt für
die neue *stabile ABI für Builds mit freien Threads* (auch bekannt als
"abi3t") kompiliert werden, wodurch sie mit *Builds mit freien
Threads* von CPython kompatibel werden. Dies erfordert in der Regel
einige nicht triviale Änderungen am Quellcode, und zwar:

* Umstieg auf die mit **PEP 697** (Python 3.12) eingeführte API, etwa
  ein negatives "basicsize" und "PyObject_GetTypeData()", statt
  "PyObject" zum Teil der Instanz-Struktur zu machen, und

* Umstieg von einer Funktion "PyInit_" auf einen neuen Export-Hook,
  "PyModExport_*", der zu diesem Zweck in **PEP 793** eingeführt
  wurde, mit einer neuen Struktur "PySlot", die in **PEP 820**
  eingeführt wurde.

Beachte, dass die stabile ABI nicht die gesamte Funktionalität bietet,
die CPython zu bieten hat. Erweiterungen, die nicht auf "abi3t"
umsteigen können, sollten weiterhin getrennt für die bestehende
stabile ABI ("abi3") und die versionsspezifische ABI für freie Threads
("cp315t") gebaut werden.

Stable ABI for Free-Threaded Builds should typically be selected in a
build tool. Tools with "abi3t" support include meson-python, scikit-
build-core, and Maturin; see Den Build einrichten for links to their
documentation on "abi3t" builds. If your build tool does not support
"abi3t", compile for "cp315t" separately. If not using a build tool --
or when writing such a tool -- you can select "abi3t" by setting the
macro "Py_TARGET_ABI3T" as discussed in Compiling for Stable ABI.

A practical migration guide for switching to "abi3t" is available. The
community-maintained Python Free-Threading Guide provides examples of
building and testing "abi3t" wheels.

Siehe auch: **PEP 803** enthält weitere Details.


**PEP 788**: Schutz der C-API vor der Finalisierung des Interpreters
--------------------------------------------------------------------

In der C-API kann das *Beenden des Interpreters* für viele
Erweiterungen problematisch sein, weil das *Anhängen* eines Thread-
Zustands den Thread dauerhaft blockiert, was zu Deadlocks und anderen
sporadischen Problemen führt. Außerdem war es bisher nicht möglich,
sicher zu prüfen, ob ein Interpreter noch existiert, bevor man ihn
verwendet. Das führte zu Abstürzen, wenn ein Thread einen Interpreter
löscht, während ein anderer Thread gleichzeitig versucht, sich an ihn
anzuhängen.

Es gibt jetzt mehrere neue API-Gruppen, um diese Probleme zu umgehen:

* Interpreter-Guards, die verhindern, dass ein Interpreter finalisiert
  wird.

* Interpreter-Views, die einen threadsicheren Zugriff auf einen
  Interpreter ermöglichen, der möglicherweise gleichzeitig finalisiert
  oder gelöscht wird.

* Neue APIs zum automatischen An- und Abhängen von Thread-Zuständen,
  die einen integrierten Schutz vor der Finalisierung mitbringen.

Außerdem wurden die APIs der Familie "PyGILState" (insbesondere
"PyGILState_Ensure()" und "PyGILState_Release()") als *sanft
abgekündigt* markiert. Es ist **nicht** geplant, sie zu entfernen, und
bestehender Code funktioniert weiterhin, aber in künftigen Python-
Versionen wird es keine neuen APIs der Familie "PyGILState" mehr
geben.

(Beigetragen von Peter Bierma in gh-149101.)

Siehe auch: **PEP 788** enthält weitere Details.


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

* Der Interpreter liefert jetzt hilfreichere Vorschläge in Ausnahmen
  vom Typ "AttributeError", wenn auf ein nicht existierendes Attribut
  eines Objekts zugegriffen wird, ein ähnliches Attribut aber über
  eines seiner Member verfügbar ist.

  Wenn das Objekt zum Beispiel ein Attribut hat, das selbst den
  angeforderten Namen bereitstellt, schlägt die Fehlermeldung vor,
  über dieses innere Attribut darauf zuzugreifen:

     from dataclasses import dataclass
     from math import pi

     @dataclass
     class Circle:
        radius: float

        @property
        def area(self) -> float:
           return pi * self.radius**2

     class Container:
        def __init__(self, inner: Circle) -> None:
           self.inner = inner

     circle = Circle(radius=4.0)
     container = Container(circle)
     print(container.area)

  Wenn du diesen Code ausführst, erhältst du jetzt einen klareren
  Vorschlag:

     Traceback (most recent call last):
       File "example.py", line 18, in <module>
         print(container.area)
               ^^^^^^^^^^^^^^
     AttributeError: 'Container' object has no attribute 'area'. Did you mean '.inner.area' instead of '.area'?

* Wenn es bei einem "AttributeError" für einen integrierten Typ keinen
  ähnlichen Treffer über die Levenshtein-Distanz gibt, prüft die
  Fehlermeldung jetzt eine statische Tabelle gängiger Methodennamen
  aus anderen Sprachen (JavaScript, Java, Ruby, C#) und schlägt die
  Python-Entsprechung vor:

     >>> [1, 2, 3].push(4)
     Traceback (most recent call last):
     ...
     AttributeError: 'list' object has no attribute 'push'. Did you mean '.append'?

     >>> 'hello'.toUpperCase()
     Traceback (most recent call last):
     ...
     AttributeError: 'str' object has no attribute 'toUpperCase'. Did you mean '.upper'?

  Wenn die Python-Entsprechung ein Sprachkonstrukt statt einer Methode
  ist, beschreibt der Hinweis das Konstrukt direkt:

     >>> {}.put("a", 1)
     Traceback (most recent call last):
     ...
     AttributeError: 'dict' object has no attribute 'put'. Use d[k] = v.

  Wenn auf einem unveränderlichen Typ eine verändernde Methode
  aufgerufen wird, schlägt der Hinweis das veränderliche Gegenstück
  vor:

     >>> (1, 2, 3).append(4)
     Traceback (most recent call last):
     ...
     AttributeError: 'tuple' object has no attribute 'append'. Did you mean to use a 'list' object?

  Diese Hinweise funktionieren auch für Unterklassen integrierter
  Typen.

  (Beigetragen von Matt Van Horn in gh-146406.)

* Der Interpreter versucht jetzt, einen Vorschlag zu machen, wenn
  "delattr()" wegen eines fehlenden Attributs fehlschlägt. Wird ein
  Attributname verwendet, der einem vorhandenen Attribut sehr ähnlich
  ist, schlägt der Interpreter in der Fehlermeldung den korrekten
  Attributnamen vor. Zum Beispiel:

     >>> class A:
     ...     pass
     >>> a = A()
     >>> a.abcde = 1
     >>> del a.abcdf
     Traceback (most recent call last):
     ...
     AttributeError: 'A' object has no attribute 'abcdf'. Did you mean: 'abcde'?

  (Beigetragen von Nikita Sobolev und Pranjal Prajapati in gh-136588.)

* Mehrere Fehlermeldungen, die den Begriff „argument“ falsch
  verwendeten, wurden korrigiert. (Beigetragen von Stan Ulbrych in
  gh-133382.)


Weitere Sprachänderungen
========================

* Python verwendet jetzt UTF-8 als Standardkodierung, unabhängig von
  der Systemumgebung. Das bedeutet, dass I/O-Operationen ohne
  explizite Kodierung, zum Beispiel "open('flying-circus.txt')", UTF-8
  verwenden. UTF-8 ist eine weit verbreitete Zeichenkodierung für
  Unicode, die sich *de facto* als Standard für die Darstellung von
  Text durchgesetzt hat, unter anderem auf nahezu jeder Webseite im
  Internet, in vielen gängigen Dateiformaten, Programmiersprachen und
  mehr.

  Dies gilt nur, wenn kein Argument "encoding" angegeben ist. Für die
  beste Kompatibilität zwischen Python-Versionen solltest du immer
  explizit ein Argument "encoding" angeben. Mit der optionalen
  Kodierungswarnung lässt sich Code finden, der von dieser Änderung
  betroffen sein könnte. Das spezielle Argument "encoding='locale'"
  verwendet die Kodierung des aktuellen Gebietsschemas und wird seit
  Python 3.10 unterstützt.

  Um das bisherige Verhalten beizubehalten, kann der UTF-8-Modus von
  Python mit der Umgebungsvariable "PYTHONUTF8=0" oder der
  Kommandozeilenoption "-X utf8=0" deaktiviert werden.

  (Beigetragen von Adam Turner in gh-133711; PEP 686 verfasst von
  Inada Naoki.)

  Siehe auch: **PEP 686** enthält weitere Details.

* Die Hilfe des Interpreters (etwa "python --help") ist jetzt farbig.
  Dies lässt sich über Umgebungsvariablen steuern. (Beigetragen von
  Hugo van Kemenade in gh-148766.)

* Nicht weiterleitbare Ausnahmen (unraisable exceptions) werden jetzt
  standardmäßig farbig hervorgehoben. Dies lässt sich über
  Umgebungsvariablen steuern. (Beigetragen von Peter Bierma in
  gh-134170.)

* Mehr Farbe in argparse, ast, calendar, difflib, http.server,
  pickletools, PyREPL-Tab-Vervollständigung, python --help, sqlite3,
  timeit, tokenize, nicht weiterleitbaren Ausnahmen und in der
  Kommandozeilenhilfe der *stdlib* (ast, compileall, doctest, gzip,
  inspect, json.tool, pdb, profiling.sampling, random, regrtest,
  sqlite3, timeit, tokenize, trace, unittest, uuid, zipapp, zipfile).

* Die Darstellung durch "__repr__()" von "ImportError" und
  "ModuleNotFoundError" zeigt „name“ und „path“ jetzt als
  "name=<name>" und "path=<path>" an, wenn sie bei der Erzeugung als
  Schlüsselwortargumente übergeben wurden. (Beigetragen von Serhiy
  Storchaka, Oleg Iarygin und Yoav Nir in gh-74185.)

* Die Deskriptoren "__dict__" und "__weakref__" verwenden jetzt eine
  einzige Deskriptor-Instanz pro Interpreter, die von allen Typen
  gemeinsam genutzt wird, die sie benötigen. Das beschleunigt die
  Erzeugung von Klassen und hilft, Referenzzyklen zu vermeiden.
  (Beigetragen von Petr Viktorin in gh-135228.)

* Die Option "-W" und die Umgebungsvariable "PYTHONWARNINGS" können
  jetzt reguläre Ausdrücke statt literaler Zeichenketten angeben, um
  die Warnmeldung und den Modulnamen abzugleichen, sofern das
  entsprechende Feld mit einem Schrägstrich ("/") beginnt und endet.
  (Beigetragen von Serhiy Storchaka in gh-134716.)

* Funktionen, die Zeitstempel- oder Timeout-Argumente entgegennehmen,
  akzeptieren jetzt beliebige reelle Zahlen (etwa "Decimal" und
  "Fraction"), nicht nur Ganzzahlen oder Gleitkommazahlen, wobei sich
  die Genauigkeit dadurch nicht verbessert. (Beigetragen von Serhiy
  Storchaka in gh-67795.)

* "bytearray.take_bytes(n=None, /)" wurde hinzugefügt, um Bytes ohne
  Kopieren aus einem "bytearray" zu entnehmen. Damit lässt sich Code
  optimieren, der "bytes" zurückgeben muss, nachdem er mit einem
  veränderlichen Byte-Puffer gearbeitet hat, etwa beim Puffern von
  Daten, beim Parsen von Netzwerkprotokollen, beim Kodieren,
  Dekodieren und Komprimieren. Gängige Codemuster, die sich mit
  "take_bytes()" optimieren lassen, sind unten aufgeführt.


  Vorgeschlagene Refactorings zur Optimierung
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

  +-----------------------------------+-----------------------------------+-----------------------------------+
  | Beschreibung                      | Alt                               | Neu                               |
  |===================================|===================================|===================================|
  | "bytes" zurückgeben, nachdem mit  | def read() -> bytes:     buffer = | def read() -> bytes:     buffer = |
  | einem "bytearray" gearbeitet      | bytearray(1024)     ...           | bytearray(1024)     ...           |
  | wurde                             | return bytes(buffer)              | return buffer.take_bytes()        |
  +-----------------------------------+-----------------------------------+-----------------------------------+
  | Einen Puffer leeren und dabei die | buffer = bytearray(1024) ... data | buffer = bytearray(1024) ... data |
  | Bytes erhalten                    | = bytes(buffer) buffer.clear()    | = buffer.take_bytes()             |
  +-----------------------------------+-----------------------------------+-----------------------------------+
  | Einen Puffer an einem bestimmten  | buffer = bytearray(b'abc\ndef') n | buffer = bytearray(b'abc\ndef') n |
  | Trennzeichen aufteilen            | = buffer.find(b'\n') data =       | = buffer.find(b'\n') data =       |
  |                                   | bytes(buffer[:n + 1]) del         | buffer.take_bytes(n + 1)          |
  |                                   | buffer[:n + 1] assert data ==     |                                   |
  |                                   | b'abc\n' assert buffer ==         |                                   |
  |                                   | bytearray(b'def')                 |                                   |
  +-----------------------------------+-----------------------------------+-----------------------------------+
  | Einen Puffer an einem bestimmten  | buffer = bytearray(b'abc\ndef') n | buffer = bytearray(b'abc\ndef') n |
  | Trennzeichen aufteilen, den Rest  | = buffer.find(b'\n') data =       | = buffer.find(b'\n')              |
  | nach dem Trennzeichen verwerfen   | bytes(buffer[:n]) buffer.clear()  | buffer.resize(n) data =           |
  |                                   | assert data == b'abc' assert      | buffer.take_bytes()               |
  |                                   | len(buffer) == 0                  |                                   |
  +-----------------------------------+-----------------------------------+-----------------------------------+

  (Beigetragen von Cody Maloney in gh-139871.)

* Viele Funktionen zum Kompilieren oder Parsen von Python-Code, etwa
  "compile()", "ast.parse()", "symtable.symtable()" und
  "importlib.abc.InspectLoader.source_to_code()", erlauben jetzt die
  Übergabe des Modulnamens. Er wird benötigt, um Syntaxwarnungen
  eindeutig nach Modulnamen zu filtern. (Beigetragen von Serhiy
  Storchaka in gh-135801.)

* Für jede Klasse dürfen jetzt *__dict__* und *__weakref__* als
  __slots__ definiert werden. (Beigetragen von Serhiy Storchaka in
  gh-41779.)

* Beliebige __slots__ dürfen jetzt für Klassen definiert werden, die
  von "tuple" abgeleitet sind (einschließlich der mit
  "collections.namedtuple()" erzeugten Klassen). (Beigetragen von
  Serhiy Storchaka in gh-41779.)

* Der Typ "slice" unterstützt jetzt die Indexnotation und ist damit
  ein *generischer Typ*. (Beigetragen von James Hilton-Balfe in
  gh-128335.)

* Die Klasse "memoryview" unterstützt jetzt die C-Typen float complex
  und double complex mit den Formatzeichen "'Zf'" beziehungsweise
  "'Zd'". (Beigetragen von Victor Stinner in gh-146151 und gh-148675.)

* Das Argument *count* von "bytes.replace()" darf jetzt als
  Schlüsselwortargument übergeben werden. (Beigetragen von Stan
  Ulbrych in gh-147856.)

* Ein unäres Plus ist jetzt in Literal-Mustern von "match" erlaubt,
  analog zur bestehenden Unterstützung für das unäre Minus.
  (Beigetragen von Bartosz Sławecki in gh-145239.)

* Das Importsystem erwirbt Sperren pro Modul jetzt in hierarchischer
  Reihenfolge (übergeordnete Pakete vor ihren Untermodulen). Damit
  wird ein seit Langem bestehender Deadlock behoben, bei dem sich ein
  Thread, der "pkg.sub" importiert, und ein anderer, der "pkg.sub.mod"
  importiert, gegenseitig blockieren konnten, wenn
  "pkg/sub/__init__.py" das Modul "pkg.sub.mod" importiert.
  (Beigetragen von Gregory P. Smith in gh-83065.)

* Dateinamen von Erweiterungen für die stabile ABI, die die Endung
  ".so" verwenden, dürfen jetzt ein Multiarch-Tupel enthalten, zum
  Beispiel "foo.abi3-x86-64-linux-gnu.so". Dadurch können
  Erweiterungen für die stabile ABI für mehrere Architekturen im
  selben Verzeichnis installiert werden, ohne miteinander zu
  kollidieren, so wie es bei regulären dynamischen Erweiterungen
  bereits möglich ist. (Beigetragen von Stefano Rivera in gh-122931.)

* Das Attribut "__cached__" von Modulen, das seit Version 3.13
  veraltet ist, wird vom Importsystem und der Standardbibliothek weder
  gesetzt noch berücksichtigt. Verwende stattdessen "__spec__.cached".
  (Beigetragen von Brett Cannon in gh-97879.)

  Beachte, dass die Attribute "__loader__" und "__package__" ebenfalls
  veraltet sind und entfernt werden sollen.


Interaktive Standard-Shell
==========================

* Tab-Vervollständigungen werden jetzt nach Art des Objekts
  eingefärbt, basierend auf fancycompleter. Setze
  "PYTHON_BASIC_COMPLETER", um auf "rlcompleter" zurückzugreifen. Die
  Farbe lässt sich auch über Umgebungsvariablen steuern. (Beigetragen
  von Antonio Cuni und Pablo Galindo in gh-130472.)

* Die Tab-Vervollständigung schlägt jetzt Modulattribute in
  Anweisungen der Form "from ... import" vor. Attribute können erst
  vorgeschlagen werden, wenn das Modul importiert ist. Daher werden
  Module der *stdlib* automatisch importiert, während die
  Vervollständigung bei anderen Modulen anbietet, sie zu importieren,
  wenn "Tab" ein zweites Mal gedrückt wird. (Beigetragen von Loïc
  Simon und Pablo Galindo in gh-140870.)


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


math.integer
------------

Dieses Modul bietet Zugriff auf die mathematischen Funktionen für
ganzzahlige Argumente (**PEP 791**). (Beigetragen von Serhiy Storchaka
in gh-81313.)


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


argparse
--------

* Die Aktion "BooleanOptionalAction" unterstützt jetzt lange Optionen
  mit einfachem Bindestrich und alternative Präfixzeichen.
  (Beigetragen von Serhiy Storchaka in gh-138525.)

* Der Standardwert des Parameters *suggest_on_error* von
  "argparse.ArgumentParser" ist jetzt "True". Dadurch werden
  standardmäßig Vorschläge für falsch geschriebene Argumente
  angezeigt. (Beigetragen von Jakob Schluse in gh-140450.)

* Unterstützung für Backtick-Markup in Beschreibung und Epilog von
  "ArgumentParser" hinzugefügt, um Inline-Code hervorzuheben, wenn die
  farbige Ausgabe aktiviert ist. (Beigetragen von Savannah Ostrowski
  in gh-142390.)

* Das Backtick-Markup wurde auf den Hilfetext ("help") von Argumenten
  erweitert, und doppelte Backticks (im Stil von RST-Inline-Literalen)
  werden jetzt unterstützt. (Beigetragen von Hugo van Kemenade in
  gh-149375.)


array
-----

* Unterstützung für die C-Typen float complex und double complex mit
  den Formatzeichen "'Zf'" beziehungsweise "'Zd'". (Beigetragen von
  Victor Stinner in gh-146151 und gh-148675.)

* Unterstützung für Gleitkommazahlen halber Genauigkeit (16-Bit-
  Austauschformat nach IEEE 754) mit dem Formatzeichen "'e'".
  (Beigetragen von Sergey B Kirpichev in gh-146238.)

* Der Typ von "array.typecodes" wurde von "str" zu "tuple" geändert,
  um Typcodes zu unterstützen, die länger als ein Zeichen sind ("Zf"
  und "Zd"). (Beigetragen von Victor Stinner in gh-148675.)


ast
---

* Parameter *color* zu "dump()" hinzugefügt. Bei "True" wird die
  zurückgegebene Zeichenkette mit ANSI-Escape-Sequenzen syntaktisch
  hervorgehoben. Bei "False" (Standard) ist die farbige Ausgabe immer
  deaktiviert. (Beigetragen von Stan Ulbrych in gh-148981.)

* Die Ausgabe auf der Kommandozeile wird jetzt standardmäßig
  syntaktisch hervorgehoben. Dies lässt sich über Umgebungsvariablen
  steuern. (Beigetragen von Stan Ulbrych in gh-148981.)


asyncio
-------

* "TaskGroup.cancel" wurde hinzugefügt, um eine Task-Gruppe vorzeitig
  zu beenden, zum Beispiel wenn das Ziel der Tasks erreicht ist oder
  ihre Dienste nicht mehr benötigt werden. Bisher erforderte das
  unintuitiven Boilerplate-Code, etwa einen zusätzlichen Task, der
  eine eigene Ausnahme auslöst, die dann beim Verlassen der Task-
  Gruppe unterdrückt wird. (Beigetragen von John Belmonte in
  gh-127214.)


base64
------

* Parameter *pad* in "z85encode()" hinzugefügt. (Beigetragen von Hauke
  Dämpfling in gh-143103.)

* Parameter *padded* in "b32encode()", "b32decode()",
  "b32hexencode()", "b32hexdecode()", "b64encode()", "b64decode()",
  "urlsafe_b64encode()" und "urlsafe_b64decode()" hinzugefügt.
  (Beigetragen von Serhiy Storchaka in gh-73613.)

* Parameter *wrapcol* in "b16encode()", "b32encode()",
  "b32hexencode()", "b64encode()", "b85encode()" und "z85encode()"
  hinzugefügt. (Beigetragen von Serhiy Storchaka in gh-143214 und
  gh-146431.)

* Parameter *ignorechars* in "b16decode()", "b32decode()",
  "b32hexdecode()", "b64decode()", "b85decode()" und "z85decode()"
  hinzugefügt. (Beigetragen von Serhiy Storchaka in gh-144001 und
  gh-146431.)

* Parameter *canonical* in "b32decode()", "b32hexdecode()",
  "b64decode()", "a85decode()", "b85decode()" und "z85decode()"
  hinzugefügt, um Kodierungen mit von null verschiedenen Füllbits oder
  anderen nicht kanonischen Formen abzulehnen. (Beigetragen von
  Gregory P. Smith in gh-146311.)


binascii
--------

* Funktionen für die Base32-Kodierung hinzugefügt:

  * "b2a_base32()" und "a2b_base32()"

  (Beigetragen von James Seo in gh-146192.)

* Funktionen für die Kodierungen Ascii85, Base85 und Z85 hinzugefügt:

  * "b2a_ascii85()" und "a2b_ascii85()"

  * "b2a_base85()" und "a2b_base85()"

  (Beigetragen von James Seo und Serhiy Storchaka in gh-101178.)

* Parameter *padded* in "b2a_base32()", "a2b_base32()", "b2a_base64()"
  und "a2b_base64()" hinzugefügt. (Beigetragen von Serhiy Storchaka in
  gh-73613.)

* Parameter *wrapcol* in "b2a_base64()" hinzugefügt. (Beigetragen von
  Serhiy Storchaka in gh-143214.)

* Parameter *alphabet* in "b2a_base64()" und "a2b_base64()"
  hinzugefügt. (Beigetragen von Serhiy Storchaka in gh-145980.)

* Parameter *ignorechars* in "a2b_hex()", "unhexlify()" und
  "a2b_base64()" hinzugefügt. (Beigetragen von Serhiy Storchaka in
  gh-144001 und gh-146431.)

* Parameter *canonical* in "a2b_base64()" hinzugefügt, um Kodierungen
  mit von null verschiedenen Füllbits abzulehnen. (Beigetragen von
  Gregory P. Smith in gh-146311.)


calendar
--------

* Die Textausgabe von "calendar" auf der Kommandozeile ist jetzt
  farbiger. Dies lässt sich über Umgebungsvariablen steuern.
  (Beigetragen von Hugo van Kemenade in gh-148352.)

* Die HTML-Ausgabe von "calendar" auf der Kommandozeile akzeptiert
  jetzt die Angabe von Jahr und Monat: "python -m calendar -t html
  2009 06". (Beigetragen von Pål Grønås Drange in gh-140212.)

* Von der Klasse "calendar.HTMLCalendar" erzeugte Kalenderseiten
  unterstützen jetzt einen Dark Mode und wurden für eine bessere
  Barrierefreiheit auf den HTML5-Standard umgestellt. (Beigetragen von
  Jiahao Li und Hugo van Kemenade in gh-137634.)


collections
-----------

* "collections.Counter.__xor__()" und "collections.Counter.__ixor__()"
  wurden hinzugefügt, um die symmetrische Differenz zwischen Objekten
  vom Typ "Counter" zu berechnen. (Beigetragen von Raymond Hettinger
  in gh-138682.)


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

* Die Fehlerberichterstattung wurde verbessert, wenn ein Kindprozess
  in einem "concurrent.futures.ProcessPoolExecutor" abrupt beendet
  wird. Der resultierende Traceback nennt jetzt die PID und den Exit-
  Code des beendeten Prozesses. (Beigetragen von Jonathan Berg in
  gh-139486.)


contextlib
----------

* Unterstützung für beliebige Deskriptoren "__enter__()",
  "__exit__()", "__aenter__()" und "__aexit__()" in "ExitStack" und
  "contextlib.AsyncExitStack" hinzugefügt, für Konsistenz mit den
  Anweisungen "with" und "async with". (Beigetragen von Serhiy
  Storchaka in gh-144386.)

* "ContextDecorator" und "AsyncContextDecorator" (und damit auch
  "contextmanager()" und "asynccontextmanager()", wenn sie als
  Dekoratoren verwendet werden) erkennen jetzt Generatorfunktionen,
  Koroutinenfunktionen und asynchrone Generatorfunktionen und halten
  den Kontextmanager während der Iteration bzw. über await hinweg
  offen. Bisher wurde der Kontextmanager verlassen, sobald das
  Generator- oder Koroutinenobjekt erzeugt wurde. (Beigetragen von
  Alex Grönholm und Gregory P. Smith in gh-125862.)


ctypes
------

* Das "_type_" von "c_float_complex", "c_double_complex" und
  "c_longdouble_complex" wurde für die Kompatibilität mit NumPy von
  "F", "D" und "G" zu "Zf", "Zd" und "Zg" geändert. (Beigetragen von
  Victor Stinner in gh-148675.)


dataclasses
-----------

* Annotationen für generierte Methoden "__init__" enthalten keine
  internen Typnamen mehr. (Beigetragen von David Ellis in gh-137530.)


dbm
---

* Neue Methoden "reorganize()" in "dbm.dumb" und "dbm.sqlite3"
  hinzugefügt, um ungenutzten freien Speicherplatz zurückzugewinnen,
  der zuvor von gelöschten Einträgen belegt war. (Beigetragen von
  Andrea Oliveri in gh-134004.)


difflib
-------

* Optionalen Parameter *color* für "difflib.unified_diff()"
  eingeführt, der eine farbige Ausgabe ähnlich wie bei **git diff**
  ermöglicht. Dies lässt sich über Umgebungsvariablen steuern.
  (Beigetragen von Douglas Thor in gh-133725.)

* Das Styling der von der Klasse "difflib.HtmlDiff" erzeugten HTML-
  Diff-Seiten wurde verbessert und die Ausgabe auf den HTML5-Standard
  umgestellt. (Beigetragen von Jiahao Li in gh-134580.)


email
-----

* E-Mail-Generatoren lösen jetzt einen Fehler aus, wenn eine
  "EmailMessage" wegen einer Nicht-ASCII-E-Mail-Adresse (Mailbox) in
  einem Adress-Header nicht korrekt serialisiert (flattened) werden
  kann. Möglichkeiten zur Unterstützung internationalisierter E-Mail-
  Adressen (Email Address Internationalization, EAI) werden unter
  "EmailPolicy.utf8" beschrieben. (Beigetragen von R David Murray und
  Mike Edmunds in gh-122540.)


faulthandler
------------

* Parameter *max_threads* in "faulthandler.enable()",
  "faulthandler.dump_traceback()",
  "faulthandler.dump_traceback_later()" und "faulthandler.register()"
  hinzugefügt. (Beigetragen von Eric Froemling in gh-149085.)


functools
---------

* "singledispatchmethod()" unterstützt jetzt aufrufbare Objekte, die
  keine *Deskriptoren* sind. (Beigetragen von Serhiy Storchaka in
  gh-140873.)

* "singledispatchmethod()" wählt die Implementierung jetzt anhand des
  zweiten Arguments aus, wenn es eine reguläre Methode umhüllt und als
  Klassenattribut aufgerufen wird. (Beigetragen von Bartosz Sławecki
  in gh-143535.)


gc
--

* Python 3.14.0 bis 3.14.4 wurde mit einem neuen inkrementellen
  Garbage Collector ausgeliefert. Nach einer Reihe von Berichten über
  erheblichen Speicherdruck in Produktionsumgebungen wurde er jedoch
  wieder auf den generationenbasierten GC aus 3.13 zurückgesetzt.
  Dieser GC wird jetzt in Python 3.14.5 und neuer sowie in Python 3.15
  verwendet. (Beigetragen von Sergey Miryanov in gh-148726.)


hashlib
-------

* Hash-Funktionen, die garantiert immer *verfügbar* sind, existieren
  jetzt als Attribute von "hashlib", auch wenn sie zur Laufzeit wegen
  fehlender Backend-Implementierungen nicht funktionieren. Zum
  Beispiel löst "hashlib.md5" keinen "AttributeError" mehr aus, wenn
  OpenSSL nicht verfügbar ist und Python ohne MD5-Unterstützung gebaut
  wurde. (Beigetragen von Bénédikt Tran in gh-136929.)


http.client
-----------

* Den Konstruktoren von "HTTPConnection" und "HTTPSConnection" wurde
  der neue Nur-Schlüsselwort-Parameter *max_response_headers*
  hinzugefügt. Dieser Parameter überschreibt die standardmäßige
  Höchstzahl zulässiger Antwort-Header. (Beigetragen von Alexander
  Enrique Urieles Nieto in gh-131724.)


http.server
-----------

* Das Logging von "BaseHTTPRequestHandler", wie es von der
  Kommandozeilenschnittstelle verwendet wird, ist standardmäßig
  farbig. Dies lässt sich über Umgebungsvariablen steuern.
  (Beigetragen von Hugo van Kemenade in gh-146292.)

* "default_content_type" und die Kommandozeilenoption "--content-type"
  wurden hinzugefügt, um den Standard-Header "Content-Type" für
  Dateien mit unbekannter Endung anpassen zu können. (Beigetragen von
  John Comeau und Hugo van Kemenade in gh-113471.)

* Neues Schlüsselwortargument "extra_response_headers" für
  "SimpleHTTPRequestHandler", um eigene Header in HTTP-Antworten zu
  unterstützen. (Beigetragen von Anton I. Sipos in gh-135057.)

* Neue Option "-H/--header" für die Kommandozeilenschnittstelle
  **python -m http.server**, um eigene Header in HTTP-Antworten zu
  unterstützen. (Beigetragen von Anton I. Sipos in gh-135057.)


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

* Bisher gaben "metadata()" und "Distribution.metadata" beim Zugriff
  auf ein Metadatenverzeichnis einer Distribution ohne Metadatendatei
  ein leeres Objekt vom Typ "PackageMetadata" zurück, als ob die Datei
  vorhanden, aber leer wäre. Jetzt wird eine Ausnahme
  "MetadataNotFound" ausgelöst. Hintergrund und Begründung findest du
  in importlib_metadata#493, die Begründung zu den
  Kompatibilitätsbedenken in gh-143387. (Beigetragen von Jason R.
  Coombs.)


inspect
-------

* Parameter *inherit_class_doc* und *fallback_to_class_doc* für
  "getdoc()" hinzugefügt. (Beigetragen von Serhiy Storchaka in
  gh-132686.)


json
----

* Parameter *array_hook* für die Funktionen "load()" und "loads()"
  hinzugefügt: Er erlaubt einen Callback für JSON-Arrays, um die
  Python-Listen im resultierenden dekodierten Objekt anzupassen. Wird
  "frozendict" an den Parameter *object_pairs_hook* und "tuple" an
  *array_hook* übergeben, entsteht eine tief verschachtelte,
  unveränderliche Python-Struktur, die die JSON-Daten darstellt.
  (Beigetragen von Joao S. O. Bueno in gh-146440.)


locale
------

* "setlocale()" unterstützt jetzt Sprachcodes mit Modifikatoren der
  Form "@". Modifikatoren der Form "@" werden in "getlocale()" nicht
  mehr stillschweigend entfernt, sondern in den Sprachcode
  aufgenommen. (Beigetragen von Serhiy Storchaka in gh-137729.)

* Die Funktion "locale.getdefaultlocale()" ist nicht mehr veraltet.
  (Beigetragen von Victor Stinner in gh-130796.)


math
----

* Funktionen "math.isnormal()" und "math.issubnormal()" hinzugefügt.
  (Beigetragen von Sergey B Kirpichev in gh-132908.)

* Funktionen "math.fmax()", "math.fmin()" und "math.signbit()"
  hinzugefügt. (Beigetragen von Bénédikt Tran in gh-135853.)


mimetypes
---------

* Weitere MIME-Typen hinzugefügt. (Beigetragen von Benedikt Johannes,
  Charlie Lin, Foolbar, Gil Forcada und John Franey in gh-144217,
  gh-145720, gh-140937, gh-139959, gh-145698, gh-145718, gh-145918 und
  gh-144213.)

* "application/x-texinfo" in "application/texinfo" umbenannt.
  (Beigetragen von Charlie Lin in gh-140165.)

* Der MIME-Typ für Dateien mit der Endung ".ai" wurde zu
  "application/pdf" geändert. (Beigetragen von Stan Ulbrych in
  gh-141239.)


mmap
----

* "mmap.mmap" hat unter Windows jetzt einen Parameter *trackfd*. Ist
  er "False", wird das zu *fileno* gehörende Datei-Handle nicht
  dupliziert. (Beigetragen von Serhiy Storchaka in gh-78502.)

* Die Methode "mmap.mmap.set_name()" wurde hinzugefügt, um eine
  anonyme Speicherabbildung zu benennen, sofern der Linux-Kernel
  *PR_SET_VMA_ANON_NAME* unterstützt (Linux 5.17 oder neuer).
  (Beigetragen von Donghee Na in gh-142419.)


os
--

* "os.statx()" für Linux-Kernel ab Version 4.11 mit glibc ab Version
  2.28 hinzugefügt. (Beigetragen von Jeffrey Bosboom und Victor
  Stinner in gh-83714.)

* Die Funktion "os.makedirs()" hat jetzt einen Parameter
  *parent_mode*, mit dem sich der Modus für Zwischenverzeichnisse
  festlegen lässt. Damit lässt sich durch Übergabe von
  "parent_mode=mode" das Verhalten von Python 3.6 und früher
  nachbilden. (Beigetragen von Zackery Spytz und Gregory P. Smith in
  gh-86533.)


os.path
-------

* Unterstützung für den Modus „alle außer der letzten“ in "realpath()"
  hinzugefügt. (Beigetragen von Serhiy Storchaka in gh-71189.)

* Der Parameter *strict* von "os.path.realpath()" akzeptiert einen
  neuen Wert, "os.path.ALLOW_MISSING". Wird er verwendet, werden
  andere Fehler als "FileNotFoundError" erneut ausgelöst. Der
  resultierende Pfad kann fehlen, enthält aber keine symbolischen
  Links. (Beigetragen von Petr Viktorin für **CVE 2025-4517**.)


pathlib
-------

* "pathlib.Path.mkdir()" hat jetzt einen Parameter *parent_mode*, mit
  dem sich bei "parents=True" der Modus für Zwischenverzeichnisse
  festlegen lässt. (Beigetragen von Gregory P. Smith in gh-86533.)


pdb
---

* Die neue interaktive Shell wird jetzt als Standard-Eingabeshell für
  "pdb" verwendet. (Beigetragen von Tian Gao in gh-145379.)


pickle
------

* Unterstützung für das Pickling privater Methoden und verschachtelter
  Klassen hinzugefügt. (Beigetragen von Zackery Spytz und Serhiy
  Storchaka in gh-77188.)


pickletools
-----------

* Die Ausgabe der Kommandozeilenschnittstelle von "pickletools" ist
  standardmäßig farbig. Dies lässt sich über Umgebungsvariablen
  steuern. (Beigetragen von Hugo van Kemenade in gh-149026.)


pprint
------

* Schlüsselwortargument *expand* für "pprint.pprint()",
  "pprint.pformat()" und "pprint.pp()" hinzugefügt. Ist es wahr, wird
  die Ausgabe ähnlich wie bei "json.dumps()" mit angegebenem *indent*
  formatiert. (Beigetragen von Stefan Todoran, Semyon Moroz und Hugo
  van Kemenade in gh-112632.)

* Unterstützung für T-Strings in "pprint" hinzugefügt. (Beigetragen
  von Loïc Simon und Hugo van Kemenade in gh-134551.)


re
--

* "re.prefixmatch()" und das entsprechende "re.Pattern.prefixmatch()"
  wurden als alternative, explizitere Namen für die bestehenden und
  jetzt *sanft abgekündigten* APIs "re.match()" und
  "re.Pattern.match()" hinzugefügt. Sie sollen Verwirrung darüber
  vermeiden, was *match* bedeutet, und folgen damit dem Grundsatz
  *„Explizit ist besser als implizit“* aus dem Zen of Python. Die
  Bibliotheken für reguläre Ausdrücke der meisten anderen Sprachen
  verwenden eine API namens *match* für das, was in Python schon immer
  *search* heißt. (Beigetragen von Gregory P. Smith in gh-86519.)


resource
--------

* Neue Konstanten hinzugefügt: "RLIMIT_NTHR", "RLIMIT_UMTXP",
  "RLIMIT_THREADS", "RLIM_SAVED_CUR" und "RLIM_SAVED_MAX".
  (Beigetragen von Serhiy Storchaka in gh-137512.)


shelve
------

* Neue Methode "reorganize()" in "shelve" hinzugefügt, um ungenutzten
  freien Speicherplatz zurückzugewinnen, der zuvor von gelöschten
  Einträgen belegt war. (Beigetragen von Andrea Oliveri in gh-134004.)

* Unterstützung für eigene Serialisierungs- und
  Deserialisierungsfunktionen im Modul "shelve" hinzugefügt.
  (Beigetragen von Furkan Onder in gh-99631.)


socket
------

* Konstanten für das CAN-Protokoll ISO-TP hinzugefügt. (Beigetragen
  von Patrick Menschel und Stefan Tatschner in gh-86819.)


sqlite3
-------

* Die Kommandozeilenschnittstelle hat mehrere neue Features:

  * Vervollständigung von SQL-Schlüsselwörtern mit "Tab". (Beigetragen
    von Long Tan in gh-133393.)

  * Eingabeaufforderungen, Fehlermeldungen und Hilfetexte sind jetzt
    farbig. Dies ist standardmäßig aktiviert; Details findest du unter
    Farbsteuerung. (Beigetragen von Stan Ulbrych und Łukasz Langa in
    gh-133461.)

  * Vervollständigung von Tabellen, Indizes, Triggern, Views, Spalten,
    Funktionen und Schemas mit "Tab". (Beigetragen von Long Tan in
    gh-136101.)


ssl
---

* Über "ssl.HAS_PSK_TLS13" wird angezeigt, ob das Modul "ssl"
  „External PSKs“ in TLSv1.3 unterstützt, wie in **RFC 9258**
  beschrieben. (Beigetragen von Will Childs-Klein in gh-133624.)

* Neue Methoden zur Verwaltung der Gruppen für die SSL-
  Schlüsselvereinbarung hinzugefügt:

  * "ssl.SSLContext.set_groups()" legt die für die
    Schlüsselvereinbarung zulässigen Gruppen fest und erweitert die
    bisherige Methode "ssl.SSLContext.set_ecdh_curve()". Diese neue
    API ermöglicht es, mehrere Gruppen anzugeben, und unterstützt
    neben ECDH-Kurven auch Finite-Field- und Post-Quanten-Gruppen. Mit
    dieser Methode lässt sich außerdem steuern, welche Key Shares im
    TLS-Handshake gesendet werden.

  * "ssl.SSLSocket.group()" gibt die Gruppe zurück, die nach Abschluss
    des TLS-Handshakes für die Schlüsselvereinbarung auf der aktuellen
    Verbindung ausgewählt wurde. Dieser Aufruf erfordert OpenSSL 3.2
    oder neuer.

  * "ssl.SSLContext.get_groups()" gibt eine Liste aller verfügbaren
    Gruppen für die Schlüsselvereinbarung zurück, die mit der im
    Kontext aktuell eingestellten minimalen und maximalen TLS-Version
    kompatibel sind. Dieser Aufruf erfordert OpenSSL 3.5 oder neuer.

  (Beigetragen von Ron Frederick in gh-136306.)

* Neue Methode "ssl.SSLContext.set_ciphersuites()" zum Festlegen der
  Cipher für TLS 1.3 hinzugefügt. Für TLS 1.2 oder früher sollte
  weiterhin "ssl.SSLContext.set_ciphers()" verwendet werden. Beide
  Aufrufe können auf demselben Kontext erfolgen. Welche Cipher-Suite
  ausgewählt wird, hängt von der TLS-Version ab, die beim
  Verbindungsaufbau ausgehandelt wird. (Beigetragen von Ron Frederick
  in gh-137197.)

* Neue Methoden zur Verwaltung von Signaturalgorithmen hinzugefügt:

  * "ssl.get_sigalgs()" gibt eine Liste aller verfügbaren TLS-
    Signaturalgorithmen zurück. Dieser Aufruf erfordert OpenSSL 3.4
    oder neuer.

  * "ssl.SSLContext.set_client_sigalgs()" legt die Signaturalgorithmen
    fest, die für die zertifikatsbasierte Client-Authentifizierung
    zulässig sind.

  * "ssl.SSLContext.set_server_sigalgs()" legt die Signaturalgorithmen
    fest, die der Server zum Abschluss des TLS-Handshakes verwenden
    darf.

  * "ssl.SSLSocket.client_sigalg()" gibt den Signaturalgorithmus
    zurück, der für die Client-Authentifizierung auf der aktuellen
    Verbindung ausgewählt wurde. Dieser Aufruf erfordert OpenSSL 3.5
    oder neuer.

  * "ssl.SSLSocket.server_sigalg()" gibt den Signaturalgorithmus
    zurück, der für den Server zum Abschluss des TLS-Handshakes auf
    der aktuellen Verbindung ausgewählt wurde. Dieser Aufruf erfordert
    OpenSSL 3.5 oder neuer.

  (Beigetragen von Ron Frederick in gh-138252.)


subprocess
----------

* "subprocess.Popen.wait()": Wenn "timeout" nicht "None" ist und die
  Plattform es unterstützt, wird ein effizienter ereignisgesteuerter
  Mechanismus verwendet, um auf das Prozessende zu warten:

  * Linux >= 5.3 verwendet "os.pidfd_open()" + "select.poll()".

  * macOS und andere BSD-Varianten verwenden "select.kqueue()" +
    "KQ_FILTER_PROC" + "KQ_NOTE_EXIT".

  * Windows verwendet weiterhin "WaitForSingleObject" (unverändert).

  Steht keiner dieser Mechanismen zur Verfügung, greift die Funktion
  auf die herkömmliche Busy-Loop zurück (nicht blockierender Aufruf
  und kurze Pausen). (Beigetragen von Giampaolo Rodola in gh-83069.)


symtable
--------

* Methoden "symtable.Function.get_cells()" und
  "symtable.Symbol.is_cell()" hinzugefügt. (Beigetragen von Yashp002
  in gh-143504.)


sys
---

* Namensraum "sys.abi_info" hinzugefügt, um den Zugriff auf ABI-
  Informationen zu verbessern. (Beigetragen von Klaus Zimmermann in
  gh-137476.)


sys.monitoring
--------------

* Die anderen Ereignisse ("PY_THROW", "PY_UNWIND", "RAISE",
  "EXCEPTION_HANDLED" und "RERAISE") können jetzt pro Codeobjekt
  aktiviert und deaktiviert werden. Gibt ein Callback für eines dieser
  Ereignisse "DISABLE" zurück, wird das Ereignis für das gesamte
  Codeobjekt (für das aktuelle Werkzeug) deaktiviert, statt wie in
  früheren Versionen einen "ValueError" auszulösen. (Beigetragen von
  Gabriele N. Tornetta in gh-146182.)


tarfile
-------

* "data_filter()" normalisiert jetzt die Ziele symbolischer Links, um
  Path-Traversal-Angriffe zu verhindern. (Beigetragen von Petr
  Viktorin in gh-127987 und **CVE 2025-4138**.)

* "extractall()" überspringt jetzt das Korrigieren von
  Verzeichnisattributen, wenn ein Verzeichnis entfernt oder durch eine
  andere Dateiart ersetzt wurde. (Beigetragen von Petr Viktorin in
  gh-127987 und **CVE 2024-12718**.)

* "extract()" und "extractall()" wenden den Extraktionsfilter jetzt
  (erneut) an, wenn ein Link (hart oder symbolisch) durch eine Kopie
  eines anderen Archivelements ersetzt wird und wenn
  Verzeichnisattribute korrigiert werden. Im ersten Fall wird die neue
  Ausnahme "LinkFallbackError" ausgelöst. (Beigetragen von Petr
  Viktorin für **CVE 2025-4330** und **CVE 2024-12718**.)

* "extract()" und "extractall()" extrahieren abgelehnte Elemente nicht
  mehr, wenn "errorlevel()" null ist. (Beigetragen von Matt Prodani
  und Petr Viktorin in gh-112887 und **CVE 2025-4435**.)

* "extract()" und "extractall()" ersetzen unter Windows jetzt
  Schrägstriche durch Backslashes in den Zielen symbolischer Links, um
  das Erzeugen beschädigter Links zu verhindern. (Beigetragen von
  Christoph Walcher in gh-57911.)

* "gettarinfo()" ersetzt unter Windows jetzt Backslashes durch
  Schrägstriche in den Zielen symbolischer Links, um dem Standard des
  tar-Formats zu entsprechen. (Beigetragen von Daniele Nicolodi in
  gh-151669.)


threading
---------

* "serialize_iterator", "synchronized_iterator()" und
  "concurrent_tee()" wurden hinzugefügt, um den nebenläufigen Zugriff
  auf Generatoren und Iteratoren zu unterstützen. (Beigetragen von
  Raymond Hettinger in gh-124397.)


timeit
------

* Die Ausgabe der Kommandozeilenschnittstelle von "timeit" ist
  standardmäßig farbig. Dies lässt sich über Umgebungsvariablen
  steuern. (Beigetragen von Hugo van Kemenade in gh-146609.)

* Die Kommandozeilenschnittstelle färbt Tracebacks von Fehlern jetzt
  standardmäßig ein. Dies lässt sich über Umgebungsvariablen steuern.
  (Beigetragen von Yi Hong in gh-139374.)

* Die Zielzeit von "timeit.Timer.autorange()" ist jetzt
  konfigurierbar, und die Kommandozeilenschnittstelle hat eine neue
  Option "--target-time". (Beigetragen von Alessandro Cucci und Miikka
  Koskinen in gh-80642.)


tkinter
-------

* Die Methode "tkinter.Text.search()" unterstützt jetzt zwei
  zusätzliche Argumente: *nolinestop*, mit dem die Suche über
  Zeilengrenzen hinweg fortgesetzt werden kann, und *strictlimits*,
  das die Suche auf den angegebenen Bereich beschränkt. (Beigetragen
  von Rihaan Meher in gh-130848.)

* Die neue Methode "tkinter.Text.search_all()" wurde eingeführt. Mit
  ihr lassen sich über die Tcl-Optionen "-all" und "-overlap" alle
  Treffer eines Musters suchen. (Beigetragen von Rihaan Meher in
  gh-130848.)

* Neue Methoden "pack_content()", "place_content()" und
  "grid_content()" hinzugefügt, die Tk-Befehle mit den neuen Namen
  (eingeführt in Tk 8.6) verwenden, statt der Methoden "*_slaves()",
  die Tk-Befehle mit veralteten Namen verwenden. (Beigetragen von
  Serhiy Storchaka in gh-143754.)

* Attribute von "Event" hinzugefügt: "user_data" für virtuelle Tk-
  Ereignisse und "detail" für die Ereignisse "Enter", "Leave",
  "FocusIn", "FocusOut" und "ConfigureRequest". (Beigetragen von
  Matthias Kievernagel und Serhiy Storchaka in gh-47655.)


tokenize
--------

* Die Ausgabe von "tokenize" auf der Kommandozeilenschnittstelle ist
  standardmäßig farbig. Dies lässt sich über Umgebungsvariablen
  steuern. (Beigetragen von Hugo van Kemenade in gh-148991.)


tomllib
-------

* Das Modul "tomllib" unterstützt jetzt TOML 1.1.0. Dies ist eine
  abwärtskompatible Aktualisierung, das heißt, alle gültigen
  TOML-1.0.0-Dokumente werden auf dieselbe Weise geparst.

  Laut dem official TOML changelog gibt es folgende Änderungen:

  * Zeilenumbrüche und nachgestellte Kommas in Inline-Tabellen sind
    erlaubt.

    Bisher musste eine Inline-Tabelle in einer einzigen Zeile stehen
    und durfte nicht mit einem nachgestellten Komma enden. Diese
    Einschränkung wurde gelockert, sodass Folgendes gültig ist:

       tbl = {
          key      = "a string",
          moar-tbl =  {
             key = 1,
          },
       }

  * Die Notation "\xHH" für einfache Zeichenketten für Codepoints
    unter 255 und das Escape "\e" für das Escape-Zeichen wurden
    hinzugefügt:

       null = "null byte: \x00; letter a: \x61"
       csi = "\e["

  * Sekunden in Datums-/Zeit- und Zeitwerten sind jetzt optional.
    Folgendes ist jetzt gültig:

       dt = 2010-02-03 14:15
       t  = 14:15

  (Beigetragen von Taneli Hukkinen in gh-142956.)


types
-----

* Der durchschreibende Proxy-Typ von "locals()" wird als
  "types.FrameLocalsProxyType" bereitgestellt. Er stellt den Typ des
  Attributs "frame.f_locals" dar, wie in **PEP 667** beschrieben.
  (Beigetragen von Peter Bierma in gh-136492.)


typing
------

* **PEP 747**: "TypeForm" hinzugefügt, eine neue spezielle Form zum
  Annotieren von Werten, die selbst Typausdrücke sind. "TypeForm[T]"
  bedeutet „ein Typform-Objekt, das "T" beschreibt (oder einen Typ,
  der "T" zugewiesen werden kann)“. Zur Laufzeit gibt "TypeForm(x)"
  einfach "x" zurück, was eine explizite Annotation von Typform-Werten
  ermöglicht, ohne das Verhalten zu ändern.

  Das hilft Bibliotheken, die vom Benutzer übergebene Typausdrücke
  akzeptieren (zum Beispiel "int", "str | None", Klassen vom Typ
  "TypedDict" oder "list[int]"), präzise Signaturen bereitzustellen:

     from typing import Any, TypeForm

     def cast[T](typ: TypeForm[T], value: Any) -> T: ...

  (Beigetragen von Jelle Zijlstra in gh-145033.)

* **PEP 728**: Unterstützung für die Klassenargumente *closed* und
  *extra_items* in "TypedDict" hinzugefügt. Ein geschlossenes
  "TypedDict" erlaubt keine zusätzlichen Schlüssel über die im
  Klassenrumpf angegebenen hinaus, während ein "TypedDict" mit
  "extra_items" beliebige zusätzliche Einträge erlaubt, deren Werte
  vom angegebenen Typ sind. (Beigetragen von Angela Liss in
  gh-137840.)

* Code wie "class ExtraTypeVars(P1[S], Protocol[T, T2]): ..." löst
  jetzt einen "TypeError" aus, weil "S" nicht in den Parametern von
  "Protocol" aufgeführt ist. (Beigetragen von Nikita Sobolev in
  gh-137191.)

* Code wie "class B2(A[T2], Protocol[T1, T2]): ..." behandelt die
  Reihenfolge der Typparameter jetzt korrekt: Sie lautet "(T1, T2)"
  und nicht "(T2, T1)", wie sie zuvor zur Laufzeit fälschlicherweise
  abgeleitet wurde. (Beigetragen von Nikita Sobolev in gh-137191.)

* **PEP 800**: "@typing.disjoint_base" hinzugefügt, ein neuer
  Dekorator, der eine Klasse als disjunkte Basis kennzeichnet. Dies
  ist ein fortgeschrittenes Feature, das vor allem Typprüfern
  ermöglichen soll, die Laufzeitsemantik von Typen, die als
  integrierte Typen oder in kompilierten Erweiterungen definiert sind,
  genau abzubilden. Ist eine Klasse "C" eine disjunkte Basis, können
  Unterklassen dieser Klasse nicht von anderen disjunkten Basen erben,
  die weder Eltern- noch Kindklassen von "C" sind. (Beigetragen von
  Jelle Zijlstra in gh-148639.)

* "TypeVarTuple" akzeptiert jetzt die Schlüsselwortargumente "bound",
  "covariant", "contravariant" und "infer_variance", passend zur
  Schnittstelle von "TypeVar" und "ParamSpec". Die Semantik von
  "bound" bleibt in der Spezifikation undefiniert.


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

* Die Unicode-Datenbank wurde auf Unicode 17.0.0 aktualisiert.
  (Beigetragen von Benjamin Peterson in gh-138706.)

* Funktionen "unicodedata.isxidstart()" und
  "unicodedata.isxidcontinue()" hinzugefügt, die prüfen, ob ein
  Zeichen einen Bezeichner nach Unicode Standard Annex #31 beginnen
  oder fortsetzen kann. (Beigetragen von Stan Ulbrych in gh-129117.)

* Funktion "iter_graphemes()" hinzugefügt, die über Graphem-Cluster
  nach den Regeln aus Unicode Standard Annex #29, "Unicode Text
  Segmentation" iteriert. Funktionen "grapheme_cluster_break()",
  "indic_conjunct_break()" und "extended_pictographic()" hinzugefügt,
  um die mit diesem Algorithmus zusammenhängenden Eigenschaften eines
  Zeichens abzufragen. (Beigetragen von Serhiy Storchaka und Guillaume
  Sanchez in gh-74902.)

* Funktion "block()" hinzugefügt, die den einem Zeichen zugewiesenen
  Unicode-Block zurückgibt. (Beigetragen von Stan Ulbrych in
  gh-66802.)


unittest
--------

* "unittest.TestCase.assertLogs()" akzeptiert jetzt einen Formatter,
  mit dem sich die Formatierung der Meldungen steuern lässt.
  (Beigetragen von Garry Cairns in gh-134567.)

* "unittest.TestCase.assertWarns()" und
  "unittest.TestCase.assertWarnsRegex()" verschlucken keine Warnungen
  mehr, die nicht zur angegebenen Kategorie oder zum angegebenen
  regulären Ausdruck passen. Verschachtelte Kontextmanager werden
  jetzt unterstützt. (Beigetragen von Serhiy Storchaka in gh-143231.)


urllib.parse
------------

* Parameter *missing_as_none* für die Funktionen "urlsplit()",
  "urlparse()" und "urldefrag()" hinzugefügt. Parameter *keep_empty*
  für die Funktionen "urlunsplit()" und "urlunparse()" hinzugefügt.
  Damit lässt sich zwischen leeren und nicht definierten URI-
  Komponenten unterscheiden, und leere Komponenten bleiben erhalten.
  (Beigetragen von Serhiy Storchaka in gh-67041.)


venv
----

* Auf POSIX-Plattformen werden beim Erstellen virtueller Umgebungen
  bei Bedarf platlib-Verzeichnisse angelegt, statt einen symbolischen
  Link "lib64 -> lib" zu verwenden. Das bedeutet, dass sich purelib
  und platlib virtueller Umgebungen auf Plattformen, auf denen
  "sys.platlibdir" nicht gleich "lib" ist, nicht mehr dasselbe
  Verzeichnis "lib" teilen. (Beigetragen von Rui Xi in gh-133951.)


warnings
--------

* Das Filtern nach Modul in "warnings.warn_explicit()" wurde
  verbessert, wenn kein Argument *module* übergeben wird. Der reguläre
  Ausdruck für das Modul im Warnungsfilter wird jetzt nicht nur mit
  dem Dateinamen ohne ".py" abgeglichen, sondern auch mit Modulnamen,
  die ausgehend von verschiedenen übergeordneten Verzeichnissen des
  Dateinamens gebildet werden (ohne "/__init__.py", ".py" und unter
  Windows ".pyw"). (Beigetragen von Serhiy Storchaka in gh-135801.)


wave
----

* Unterstützung für WAVE-Audio im IEEE-Gleitkommaformat
  ("WAVE_FORMAT_IEEE_FLOAT") in "wave" hinzugefügt.

* "wave.Wave_read.getformat()", "wave.Wave_write.getformat()" und
  "wave.Wave_write.setformat()" für die explizite Behandlung des
  Frame-Formats hinzugefügt.

* "wave.Wave_write.setparams()" akzeptiert sowohl 7-elementige Tupel
  einschließlich "format" als auch aus Gründen der
  Abwärtskompatibilität 6-elementige Tupel (mit "WAVE_FORMAT_PCM" als
  Standard).

* Die Ausgabe mit "WAVE_FORMAT_IEEE_FLOAT" enthält jetzt einen Chunk
  "fact", wie er für WAVE-Formate außer PCM erforderlich ist.

(Beigetragen von Lionel Koenig und Michiel W. Beijen in gh-60729.)


webbrowser
----------

* Unter macOS öffnet die neue Klasse "webbrowser.MacOS" URLs über
  **/usr/bin/open**, statt AppleScript zu erzeugen und über
  **osascript** auszuführen. Der Standardbrowser wird mit "plistlib"
  aus der Einstellungsdatei von LaunchServices ermittelt, mit
  "com.apple.Safari" als Rückfall bei Neuinstallationen. Für URLs, die
  nicht HTTP(S) verwenden, wird **open -b <bundle-id>** verwendet, um
  die URL über einen Browser statt über den Datei-Handler des
  Betriebssystems zu leiten. Das verhindert Angriffe durch
  Einschleusen von Dateien. (Beigetragen von Jeff Lyon in gh-137586.)


xml
---

* Funktion "xml.is_valid_name()" hinzugefügt, die prüft, ob eine
  Zeichenkette als Element- oder Attributname in XML verwendet werden
  kann. (Beigetragen von Serhiy Storchaka in gh-139489.)

* Funktion "xml.is_valid_text()" hinzugefügt, die prüft, ob eine
  Zeichenkette in einem XML-Dokument verwendet werden kann.
  (Beigetragen von Serhiy Storchaka in gh-139489.)


xml.parsers.expat
-----------------

* "SetAllocTrackerActivationThreshold()" und
  "SetAllocTrackerMaximumAmplification()" wurden den Objekten vom Typ
  xmlparser hinzugefügt, um den Schutz vor unverhältnismäßig hohem
  dynamischem Speicherverbrauch innerhalb eines Expat-Parsers
  einzustellen. (Beigetragen von Bénédikt Tran in gh-90949.)

* "SetBillionLaughsAttackProtectionActivationThreshold()" und
  "SetBillionLaughsAttackProtectionMaximumAmplification()" wurden den
  Objekten vom Typ xmlparser hinzugefügt, um den Schutz vor Angriffen
  vom Typ billion laughs einzustellen. (Beigetragen von Bénédikt Tran
  in gh-90949.)


zlib
----

* Zwei Adler-32-Prüfsummen lassen sich jetzt mit "adler32_combine()"
  kombinieren. (Beigetragen von Callum Attryde und Bénédikt Tran in
  gh-134635.)

* Zwei CRC-32-Prüfsummen lassen sich jetzt mit "crc32_combine()"
  kombinieren. (Beigetragen von Bénédikt Tran in gh-134635.)


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

* "mimalloc" wird jetzt als Standard-Allocator für rohe
  Speicheranforderungen verwendet, etwa über "PyMem_RawMalloc()", um
  die Performance in *Builds mit freien Threads* zu verbessern.
  (Beigetragen von Kumar Aditya in gh-144914.)


base64 & binascii
-----------------

* Die zugrunde liegende base64-Implementierung von CPython kodiert
  jetzt dank einfacher Optimierungen für das CPU-Pipelining doppelt so
  schnell und dekodiert dreimal so schnell. (Beigetragen von Gregory
  P. Smith und Serhiy Storchaka in gh-143262.)

* Die Implementierung der Kodierungen Ascii85, Base85 und Z85 wurde in
  C neu geschrieben. Kodieren und Dekodieren sind jetzt um zwei
  Größenordnungen schneller und verbrauchen zwei Größenordnungen
  weniger Speicher. (Beigetragen von James Seo und Serhiy Storchaka in
  gh-101178.)

* Die Implementierung von Base32 wurde in C neu geschrieben. Kodieren
  und Dekodieren sind jetzt um zwei Größenordnungen schneller.
  (Beigetragen von James Seo in gh-146192.)


csv
---

* Die Erkennung des Trennzeichens in "csv.Sniffer.sniff()" ist jetzt
  bis zu 1,6-mal schneller. (Beigetragen von Maurycy Pawłowski-
  Wieroński in gh-137628.)


Verbesserter experimenteller JIT-Compiler
-----------------------------------------

Ergebnisse der Benchmark-Sammlung pyperformance weisen für den JIT im
geometrischen Mittel eine Leistungsverbesserung von 7-8 % gegenüber
dem Standard-CPython-Interpreter aus, der auf x86-64-Linux mit allen
Optimierungen gebaut wurde. Auf AArch64-macOS ist der JIT 11-12 %
schneller als der Tail-Call-Interpreter mit allen aktivierten
Optimierungen. Die Beschleunigung von Builds mit JIT gegenüber Builds
ohne JIT reicht auf x86-64-Linux- und AArch64-macOS-Systemen von etwa
15 % Verlangsamung bis zu über 100 % Beschleunigung (vom Mikro-
Benchmark "unpack_sequence" abgesehen).

Die wichtigsten Verbesserungen am JIT sind:

* LLVM 21 als Abhängigkeit zur Build-Zeit

* Neues Tracing-Frontend

* Einfache Registerzuteilung im JIT

* Weitere JIT-Optimierungen

* Unterstützung für Unwinding mit GDB und GNU "backtrace()"

* Bessere Generierung von Maschinencode

-[ LLVM 21 als Abhängigkeit zur Build-Zeit ]-

Der JIT-Compiler verwendet jetzt LLVM 21 zur Generierung der Stencils
zur Build-Zeit. Wie bisher wird LLVM nur benötigt, wenn CPython mit
aktiviertem JIT gebaut wird; Endbenutzer, die Python ausführen, müssen
LLVM nicht installiert haben. Anleitungen zur Installation von LLVM
für alle unterstützten Plattformen findest du in der Dokumentation des
JIT-Compilers. (Beigetragen von Savannah Ostrowski in gh-140973.)

-[ Ein neues Tracing-Frontend ]-

Der JIT-Compiler unterstützt jetzt deutlich mehr Bytecode-Operationen
und Kontrollfluss als in Python 3.14 und ermöglicht so
Beschleunigungen bei einer größeren Vielfalt von Code. Zum Beispiel
versteht der JIT-Compiler von 3.15 jetzt das einfache Erzeugen von
Python-Objekten. Überladene Operationen und Generatoren werden
ebenfalls teilweise unterstützt. Möglich wurde dies durch ein
überarbeitetes Tracing-Frontend des JIT, das die tatsächlichen
Ausführungspfade durch den Code aufzeichnet, statt sie wie die
bisherige Implementierung zu schätzen. (Beigetragen von Ken Jin in
gh-139109. Unterstützung für Windows hinzugefügt von Mark Shannon in
gh-141703.)

-[ Einfache Registerzuteilung im JIT ]-

Dem Optimierer des JIT-Compilers wurde eine einfache Form der
Registerzuteilung hinzugefügt. Dadurch kann der JIT-Compiler bestimmte
Stack-Operationen ganz vermeiden und stattdessen mit Registern
arbeiten. So kann der JIT effizientere Traces erzeugen, weil Lese- und
Schreibzugriffe auf den Speicher entfallen. (Beigetragen von Mark
Shannon in gh-135379.)

-[ Weitere JIT-Optimierungen ]-

Es wird jetzt mehr Konstantenpropagation durchgeführt. Das heißt: Wenn
der JIT-Compiler erkennt, dass bestimmter Benutzercode Konstanten
ergibt, kann der JIT diesen Code vereinfachen. (Beigetragen von Ken
Jin und Savannah Ostrowski in gh-132732.)

*Referenzanzahlen* werden vermieden, wann immer das gefahrlos möglich
ist. Das senkt im Allgemeinen die Kosten der meisten Operationen in
Python. (Beigetragen von Ken Jin, Donghee Na, Zheao Li, Hai Zhu,
Savannah Ostrowski, Reiden Ong, Noam Cohen, Tomas Roun, PuQing,
Cajetan Rodrigues und Sacul in gh-134584.)

Durch das Verfolgen eindeutiger Referenzen auf Objekte kann der JIT-
Optimierer jetzt Aktualisierungen der Referenzanzahl einsparen und In-
place-Operationen auf Ganzzahlen und Gleitkommazahlen durchführen.
(Beigetragen von Reiden Ong und Pieter Eendebak in gh-143414 und
gh-146306.)

Der JIT-Optimierer unterstützt jetzt deutlich mehr Operationen als in
3.14. (Beigetragen von Kumar Aditya, Ken Jin, Jiahao Li und Sacul in
gh-131798.)

-[ Unterstützung für Unwinding mit GDB und GNU "backtrace()" ]-

Der JIT-Compiler veröffentlicht jetzt auf unterstützten Linux-ELF-
Plattformen Unwind-Informationen für generierten Maschinencode über
die GDB-Schnittstelle. Wenn die Frame-Registrierung von libgcc
verfügbar ist, werden dieselben Unwind-Informationen auch für Stack-
Walker von GNU "backtrace()" registriert. Dadurch können native
Debugger, Crash-Handler und Diagnosewerkzeuge, die diese Mechanismen
nutzen, durch JIT-Frames hindurch abwickeln, statt am generierten Code
anzuhalten. (Beigetragen von Diego Russo und Pablo Galindo Salgado in
gh-146071 und gh-149104.)

-[ Bessere Generierung von Maschinencode ]-

Der Maschinencode-Generator des JIT-Compilers erzeugt jetzt besseren
Maschinencode für x86-64 und AArch64 unter macOS und Linux. Im
Allgemeinen sollten Benutzer im Vergleich zu 3.14 einen geringeren
Speicherverbrauch für generierten Maschinencode und effizienteren
Maschinencode feststellen. (Beigetragen von Brandt Bucher in gh-136528
und gh-135905. Implementierung für AArch64 beigetragen von Mark
Shannon in gh-139855. Zusätzliche Optimierungen für AArch64
beigetragen von Mark Shannon und Diego Russo in gh-140683 und
gh-142305.)

-[ Wartbarkeit ]-

Die Operationen des JIT-Optimierers wurden vereinfacht. Möglich wurde
dies durch ein Refactoring der Datenstrukturen des JIT. (Beigetragen
von Zhongtian Zheng in gh-148211 und Hai Zhu in gh-143421.)


Entfernt
========


ast
---

* Die Konstruktoren von AST-Knoten lösen jetzt einen "TypeError" aus,
  wenn ein erforderliches Argument fehlt oder ein
  Schlüsselwortargument übergeben wird, das keinem Feld des AST-
  Knotens entspricht. In diesen Fällen wurde seit Python 3.13 eine
  "DeprecationWarning" ausgelöst. (Beigetragen von Brian Schubert und
  Jelle Zijlstra in gh-137600 und gh-105858.)


collections.abc
---------------

* "collections.abc.ByteString" wurde aus "collections.abc.__all__"
  entfernt. "collections.abc.ByteString" ist seit Python 3.12 veraltet
  und soll in Python 3.17 entfernt werden. (Beigetragen von Alex
  Waygood in gh-118803.)


ctypes
------

* Die undokumentierte Funktion "ctypes.SetPointerType()", die seit
  Python 3.13 veraltet war, wurde entfernt. (Beigetragen von Bénédikt
  Tran in gh-133866.)


datetime
--------

* "strptime()" löst jetzt einen "ValueError" aus, wenn die
  Formatzeichenkette "%d" (Tag des Monats) ohne Angabe eines Jahres
  enthält. Dies war seit Python 3.13 veraltet. (Beigetragen von Stan
  Ulbrych und Gregory P. Smith in gh-70647.)


glob
----

* Die undokumentierten Funktionen "glob.glob0()" und "glob.glob1()",
  die seit Python 3.13 veraltet waren, wurden entfernt. Verwende
  stattdessen "glob.glob()" und übergib ein Verzeichnis an dessen
  Argument *root_dir*. (Beigetragen von Barney Gale in gh-137466.)


http.server
-----------

* Die Klasse "CGIHTTPRequestHandler" und die Option "--cgi" der
  Kommandozeilenschnittstelle **python -m http.server** wurden
  entfernt. Sie waren seit Python 3.13 veraltet. (Beigetragen von
  Bénédikt Tran in gh-133810.)


importlib
---------

* Die Methoden "load_module()" von "Loader" und seinen Unterklassen
  wurden entfernt. Das Importsystem ruft sie nicht mehr auf, wenn sie
  in eigenen Unterklassen definiert sind. Die Methode war seit Python
  3.4 zugunsten von "exec_module()" veraltet. (Beigetragen von Brett
  Cannon in gh-97850.)


importlib.resources
-------------------

* Den veralteten Parameter "package" der Funktion
  "importlib.resources.files()" entfernt. (Beigetragen von Semyon
  Moroz in gh-138044.)


pathlib
-------

* Das veraltete "pathlib.PurePath.is_reserved()" entfernt. Verwende
  "os.path.isreserved()", um reservierte Pfade unter Windows zu
  erkennen. (Beigetragen von Nikita Sobolev in gh-133875.)


platform
--------

* Die Funktion "platform.java_ver()", die seit Python 3.13 veraltet
  war, wurde entfernt. (Beigetragen von Alexey Makridenko in
  gh-133604.)


sre_*
-----

* Die Module "sre_compile", "sre_constants" und "sre_parse" wurden
  entfernt. (Beigetragen von Stan Ulbrych in gh-135994.)


sysconfig
---------

* Den Parameter *check_home* von "sysconfig.is_python_build()"
  entfernt. (Beigetragen von Filipe Laíns in gh-92897.)


threading
---------

* Die Unterstützung beliebiger Positions- oder Schlüsselwortargumente
  in der C-Implementierung von Objekten vom Typ "RLock" wurde
  entfernt. Dies war seit Python 3.14 veraltet. (Beigetragen von
  Bénédikt Tran in gh-134087.)


types
-----

* "codeobject.co_lnotab" wurde aus "types.CodeType" entfernt. Es war
  seit Python 3.12 durch **PEP 626** veraltet. (Beigetragen von Nikita
  Sobolev in gh-134690.)


typing
------

* "typing.ByteString" wurde aus "typing.__all__" entfernt.
  "typing.ByteString" ist seit Python 3.9 veraltet und soll in Python
  3.17 entfernt werden. (Beigetragen von Alex Waygood in gh-118803.)

* Die undokumentierte Syntax mit Schlüsselwortargumenten zum Erzeugen
  von Klassen vom Typ "NamedTuple" (zum Beispiel "Point =
  NamedTuple("Point", x=int, y=int)") wird nicht mehr unterstützt.
  Verwende stattdessen die klassenbasierte oder die funktionale
  Syntax. (Beigetragen von Bénédikt Tran in gh-133817.)

* Die Verwendung von "TD = TypedDict("TD")" oder "TD = TypedDict("TD",
  None)" zum Erzeugen eines Typs "TypedDict" ohne Felder wird nicht
  mehr unterstützt. Verwende stattdessen "class TD(TypedDict): pass"
  oder "TD = TypedDict("TD", {})". (Beigetragen von Bénédikt Tran in
  gh-133823.)

* Der veraltete Dekorator "@typing.no_type_check_decorator" wurde
  entfernt. (Beigetragen von Nikita Sobolev in gh-133601.)


wave
----

* Die Methoden "getmark()", "setmark()" und "getmarkers()" der Klassen
  "Wave_read" und "Wave_write", die seit Python 3.13 veraltet waren,
  wurden entfernt. (Beigetragen von Bénédikt Tran in gh-133873.)


zipimport
---------

* Das veraltete "zipimport.zipimporter.load_module()" entfernt.
  Verwende stattdessen "zipimport.zipimporter.exec_module()".
  (Beigetragen von Jiahao Li in gh-133656.)


Als veraltet markiert
=====================


Neu als veraltet markiert
-------------------------

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

    (Beigetragen von Brian Schubert in gh-116021.)

* "base64":

  * Das Akzeptieren der Zeichen "+" und "/" bei einem alternativen
    Alphabet in "b64decode()" und "urlsafe_b64decode()" ist jetzt
    veraltet. In künftigen Python-Versionen sind sie im strikten Modus
    Fehler und werden im nicht strikten Modus verworfen. (Beigetragen
    von Serhiy Storchaka in gh-125346.)

* Kommandozeile:

  * Die Kommandozeilenoptionen "-b" und "-bb" sind veraltet und sollen
    in Python 3.17 wirkungslos werden. Sie dienten vor allem als
    Hilfen für den Übergang von Python 2 zu 3. Ab Python 3.17 wird in
    diesen Fällen keine "BytesWarning" mehr ausgelöst. Verwende
    stattdessen einen Typprüfer.

    (Beigetragen von Nikita Sobolev in gh-136355.)

* "collections.abc":

  * Die folgenden Anweisungen lösen jetzt zur Laufzeit
    "DeprecationWarning" aus:

    * "from collections.abc import ByteString"

    * "import collections.abc; collections.abc.ByteString".

    "DeprecationWarning" wurde bereits ausgelöst, wenn von
    "collections.abc.ByteString" abgeleitet wurde oder es als zweites
    Argument an "isinstance()" oder "issubclass()" übergeben wurde.
    Bisher wurden aber keine Warnungen ausgegeben, wenn es lediglich
    importiert oder aus dem Modul "collections.abc" abgerufen wurde.
    (Beigetragen von Alex Waygood in gh-118803.)

* "hashlib":

  * Bei Konstruktoren von Hash-Funktionen wie "new()" oder den direkt
    nach dem Hash benannten Konstruktoren wie "md5()" und "sha256()"
    konnte der optionale Parameter für die Anfangsdaten in
    verschiedenen Implementierungen von "hashlib" auch als
    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. Übergib die
    Anfangsdaten für die größtmögliche Abwärtskompatibilität am besten
    als Positionsargument.

    (Beigetragen von Bénédikt Tran in gh-134978.)

* "http.cookies":

  * "Morsel.js_output" und "BaseCookie.js_output" sind veraltet und
    werden in Python 3.19 entfernt. Verwende stattdessen
    "Morsel.output" oder "BaseCookie.output". (Beigetragen von
    kishorhange111 in gh-148849.)

* "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*
    explizit. (Beigetragen von Bénédikt Tran in gh-142307.)

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

* "re":

  * "re.match()" und "re.Pattern.match()" sind jetzt *sanft
    abgekündigt*, zugunsten der neuen APIs "re.prefixmatch()" und
    "re.Pattern.prefixmatch()", die als alternative, explizitere Namen
    hinzugefügt wurden. Sie sollen Verwirrung darüber vermeiden, was
    *match* bedeutet, und folgen damit dem Grundsatz *„Explizit ist
    besser als implizit“* aus dem Zen of Python. Die Bibliotheken für
    reguläre Ausdrücke der meisten anderen Sprachen verwenden eine API
    namens *match* für das, was in Python schon immer *search* heißt.

    Wir planen **nicht**, den älteren Namen "match()" zu entfernen, da
    er seit über 30 Jahren in Code verwendet wird. Code, der ältere
    Python-Versionen unterstützt, sollte weiterhin "match()"
    verwenden, während neuer Code "prefixmatch()" bevorzugen sollte.
    Siehe prefixmatch() vs. match().

    (Beigetragen von Gregory P. Smith in gh-86519 und Hugo van
    Kemenade in gh-148100.)

* "struct":

  * Der Aufruf von "Struct.__new__()" ohne ein erforderliches Argument
    ist jetzt veraltet und wird in Python 3.20 entfernt. Der Aufruf
    der Methode "__init__()" auf einem bereits initialisierten Objekt
    "Struct" ist veraltet und wird in Python 3.20 entfernt.

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

  * Die Typcodes "'F'" und "'D'" sind jetzt *sanft abgekündigt*
    zugunsten der zweibuchstabigen Formen "'Zf'" und "'Zd'".
    (Beigetragen von Sergey B Kirpichev in gh-121249.)

* "typing":

  * Die folgenden Anweisungen lösen jetzt zur Laufzeit
    "DeprecationWarning" aus:

    * "from typing import ByteString"

    * "import typing; typing.ByteString".

    "DeprecationWarning" wurde bereits ausgelöst, wenn von
    "typing.ByteString" abgeleitet wurde oder es als zweites Argument
    an "isinstance()" oder "issubclass()" übergeben wurde. Bisher
    wurden aber keine Warnungen ausgegeben, wenn es lediglich
    importiert oder aus dem Modul "typing" abgerufen wurde.
    (Beigetragen von Alex Waygood in gh-118803.)

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

* "webbrowser":

  * "webbrowser.MacOSXOSAScript" ist zugunsten von "webbrowser.MacOS"
    veraltet und soll in Python 3.17 entfernt werden. (Beigetragen von
    Jeff Lyon in gh-137586.)

* "__version__":

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


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


Sanfte Abkündigungen
--------------------

Es ist nicht geplant, *sanft abgekündigte* APIs zu entfernen.

* "re.match()" und "re.Pattern.match()" sind jetzt *sanft
  abgekündigt*, zugunsten der neuen APIs "re.prefixmatch()" und
  "re.Pattern.prefixmatch()", die als alternative, explizitere Namen
  hinzugefügt wurden. Sie sollen Verwirrung darüber vermeiden, was
  *match* bedeutet, und folgen damit dem Grundsatz *„Explizit ist
  besser als implizit“* aus dem Zen of Python. Die Bibliotheken für
  reguläre Ausdrücke der meisten anderen Sprachen verwenden eine API
  namens *match* für das, was in Python schon immer *search* heißt.

  Wir planen **nicht**, den älteren Namen "match()" zu entfernen, da
  er seit über 30 Jahren in Code verwendet wird. Code, der ältere
  Python-Versionen unterstützt, sollte weiterhin "match()" verwenden,
  während neuer Code "prefixmatch()" bevorzugen sollte. Siehe
  prefixmatch() vs. match().

  (Beigetragen von Gregory P. Smith in gh-86519 und Hugo van Kemenade
  in gh-148100.)

* Die Verwendung der Formattypcodes "'F'" und "'D'" des Moduls
  "struct" ist jetzt *sanft abgekündigt* zugunsten der
  zweibuchstabigen Formen "'Zf'" und "'Zd'". (Beigetragen von Sergey B
  Kirpichev in gh-121249.)


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


Neue Features
-------------

* Funktionen "PyArg_ParseArray()" und "PyArg_ParseArrayAndKeywords()"
  hinzugefügt, um Argumente von Funktionen mit der Aufrufkonvention
  "METH_FASTCALL" zu parsen. (Beigetragen von Victor Stinner in
  gh-144175.)

* Die folgenden Funktionen für den neuen Typ "frozendict" hinzugefügt:

  * "PyAnyDict_Check()"

  * "PyAnyDict_CheckExact()"

  * "PyFrozenDict_Check()"

  * "PyFrozenDict_CheckExact()"

  * "PyFrozenDict_New()"

  (Beigetragen von Victor Stinner in gh-141510.)

* Funktion "PyObject_CallFinalizerFromDealloc()" zur eingeschränkten
  C-API hinzugefügt. (Beigetragen von Victor Stinner in gh-146063.)

* Funktionen "PySys_GetAttr()", "PySys_GetAttrString()",
  "PySys_GetOptionalAttr()" und "PySys_GetOptionalAttrString()" als
  Ersatz für "PySys_GetObject()" hinzugefügt. (Beigetragen von Serhiy
  Storchaka in gh-108512.)

* "PyUnstable_Unicode_GET_CACHED_HASH()" hinzugefügt, um den
  zwischengespeicherten Hash einer Zeichenkette abzurufen.
  Einschränkungen sind in der Dokumentation beschrieben. (Beigetragen
  von Petr Viktorin in gh-131510.)

* API zur Prüfung der ABI-Kompatibilität eines Erweiterungsmoduls
  hinzugefügt: "Py_mod_abi", "PyABIInfo_Check()" und "PyABIInfo_VAR".
  (Beigetragen von Petr Viktorin in gh-137210.)

* **PEP 782**, die PyBytesWriter-API, implementiert. Neue Funktionen:

  * "PyBytesWriter_Create()"

  * "PyBytesWriter_Discard()"

  * "PyBytesWriter_Finish()"

  * "PyBytesWriter_FinishWithPointer()"

  * "PyBytesWriter_FinishWithSize()"

  * "PyBytesWriter_Format()"

  * "PyBytesWriter_GetData()"

  * "PyBytesWriter_GetSize()"

  * "PyBytesWriter_Grow()"

  * "PyBytesWriter_GrowAndUpdatePointer()"

  * "PyBytesWriter_Resize()"

  * "PyBytesWriter_WriteBytes()"

  (Beigetragen von Victor Stinner in gh-129813.)

* "PyCriticalSection" und zugehörige Funktionen wurden zur stabilen
  ABI hinzugefügt. (Beigetragen von Petr Viktorin in gh-149225.)

* Neue C-API "PyImport_CreateModuleFromInitfunc()" zum Erzeugen eines
  Moduls aus *spec* und *initfunc* hinzugefügt. (Beigetragen von
  Itamar Oren in gh-116146.)

* "PyTuple_FromArray()" hinzugefügt, um ein "tuple" aus einem Array zu
  erzeugen. (Beigetragen von Victor Stinner in gh-111489.)

* Neuen Export-Hook für Module hinzugefügt: "PyModExport_*".

  (Beigetragen von Petr Viktorin in **PEP 793** und gh-140550.)

* Funktionen hinzugefügt, die garantiert sicher in Handlern für
  "tp_traverse" verwendet werden können:
  "PyObject_GetTypeData_DuringGC()",
  "PyObject_GetItemData_DuringGC()",
  "PyType_GetModuleState_DuringGC()", "PyModule_GetState_DuringGC()",
  "PyModule_GetToken_DuringGC()", "PyType_GetBaseByToken_DuringGC()",
  "PyType_GetModule_DuringGC()", "PyType_GetModuleByToken_DuringGC()".
  (Beigetragen von Petr Viktorin in gh-145925.)

* "PyObject_Dump()" hinzugefügt, um ein Objekt nach "stderr"
  auszugeben. Sie sollte nur zum Debuggen verwendet werden.
  (Beigetragen von Victor Stinner in gh-141070.)

* **PEP 820** implementiert: "PySlot" -- Einheitliches Slot-System für
  die C-API. Die Dokumentation findest du unter Definition slots.

  Dies fügt hinzu:

  * Die Struktur "PySlot";

  * die Funktion "PyType_FromSlots()";

  * neue Slot-IDs: "Py_slot_end", "Py_slot_invalid";
    "Py_slot_subslots", "Py_tp_slots", "Py_mod_slots"; "Py_tp_name",
    "Py_tp_basicsize", "Py_tp_extra_basicsize", "Py_tp_itemsize",
    "Py_tp_flags", "Py_tp_metaclass", "Py_tp_module";

  * Hilfsmakros: "PySlot_DATA", "PySlot_FUNC", "PySlot_SIZE",
    "PySlot_INT64", "PySlot_UINT64", "PySlot_STATIC_DATA",
    "PySlot_END", "PySlot_PTR", "PySlot_PTR_STATIC".

  Die Funktion "PyModule_FromSlotsAndSpec()" und der "PyModExport"
  Export-Hook für Module verwenden ebenfalls die neue Struktur
  "PySlot".

  Die folgenden Funktionen sind *sanft abgekündigt*:

  * "PyType_FromSpec()"

  * "PyType_FromSpecWithBases()"

  * "PyType_FromModuleAndSpec()"

  * "PyType_FromMetaclass()"

  * "PyModule_FromDefAndSpec()"

  * "PyModule_FromDefAndSpec2()"

  * "PyModule_ExecDef()"

  Die Slots "Py_tp_bases" und "Py_tp_base" sind jetzt gleichwertig:
  Sie können entweder auf einen einzelnen Typ oder auf ein Tupel von
  Typen gesetzt werden. Der Slot "Py_tp_bases" wird bevorzugt. Der
  andere wird ignoriert, wenn beide angegeben sind.

  (Beigetragen von Petr Viktorin in gh-149044.)

* Funktionen "PyUnstable_ThreadState_SetStackProtection()" und
  "PyUnstable_ThreadState_ResetStackProtection()" hinzugefügt, um die
  Basisadresse und die Größe des Stackschutzes eines Python-Thread-
  Zustands festzulegen. (Beigetragen von Victor Stinner in gh-139653.)

* C-API-Funktion "PyUnstable_SetImmortal()" hinzugefügt, um Objekte
  als *unsterblich* zu markieren. (Beigetragen von Kumar Aditya in
  gh-143300.)

* Die private, vorläufige Funktion "_Py_InitializeMain()", die in
  Python 3.14 entfernt worden war, wurde wiederhergestellt.
  (Beigetragen von Victor Stinner in gh-142417.)

* Funktionen "PyUnstable_DumpTraceback()" und
  "PyUnstable_DumpTracebackThreads()" hinzugefügt, um Python-
  Stacktraces auszugeben. (Beigetragen von Alex Malyshev in
  gh-145559.)


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

* Wenn das Flag "Py_TPFLAGS_MANAGED_DICT" oder
  "Py_TPFLAGS_MANAGED_WEAKREF" gesetzt ist, muss auch
  "Py_TPFLAGS_HAVE_GC" gesetzt sein. (Beigetragen von Sergey Miryanov
  in gh-134786.)

* "PyDateTime_IMPORT" ist jetzt threadsicher. Code, der
  "PyDateTimeAPI" direkt auf "NULL" prüft, sollte so geändert werden,
  dass er stattdessen "PyDateTime_IMPORT" aufruft. (Beigetragen von
  Kumar Aditya in gh-141563.)


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

* Veraltete Funktionen von "PyUnicode" entfernt:

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

  (Beigetragen von Stan Ulbrych in gh-133612.)

* "PyImport_ImportModuleNoBlock()": veralteter Alias von
  "PyImport_ImportModule()". (Beigetragen von Bénédikt Tran in
  gh-133644.)

* "PyWeakref_GetObject()" und "PyWeakref_GET_OBJECT": Verwende
  stattdessen "PyWeakref_GetRef()". Mit dem pythoncapi-compat project
  lässt sich "PyWeakref_GetRef()" unter Python 3.12 und älter nutzen.
  (Beigetragen von Bénédikt Tran in gh-133644.)

* Das veraltete "PySys_ResetWarnOptions()" entfernt. Leere stattdessen
  "sys.warnoptions" und "warnings.filters".

  (Beigetragen von Nikita Sobolev in gh-138886.)

Die folgenden Funktionen wurden zugunsten von "PyConfig_Get()"
entfernt. Mit dem pythoncapi-compat project lässt sich
"PyConfig_Get()" unter Python 3.13 und älter nutzen.

* Funktionen zur Initialisierung von Python:

  * "Py_GetExecPrefix()": Verwende stattdessen
    "PyConfig_Get("base_exec_prefix")" ("sys.base_exec_prefix").
    Verwende "PyConfig_Get("exec_prefix")" ("sys.exec_prefix"), wenn
    virtuelle Umgebungen berücksichtigt werden müssen.

  * "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
    berücksichtigt werden müssen.

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

  (Beigetragen von Bénédikt Tran in gh-133644.)


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

* Die Unterstützung aus **PEP 456** für eine externe Definition des
  Hash-Verfahrens für Zeichenketten ist veraltet. Die Entfernung ist
  für Python 3.19 geplant.

  Bisher konnten Einbettende "Py_HASH_ALGORITHM" auf
  "Py_HASH_EXTERNAL" setzen, um anzugeben, dass das Hash-Verfahren
  extern bereitgestellt wird. Diese Funktion war jedoch
  undokumentiert, ungetestet und wurde höchstwahrscheinlich nicht
  verwendet.

  (Beigetragen von Bénédikt Tran in gh-141226.)

* Bei vorzeichenlosen Ganzzahlformaten in "PyArg_ParseTuple()" ist es
  jetzt veraltet, Python-Ganzzahlen zu akzeptieren, deren Wert größer
  als der Maximalwert des C-Typs oder kleiner als der Minimalwert des
  entsprechenden vorzeichenbehafteten Ganzzahltyps gleicher Größe ist.
  (Beigetragen von Serhiy Storchaka in gh-132629.)

* "PyBytes_FromStringAndSize(NULL, len)" und "_PyBytes_Resize()" sind
  *sanft abgekündigt*. Verwende stattdessen die API "PyBytesWriter".
  (Beigetragen von Victor Stinner in gh-129813.)

* "_PyObject_CallMethodId()", "_PyObject_GetAttrId()" und
  "_PyUnicode_FromId()" sind seit Python 3.15 veraltet und werden in
  Python 3.20 entfernt. Verwende stattdessen
  "PyUnicode_InternFromString()", speichere das Ergebnis im
  Modulzustand zwischen und rufe dann "PyObject_CallMethod()" oder
  "PyObject_GetAttr()" auf. (Beigetragen von Victor Stinner in
  gh-141049.)

* Das Feld "cval" des Typs "PyComplexObject" ist veraltet. Verwende
  "PyComplex_AsCComplex()" und "PyComplex_FromCComplex()", um eine
  komplexe Python-Zahl in die C-Darstellung "Py_complex" bzw. aus ihr
  zu konvertieren. (Beigetragen von Sergey B Kirpichev in gh-128813.)

* Die Funktionen "_Py_c_sum()", "_Py_c_diff()", "_Py_c_neg()",
  "_Py_c_prod()", "_Py_c_quot()", "_Py_c_pow()" und "_Py_c_abs()" sind
  *sanft abgekündigt*. (Beigetragen von Sergey B Kirpichev in
  gh-128813.)

* "bytes_warning" ist seit Python 3.15 veraltet und wird in Python
  3.17 entfernt. (Beigetragen von Nikita Sobolev in gh-136355.)

* Das Makro "Py_INFINITY" ist *sanft abgekündigt*. Verwende
  stattdessen das "<math.h>" "INFINITY" des C11-Standards.
  (Beigetragen von Sergey B Kirpichev in gh-141004.)

* Die folgenden Makros sind *sanft abgekündigt*:

  * "Py_ALIGNED": Verwende stattdessen "alignas".

  * "PY_FORMAT_SIZE_T": Verwende direkt ""z"".

  * "Py_LL" und "Py_ULL": Verwende die Standardsuffixe "LL" und "ULL".

  * "PY_LONG_LONG", "PY_LLONG_MIN", "PY_LLONG_MAX", "PY_ULLONG_MAX",
    "PY_INT32_T", "PY_UINT32_T", "PY_INT64_T", "PY_UINT64_T",
    "PY_SIZE_MAX": Verwende die Typen und Grenzwerte von C99.

  * "Py_UNICODE_SIZE": Verwende direkt "sizeof(wchar_t)".

  * "Py_VA_COPY": Verwende direkt "va_copy".

  Das Makro "Py_UNICODE_WIDE", dessen Entfernung geplant war, ist
  stattdessen *sanft abgekündigt*.

  (Beigetragen von Petr Viktorin in gh-146175.)

* "Py_MATH_El" und "Py_MATH_PIl" sind seit Python 3.15 veraltet und
  werden in Python 3.20 entfernt. (Beigetragen von Sergey B Kirpichev
  in gh-141004.)


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

* Der implizite Rückgriff auf die mitgelieferte Kopie der Bibliothek
  "libmpdec" wurde entfernt. Er muss jetzt explizit aktiviert werden,
  indem "--with-system-libmpdec" auf "no" gesetzt oder "--without-
  system-libmpdec" angegeben wird. (Beigetragen von Sergey B Kirpichev
  in gh-115119.)

* Mit der neuen configure-Option "--with-missing-stdlib-config=FILE"
  können Distributoren eine Konfigurationsdatei im Format JSON
  übergeben, die eigene Fehlermeldungen für Module der
  *Standardbibliothek* enthält, die fehlen oder separat paketiert
  sind. (Beigetragen von Stan Ulbrych und Petr Viktorin in gh-139707.)

* Die neue configure-Option "--with-pymalloc-hugepages" aktiviert die
  Unterstützung von Huge Pages für Arenen von pymalloc. Wenn sie
  aktiviert ist, steigt die Arenengröße auf 2 MiB, und die
  Speicherzuteilung verwendet "MAP_HUGETLB" (Linux) oder
  "MEM_LARGE_PAGES" (Windows) mit automatischem Rückgriff auf normale
  Seiten. Unter Windows verwende "build.bat --pymalloc-hugepages". Zur
  Laufzeit müssen Huge Pages explizit aktiviert werden, indem die
  Umgebungsvariable "PYTHON_PYMALLOC_HUGEPAGES" auf "1" gesetzt wird.
  (Beigetragen von Pablo Galindo Salgado in gh-144319.)

* Das Benennen anonymer mmap-Bereiche wird jetzt unterstützt, wenn der
  Linux-Kernel *PR_SET_VMA_ANON_NAME* unterstützt (Linux 5.17 oder
  neuer). Die Benennungen sind in "/proc/<pid>/maps" sichtbar, wenn
  der Kernel das Feature unterstützt und Python mit "-X dev" gestartet
  oder im Debug-Modus gebaut wurde. (Beigetragen von Donghee Na in
  gh-141770.)

* CPython wird jetzt standardmäßig mit aktivierten Frame-Pointern
  gebaut (**PEP 831**). Übergib "--without-frame-pointers", um dies
  abzuschalten.

  Autoren von C-Erweiterungen und nativen Bibliotheken, die mit
  eigenen Build-Systemen gebaut werden, sollten sicherstellen, dass
  die Unwind-Kette intakt ist. Dazu fügt man üblicherweise "-fno-omit-
  frame-pointer" und ähnliche Flags zu "CFLAGS" hinzu. Die konkreten
  Flags, die Python verwendet, findest du in der Dokumentation zu "--
  without-frame-pointers".

  (Beigetragen von Pablo Galindo Salgado und Savannah Ostrowski in
  gh-149201.)

* 64-Bit-Builds mit Visual Studio 2026 (MSVC 18) können jetzt den
  neuen Tail-Calling-Interpreter verwenden. Ergebnisse mit Visual
  Studio 18.1.1 zeigen eine Beschleunigung von 15-20% im geometrischen
  Mittel von pyperformance unter Windows x86-64 gegenüber dem Switch-
  Case-Interpreter auf einem AMD Ryzen 7 5800X. Wir haben unter
  Windows Beschleunigungen von 14 % bei großen reinen Python-
  Bibliotheken bis zu 40 % bei lang laufenden kleinen reinen Python-
  Skripten beobachtet. Möglich wurde dies durch ein neues Feature in
  MSVC 18, das die offiziellen 64-Bit-Binärdateien für Windows auf
  python.org jetzt nutzen. (Beigetragen von Chris Eibl, Ken Jin und
  Brandt Bucher in gh-143068. Besonderer Dank an Steve Dower und das
  MSVC-Team einschließlich Hulon Jenkins.)


Portierung auf Python 3.15
==========================

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

* Die APIs von "sqlite3.Connection" wurden bereinigt.

  * Alle Parameter von "sqlite3.connect()" außer *database* sind jetzt
    reine Schlüsselwortparameter.

  * Die ersten drei Parameter der Methoden "create_function()" und
    "create_aggregate()" sind jetzt reine Positionsparameter.

  * Der erste Parameter der Methoden "set_authorizer()",
    "set_progress_handler()" und "set_trace_callback()" ist jetzt ein
    reiner Positionsparameter.

  (Beigetragen von Serhiy Storchaka in gh-133595.)

* "resource.RLIM_INFINITY" ist jetzt immer positiv. Die Übergabe eines
  negativen Ganzzahlwerts, der seinem alten Wert entsprach (etwa "-1"
  oder "-3", je nach Plattform), an "resource.setrlimit()" und
  "resource.prlimit()" ist jetzt veraltet. (Beigetragen von Serhiy
  Storchaka in gh-137044.)

* "mmap.mmap.resize()" wurde auf Plattformen, die den zugrunde
  liegenden Systemaufruf nicht unterstützen, entfernt, statt einen
  "SystemError" auszulösen. (Beigetragen von An Long in gh-138205.)

* Für einen nicht geschlossenen Iterator von
  "xml.etree.ElementTree.iterparse()", der eine Datei geöffnet hat,
  wird jetzt eine Ressourcenwarnung ausgegeben. Verwende seine Methode
  "close()" oder den Kontextmanager "contextlib.closing()", um ihn zu
  schließen. (Beigetragen von Osama Abdelkader und Serhiy Storchaka in
  gh-140601.)

* Wenn eine kurze Option und eine lange Option mit einfachem
  Bindestrich an "argparse.ArgumentParser.add_argument()" übergeben
  werden, wird *dest* jetzt aus der langen Option mit einfachem
  Bindestrich abgeleitet. Bei "add_argument('-f', '-foo')" ist *dest*
  jetzt zum Beispiel "'foo'" statt "'f'". Übergib ein explizites
  Argument *dest*, um das alte Verhalten beizubehalten. (Beigetragen
  von Serhiy Storchaka in gh-138697.)

* Padding der Eingabe ist in "base64.urlsafe_b64decode()" nicht mehr
  erforderlich. Übergib das neue Argument "padded=True" oder verwende
  "base64.b64decode()" mit dem Argument "altchars=b'-_'" (das
  funktioniert auch mit älteren Python-Versionen), um Padding
  vorauszusetzen. (Beigetragen von Serhiy Storchaka in gh-73613.)

* Da "unittest.TestCase.assertWarns()" und
  "unittest.TestCase.assertWarnsRegex()" keine Warnungen mehr
  verschlucken, die nicht zur angegebenen Kategorie oder zum
  angegebenen regulären Ausdruck passen, können in deinen Tests
  Warnungen durchsickern, die bisher verdeckt waren. Verwende
  Warnungsfilter, um sie zu unterdrücken, oder zusätzliche
  "assertWarns*()", um sie abzufangen und zu prüfen. (Beigetragen von
  Serhiy Storchaka in gh-143231.)
