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:

Wesentliche Verbesserungen in der Standardbibliothek:

Neue Typing-Features:

Verbesserungen der C-API:

Änderungen am Build:

Änderungen an den Releases:

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

Logo des Tachyon-Profilers

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:

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 Setting up the build 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 einem bytearray gearbeitet wurde

    def read() -> bytes:
        buffer = bytearray(1024)
        ...
        return bytes(buffer)
    
    def read() -> bytes:
        buffer = bytearray(1024)
        ...
        return buffer.take_bytes()
    

    Einen Puffer leeren und dabei die Bytes erhalten

    buffer = bytearray(1024)
    ...
    data = bytes(buffer)
    buffer.clear()
    
    buffer = bytearray(1024)
    ...
    data = buffer.take_bytes()
    

    Einen Puffer an einem bestimmten Trennzeichen aufteilen

    buffer = bytearray(b'abc\ndef')
    n = buffer.find(b'\n')
    data = bytes(buffer[:n + 1])
    del buffer[:n + 1]
    assert data == b'abc\n'
    assert buffer == bytearray(b'def')
    
    buffer = bytearray(b'abc\ndef')
    n = buffer.find(b'\n')
    data = buffer.take_bytes(n + 1)
    

    Einen Puffer an einem bestimmten Trennzeichen aufteilen; den Rest nach dem Trennzeichen verwerfen

    buffer = bytearray(b'abc\ndef')
    n = buffer.find(b'\n')
    data = bytes(buffer[:n])
    buffer.clear()
    assert data == b'abc'
    assert len(buffer) == 0
    
    buffer = bytearray(b'abc\ndef')
    n = buffer.find(b'\n')
    buffer.resize(n)
    data = buffer.take_bytes()
    

    (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

binascii

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

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

functools

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

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

mimetypes

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

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:

    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

sys

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

sys.monitoring

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

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

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

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

unittest

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

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

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

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

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

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:

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

Geplante Entfernung in Python 3.16

Geplante Entfernung in Python 3.17

  • datetime:

    • Aufrufe von strptime() mit einer Formatzeichenkette, die %e (Tag des Monats) ohne Jahr enthält. Dies ist seit Python 3.15 veraltet. (Beigetragen von Stan Ulbrych in gh-70647.)

  • collections.abc:

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

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

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

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

  • encodings:

    • Die Übergabe von Namen für encoding, die nicht ASCII sind, an encodings.normalize_encoding() ist veraltet und soll in Python 3.17 entfernt werden. (Beigetragen von Stan Ulbrych in gh-136702.)

  • profile:

    • Das Modul profile ist veraltet und wird in Python 3.17 entfernt. Verwende stattdessen profiling.tracing, das eine kompatible API bietet. Details findest du in PEP 799. (Beigetragen von Pablo Galindo und László Kiss Kollár in gh-138122.)

  • webbrowser:

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

  • typing:

    • Vor Python 3.14 wurden Unions im alten Stil mit der privaten Klasse typing._UnionGenericAlias implementiert. Diese Klasse wird für die Implementierung nicht mehr benötigt, wurde aber aus Gründen der Abwärtskompatibilität beibehalten; ihre Entfernung ist für Python 3.17 geplant. Verwende dokumentierte Hilfsfunktionen zur Introspektion wie typing.get_origin() und typing.get_args(), statt dich auf private Implementierungsdetails zu verlassen.

    • typing.ByteString, seit Python 3.9 veraltet, soll in Python 3.17 entfernt werden.

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

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

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

  • tkinter:

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

Geplante Entfernung in Python 3.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:

  • imaplib:

    • Das Ändern von IMAP4.file ist jetzt veraltet und soll in Python 3.19 entfernt werden. Diese Eigenschaft wird nicht mehr verwendet, und das Ändern ihres Werts schließt die aktuelle Datei nicht automatisch.

      Vor Python 3.14 wurde diese Eigenschaft verwendet, um die entsprechenden Methoden read() und readline() von IMAP4 zu implementieren; das ist seitdem nicht mehr der Fall.

Geplante Entfernung in Python 3.20

Geplante Entfernung in zukünftigen Versionen

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

  • argparse:

    • Das Verschachteln von Argumentgruppen und von sich gegenseitig ausschließenden Gruppen ist veraltet.

    • Die Übergabe des undokumentierten Schlüsselwortarguments prefix_chars an add_argument_group() ist jetzt veraltet.

    • Der Typkonverter argparse.FileType ist veraltet.

  • builtins:

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

    • Derzeit akzeptiert Python numerische Literale, auf die unmittelbar Schlüsselwörter folgen, zum Beispiel 0in x, 1or x, 0if 1else 2. Das ermöglicht verwirrende und mehrdeutige Ausdrücke wie [0x1for x in y] (was als [0x1 for x in y] oder als [0x1f or x in y] interpretiert werden kann). Eine Syntaxwarnung wird ausgelöst, wenn auf das numerische Literal unmittelbar eines der Schlüsselwörter and, else, for, if, in, is und or folgt. In einer künftigen Version wird daraus ein Syntaxfehler. (gh-87999)

    • Unterstützung dafür, dass die Methoden __index__() und __int__() einen Typ zurückgeben, der kein int ist: Diese Methoden müssen künftig eine Instanz einer strikten Unterklasse von int zurückgeben.

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

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

    • Die Übergabe einer komplexen Zahl als Argument real oder imag an den Konstruktor complex() ist jetzt veraltet; sie sollte nur als einziges Positionsargument übergeben werden. (Beigetragen von Serhiy Storchaka in gh-109218.)

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

  • codecs: Verwende open() statt codecs.open(). (gh-133038)

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

  • datetime:

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

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

  • gettext: Der Pluralwert muss eine Ganzzahl sein.

  • importlib:

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

  • importlib.metadata:

    • Die Tupel-Schnittstelle von EntryPoints.

    • Implizites None bei Rückgabewerten.

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

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

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

  • os.path: os.path.commonprefix() ist veraltet, verwende os.path.commonpath() für Pfadpräfixe. Die Funktion os.path.commonprefix() wird als veraltet markiert, weil ihr Name und ihr Modul irreführend sind. Die Funktion ist für Pfadpräfixe nicht sicher, obwohl sie in einem Modul zur Pfadbearbeitung enthalten ist. Dadurch lassen sich mit ihr leicht versehentlich Path-Traversal-Schwachstellen in Python-Programme einbauen.

  • pydoc.ErrorDuringImport: Ein Tupelwert für den Parameter exc_info ist veraltet, verwende eine Ausnahmeinstanz.

  • re: Für numerische Gruppenreferenzen und Gruppennamen in regulären Ausdrücken gelten jetzt strengere Regeln. Als numerische Referenz wird jetzt nur noch eine Folge von ASCII-Ziffern akzeptiert. Der Gruppenname in Bytes-Mustern und Ersetzungszeichenketten darf jetzt nur noch ASCII-Buchstaben, Ziffern und Unterstriche enthalten. (Beigetragen von Serhiy Storchaka in gh-91760.)

  • shutil: Der Parameter onerror von rmtree() ist seit Python 3.12 veraltet; verwende stattdessen den Parameter onexc.

  • Optionen und Protokolle von ssl:

    • ssl.SSLContext ohne Protokollargument ist veraltet.

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

    • Optionen ssl.OP_NO_SSL*

    • Optionen ssl.OP_NO_TLS*

    • ssl.PROTOCOL_SSLv3

    • ssl.PROTOCOL_TLS

    • ssl.PROTOCOL_TLSv1

    • ssl.PROTOCOL_TLSv1_1

    • ssl.PROTOCOL_TLSv1_2

    • ssl.TLSVersion.SSLv3

    • ssl.TLSVersion.TLSv1

    • ssl.TLSVersion.TLSv1_1

  • Methoden von threading:

  • typing.Text (gh-92332).

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

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

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

    • splitattr()

    • splithost()

    • splitnport()

    • splitpasswd()

    • splitport()

    • splitquery()

    • splittag()

    • splittype()

    • splituser()

    • splitvalue()

    • to_bytes()

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

  • xml.etree.ElementTree: Das Prüfen des Wahrheitswerts eines Element ist veraltet. In einer künftigen Version wird es immer True zurückgeben. Verwende stattdessen explizite Prüfungen mit len(elem) oder elem is not None.

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

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

Geänderte C-APIs

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.

Veraltete C-APIs

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

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