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:
PEP 799: Ein eigenes Profiling-Paket zur Organisation der Python-Profiling-Werkzeuge
PEP 799: Tachyon: Hochfrequenter statistischer Sampling-Profiler
Neue Typing-Features:
Verbesserungen der C-API:
PEP 782: Eine neue C-API PyBytesWriter zum Erzeugen eines Python-bytes-Objekts
PEP 803, 820, 793: Stabile ABI für Builds mit freien Threads und zugehörige C-API
Änderungen am Build:
PEP 831: Frame-Pointer sind standardmäßig aktiviert, um die Beobachtbarkeit auf Systemebene zu verbessern
Änderungen an den Releases:
Die offiziellen 64-Bit-Binärdateien für Windows verwenden jetzt den Tail-Calling-Interpreter
The official macOS binaries now install free-threading support by default
Neue Features¶
PEP 810: Explizite Lazy Imports¶
Große Python-Anwendungen leiden oft unter langen Startzeiten. Ein wesentlicher Grund dafür ist das Importsystem: Wenn ein Modul importiert wird, muss Python die Datei finden, sie von der Festplatte lesen, sie zu Bytecode kompilieren und den gesamten Code auf oberster Ebene ausführen. Bei Anwendungen mit tiefen Abhängigkeitsbäumen kann dieser Vorgang Sekunden dauern, selbst wenn der größte Teil des importierten Codes während eines bestimmten Laufs nie tatsächlich verwendet wird.
Entwickler haben dies bisher umgangen, indem sie Importe in Funktionen verschoben, Module mit importlib bei Bedarf geladen oder Code umstrukturiert haben, um unnötige Abhängigkeiten zu vermeiden. Diese Ansätze funktionieren, machen den Code aber schwerer lesbar und wartbar, verteilen Import-Anweisungen über die gesamte Codebasis und erfordern Disziplin, um konsequent angewendet zu werden.
Python bietet jetzt eine sauberere Lösung: explizite Importe mit lazy über das neue Soft Keyword lazy. Wenn du einen Import als lazy markierst, verschiebt Python das eigentliche Laden des Moduls, bis der importierte Name zum ersten Mal verwendet wird. So hast du den organisatorischen Vorteil, alle Importe am Anfang der Datei zu deklarieren, zahlst die Ladekosten aber nur für Module, die du tatsächlich verwendest.
Das Schlüsselwort lazy funktioniert sowohl mit Anweisungen der Form import als auch from ... import. Wenn du lazy import heavy_module schreibst, lädt Python das Modul nicht sofort. Stattdessen erzeugt es ein leichtgewichtiges Proxy-Objekt. Das eigentliche Laden des Moduls geschieht transparent, sobald du zum ersten Mal auf den Namen zugreifst:
lazy import json
lazy from pathlib import Path
print("Starting up...") # json and pathlib are not fully imported yet
data = json.loads('{"key": "value"}') # json gets fully imported here
p = Path(".") # pathlib gets fully imported here
Dieser Mechanismus ist besonders nützlich für Anwendungen, die viele Module auf oberster Ebene importieren, bei einem bestimmten Lauf aber möglicherweise nur einen Teil davon verwenden. Das verzögerte Laden verringert die Startlatenz, ohne dass Code umstrukturiert oder bedingte Importe über die gesamte Codebasis verteilt werden müssen.
Schlägt das Laden eines lazy importierten Moduls fehl (zum Beispiel, weil das Modul nicht existiert), löst Python die Ausnahme an der Stelle der ersten Verwendung aus und nicht beim Import. Der zugehörige Traceback enthält sowohl die Stelle, an der auf den Namen zugegriffen wurde, als auch die ursprüngliche Import-Anweisung, sodass sich der Fehler einfach diagnostizieren und debuggen lässt.
Wenn du Lazy Loading global aktivieren möchtest, ohne den Quellcode zu ändern, bietet Python die Kommandozeilenoption -X lazy_imports und die Umgebungsvariable PYTHON_LAZY_IMPORTS. Beide akzeptieren zwei Werte: all macht standardmäßig alle Importe lazy, und normal (der Standard) berücksichtigt das Schlüsselwort lazy im Quellcode. Mit den Funktionen sys.set_lazy_imports() und sys.get_lazy_imports() lässt sich dieser Modus zur Laufzeit ändern und abfragen.
Für eine gezieltere Steuerung akzeptiert sys.set_lazy_imports_filter() ein aufrufbares Objekt, das festlegt, ob ein bestimmtes Modul lazy geladen werden soll. Der Filter erhält drei Argumente: den Namen des importierenden Moduls (oder None), den Namen des importierten Moduls und die fromlist (oder None bei regulären Importen). Er sollte True zurückgeben, um den Import lazy zu erlauben, oder False, um sofortiges Laden zu erzwingen. Damit sind Muster möglich, bei denen nur die Module deiner eigenen Anwendung lazy sind, während Abhängigkeiten von Drittanbietern sofort geladen werden:
import sys
def myapp_filter(importing, imported, fromlist):
return imported.startswith("myapp.")
sys.set_lazy_imports_filter(myapp_filter)
sys.set_lazy_imports("all")
import myapp.slow_module # lazy (matches filter)
import json # eager (does not match filter)
Der Proxy-Typ selbst steht als types.LazyImportType für Code zur Verfügung, der Lazy Imports programmatisch erkennen muss.
Es gibt einige Einschränkungen, wo das Schlüsselwort lazy verwendet werden darf. Lazy Imports sind nur auf Modulebene erlaubt; die Verwendung von lazy innerhalb einer Funktion, eines Klassenrumpfs oder eines Blocks try/except/finally löst einen SyntaxError aus. Weder Stern-Importe noch Future-Importe können lazy sein (lazy from module import * und lazy from __future__ import ... lösen beide einen SyntaxError aus).
Für Code, der das Schlüsselwort lazy nicht direkt verwenden kann (zum Beispiel, wenn Python-Versionen vor 3.15 unterstützt, unter 3.15+ aber trotzdem Lazy Imports genutzt werden sollen), kann ein Modul __lazy_modules__ als Container mit Zeichenketten vollständig qualifizierter Modulnamen definieren. Normale Anweisungen import für diese Module werden dann als lazy behandelt, mit derselben Semantik wie beim Schlüsselwort lazy:
__lazy_modules__ = ["json", "pathlib"]
import json # lazy
import os # still eager
(Beigetragen von Pablo Galindo Salgado und Dino Viehland in gh-142349.)
Siehe auch
PEP 810 enthält die vollständige Spezifikation und Begründung.
PEP 814: Neuer integrierter Typ frozendict¶
Ein neuer unveränderlicher Typ, frozendict, wird dem Modul builtins hinzugefügt. Er erlaubt nach der Erzeugung keine Änderungen. Ein frozendict ist keine Unterklasse von dict; er erbt direkt von object. Ein frozendict ist hashbar, solange alle seine Schlüssel und Werte hashbar sind. Ein frozendict behält die Einfügereihenfolge bei, beim Vergleich wird die Reihenfolge jedoch nicht berücksichtigt.
Zum Beispiel:
>>> a = frozendict(x=1, y=2)
>>> a
frozendict({'x': 1, 'y': 2})
>>> a['z'] = 3
Traceback (most recent call last):
File "<python-input-2>", line 1, in <module>
a['z'] = 3
~^^^^^
TypeError: 'frozendict' object does not support item assignment
>>> b = frozendict(y=2, x=1)
>>> hash(a) == hash(b)
True
>>> a == b
True
Die folgenden Module der Standardbibliothek wurden aktualisiert, sodass sie frozendict akzeptieren: copy, decimal, json, marshal, plistlib (nur für die Serialisierung), pickle, pprint und xml.etree.ElementTree.
eval() und exec() akzeptieren frozendict für globals, und type() sowie str.maketrans() akzeptieren frozendict für dict.
Code, der mit isinstance(arg, dict) auf den Typ dict prüft, kann auf isinstance(arg, (dict, frozendict)) umgestellt werden, um auch den Typ frozendict zu akzeptieren, oder auf isinstance(arg, collections.abc.Mapping), um auch andere Mapping-Typen wie MappingProxyType zu akzeptieren.
(Beigetragen von Victor Stinner und Donghee Na in gh-141510.)
Siehe auch
PEP 814 enthält die vollständige Spezifikation und Begründung.
PEP 661: Neuer integrierter Typ sentinel¶
Ein neuer Typ sentinel wird dem Modul builtins hinzugefügt, mit dem sich eindeutige Sentinel-Werte mit einer knappen Darstellung erzeugen lassen. Sentinel-Objekte behalten beim Kopieren ihre Identität, können in Typausdrücken mit dem Operator | verwendet werden und lassen sich mit pickle serialisieren, wenn sie über Modul und Namen importierbar sind.
(Beigetragen von Jelle Zijlstra in gh-148829; PEP 661 verfasst von Tal Einat.)
Siehe auch
PEP 661 enthält weitere Details.
PEP 799: Ein eigenes Profiling-Paket¶
Ein neues Modul profiling wurde hinzugefügt, um die integrierten Profiling-Werkzeuge von Python unter einem einzigen, kohärenten Namensraum zusammenzufassen. Dieses Modul enthält:
profiling.tracing: deterministisches Tracing von Funktionsaufrufen (verschoben auscProfile).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¶
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ängenSkripte direkt ausführen und profilen (
run) - Profiling ab dem allerersten Moment der AusführungModule ausführen und profilen (
run -m) - Pakete profilen, die alspython -m moduleausgeführt werdenEinen 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 mitpstats. 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.
PEP 803: Stabile ABI für Builds mit freien Threads¶
C-Erweiterungen, die auf die stabile ABI abzielen, können jetzt für die neue stabile ABI für Builds mit freien Threads (auch bekannt als abi3t) kompiliert werden, wodurch sie mit Builds mit freien Threads von CPython kompatibel werden. Dies erfordert in der Regel einige nicht triviale Änderungen am Quellcode, und zwar:
Umstieg auf die mit PEP 697 (Python 3.12) eingeführte API, etwa ein negatives
basicsizeundPyObject_GetTypeData(), stattPyObjectzum Teil der Instanz-Struktur zu machen; undUmstieg von einer Funktion
PyInit_auf einen neuen Export-Hook,PyModExport_*, der zu diesem Zweck in PEP 793 eingeführt wurde, mit einer neuen StrukturPySlot, die in PEP 820 eingeführt wurde.
Beachte, dass die stabile ABI nicht die gesamte Funktionalität bietet, die CPython zu bieten hat. Erweiterungen, die nicht auf abi3t umsteigen können, sollten weiterhin getrennt für die bestehende stabile ABI (abi3) und die versionsspezifische ABI für freie Threads (cp315t) gebaut werden.
Stable ABI for Free-Threaded Builds should typically
be selected in a build tool. Tools with abi3t support include
meson-python, scikit-build-core, and Maturin; see
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
AttributeErrorfü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
encodingangegeben ist. Für die beste Kompatibilität zwischen Python-Versionen solltest du immer explizit ein Argumentencodingangeben. Mit der optionalen Kodierungswarnung lässt sich Code finden, der von dieser Änderung betroffen sein könnte. Das spezielle Argumentencoding='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=0oder der Kommandozeilenoption-X utf8=0deaktiviert 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__()vonImportErrorundModuleNotFoundErrorzeigt „name“ und „path“ jetzt alsname=<name>undpath=<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
-Wund die UmgebungsvariablePYTHONWARNINGSkö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
DecimalundFraction), 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 einembytearrayzu entnehmen. Damit lässt sich Code optimieren, derbyteszurü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 mittake_bytes()optimieren lassen, sind unten aufgeführt.Vorgeschlagene Refactorings zur Optimierung¶ Beschreibung
Alt
Neu
byteszurückgeben, nachdem mit einembytearraygearbeitet wurdedef 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()undimportlib.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
tupleabgeleitet sind (einschließlich der mitcollections.namedtuple()erzeugten Klassen). (Beigetragen von Serhiy Storchaka in gh-41779.)Der Typ
sliceunterstützt jetzt die Indexnotation und ist damit ein generischer Typ. (Beigetragen von James Hilton-Balfe in gh-128335.)Die Klasse
memoryviewunterstü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
matcherlaubt, 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.subimportiert, und ein anderer, derpkg.sub.modimportiert, gegenseitig blockieren konnten, wennpkg/sub/__init__.pydas Modulpkg.sub.modimportiert. (Beigetragen von Gregory P. Smith in gh-83065.)Dateinamen von Erweiterungen für die stabile ABI, die die Endung
.soverwenden, dürfen jetzt ein Multiarch-Tupel enthalten, zum Beispielfoo.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 aufrlcompleterzurü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 ... importvor. 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
BooleanOptionalActionunterstü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.ArgumentParserist jetztTrue. 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
ArgumentParserhinzugefü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.typecodeswurde vonstrzutuplegeändert, um Typcodes zu unterstützen, die länger als ein Zeichen sind (ZfundZd). (Beigetragen von Victor Stinner in gh-148675.)
ast¶
Parameter color zu
dump()hinzugefügt. BeiTruewird die zurückgegebene Zeichenkette mit ANSI-Escape-Sequenzen syntaktisch hervorgehoben. BeiFalse(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.cancelwurde hinzugefügt, um eine Task-Gruppe vorzeitig zu beenden, zum Beispiel wenn das Ziel der Tasks erreicht ist oder ihre Dienste nicht mehr benötigt werden. Bisher erforderte das unintuitiven Boilerplate-Code, etwa einen zusätzlichen Task, der eine eigene Ausnahme auslöst, die dann beim Verlassen der Task-Gruppe unterdrückt wird. (Beigetragen von John Belmonte in gh-127214.)
base64¶
Parameter pad in
z85encode()hinzugefügt. (Beigetragen von Hauke Dämpfling in gh-143103.)Parameter padded in
b32encode(),b32decode(),b32hexencode(),b32hexdecode(),b64encode(),b64decode(),urlsafe_b64encode()undurlsafe_b64decode()hinzugefügt. (Beigetragen von Serhiy Storchaka in gh-73613.)Parameter wrapcol in
b16encode(),b32encode(),b32hexencode(),b64encode(),b85encode()undz85encode()hinzugefügt. (Beigetragen von Serhiy Storchaka in gh-143214 und gh-146431.)Parameter ignorechars in
b16decode(),b32decode(),b32hexdecode(),b64decode(),b85decode()undz85decode()hinzugefügt. (Beigetragen von Serhiy Storchaka in gh-144001 und gh-146431.)Parameter canonical in
b32decode(),b32hexdecode(),b64decode(),a85decode(),b85decode()undz85decode()hinzugefügt, um Kodierungen mit von null verschiedenen Füllbits oder anderen nicht kanonischen Formen abzulehnen. (Beigetragen von Gregory P. Smith in gh-146311.)
binascii¶
Funktionen für die Base32-Kodierung hinzugefügt:
(Beigetragen von James Seo in gh-146192.)
Funktionen für die Kodierungen Ascii85, Base85 und Z85 hinzugefügt:
(Beigetragen von James Seo und Serhiy Storchaka in gh-101178.)
Parameter padded in
b2a_base32(),a2b_base32(),b2a_base64()unda2b_base64()hinzugefügt. (Beigetragen von Serhiy Storchaka in gh-73613.)Parameter wrapcol in
b2a_base64()hinzugefügt. (Beigetragen von Serhiy Storchaka in gh-143214.)Parameter alphabet in
b2a_base64()unda2b_base64()hinzugefügt. (Beigetragen von Serhiy Storchaka in gh-145980.)Parameter ignorechars in
a2b_hex(),unhexlify()unda2b_base64()hinzugefügt. (Beigetragen von Serhiy Storchaka in gh-144001 und gh-146431.)Parameter canonical in
a2b_base64()hinzugefügt, um Kodierungen mit von null verschiedenen Füllbits abzulehnen. (Beigetragen von Gregory P. Smith in gh-146311.)
calendar¶
Die Textausgabe von
calendarauf der Kommandozeile ist jetzt farbiger. Dies lässt sich über Umgebungsvariablen steuern. (Beigetragen von Hugo van Kemenade in gh-148352.)Die HTML-Ausgabe von
calendarauf 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.HTMLCalendarerzeugte 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¶
concurrent.futures¶
Die Fehlerberichterstattung wurde verbessert, wenn ein Kindprozess in einem
concurrent.futures.ProcessPoolExecutorabrupt 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__()inExitStackundcontextlib.AsyncExitStackhinzugefügt, für Konsistenz mit den Anweisungenwithundasync with. (Beigetragen von Serhiy Storchaka in gh-144386.)ContextDecoratorundAsyncContextDecorator(und damit auchcontextmanager()undasynccontextmanager(), wenn sie als Dekoratoren verwendet werden) erkennen jetzt Generatorfunktionen, Koroutinenfunktionen und asynchrone Generatorfunktionen und halten den Kontextmanager während der Iteration bzw. über await hinweg offen. Bisher wurde der Kontextmanager verlassen, sobald das Generator- oder Koroutinenobjekt erzeugt wurde. (Beigetragen von Alex Grönholm und Gregory P. Smith in gh-125862.)
ctypes¶
Das
_type_vonc_float_complex,c_double_complexundc_longdouble_complexwurde für die Kompatibilität mit NumPy vonF,DundGzuZf,ZdundZggeändert. (Beigetragen von Victor Stinner in gh-148675.)
dataclasses¶
Annotationen für generierte Methoden
__init__enthalten keine internen Typnamen mehr. (Beigetragen von David Ellis in gh-137530.)
dbm¶
Neue Methoden
reorganize()indbm.dumbunddbm.sqlite3hinzugefü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.HtmlDifferzeugten 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
EmailMessagewegen 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 unterEmailPolicy.utf8beschrieben. (Beigetragen von R David Murray und Mike Edmunds in gh-122540.)
faulthandler¶
Parameter max_threads in
faulthandler.enable(),faulthandler.dump_traceback(),faulthandler.dump_traceback_later()undfaulthandler.register()hinzugefügt. (Beigetragen von Eric Froemling in gh-149085.)
functools¶
singledispatchmethod()unterstützt jetzt aufrufbare Objekte, die keine Deskriptoren sind. (Beigetragen von Serhiy Storchaka in gh-140873.)singledispatchmethod()wählt die Implementierung jetzt anhand des zweiten Arguments aus, wenn es eine reguläre Methode umhüllt und als Klassenattribut aufgerufen wird. (Beigetragen von Bartosz Sławecki in gh-143535.)
gc¶
Python 3.14.0 bis 3.14.4 wurde mit einem neuen inkrementellen Garbage Collector ausgeliefert. Nach einer Reihe von Berichten über erheblichen Speicherdruck in Produktionsumgebungen wurde er jedoch wieder auf den generationenbasierten GC aus 3.13 zurückgesetzt. Dieser GC wird jetzt in Python 3.14.5 und neuer sowie in Python 3.15 verwendet. (Beigetragen von Sergey Miryanov in gh-148726.)
hashlib¶
Hash-Funktionen, die garantiert immer verfügbar sind, existieren jetzt als Attribute von
hashlib, auch wenn sie zur Laufzeit wegen fehlender Backend-Implementierungen nicht funktionieren. Zum Beispiel lösthashlib.md5keinenAttributeErrormehr 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
HTTPConnectionundHTTPSConnectionwurde der neue Nur-Schlüsselwort-Parameter max_response_headers hinzugefügt. Dieser Parameter überschreibt die standardmäßige Höchstzahl zulässiger Antwort-Header. (Beigetragen von Alexander Enrique Urieles Nieto in gh-131724.)
http.server¶
Das Logging von
BaseHTTPRequestHandler, wie es von der Kommandozeilenschnittstelle verwendet wird, ist standardmäßig farbig. Dies lässt sich über Umgebungsvariablen steuern. (Beigetragen von Hugo van Kemenade in gh-146292.)default_content_typeund die Kommandozeilenoption--content-typewurden hinzugefügt, um den Standard-HeaderContent-Typefür Dateien mit unbekannter Endung anpassen zu können. (Beigetragen von John Comeau und Hugo van Kemenade in gh-113471.)Neues Schlüsselwortargument
extra_response_headersfürSimpleHTTPRequestHandler, um eigene Header in HTTP-Antworten zu unterstützen. (Beigetragen von Anton I. Sipos in gh-135057.)Neue Option
-H/--headerfür die Kommandozeilenschnittstelle python -m http.server, um eigene Header in HTTP-Antworten zu unterstützen. (Beigetragen von Anton I. Sipos in gh-135057.)
importlib.metadata¶
Bisher gaben
metadata()undDistribution.metadatabeim Zugriff auf ein Metadatenverzeichnis einer Distribution ohne Metadatendatei ein leeres Objekt vom TypPackageMetadatazurück, als ob die Datei vorhanden, aber leer wäre. Jetzt wird eine AusnahmeMetadataNotFoundausgelö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¶
json¶
Parameter array_hook für die Funktionen
load()undloads()hinzugefügt: Er erlaubt einen Callback für JSON-Arrays, um die Python-Listen im resultierenden dekodierten Objekt anzupassen. Wirdfrozendictan den Parameter object_pairs_hook undtuplean 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 ingetlocale()nicht mehr stillschweigend entfernt, sondern in den Sprachcode aufgenommen. (Beigetragen von Serhiy Storchaka in gh-137729.)Die Funktion
locale.getdefaultlocale()ist nicht mehr veraltet. (Beigetragen von Victor Stinner in gh-130796.)
math¶
Funktionen
math.isnormal()undmath.issubnormal()hinzugefügt. (Beigetragen von Sergey B Kirpichev in gh-132908.)Funktionen
math.fmax(),math.fmin()undmath.signbit()hinzugefügt. (Beigetragen von Bénédikt Tran in gh-135853.)
mimetypes¶
Weitere MIME-Typen hinzugefügt. (Beigetragen von Benedikt Johannes, Charlie Lin, Foolbar, Gil Forcada und John Franey in gh-144217, gh-145720, gh-140937, gh-139959, gh-145698, gh-145718, gh-145918 und gh-144213.)
application/x-texinfoinapplication/texinfoumbenannt. (Beigetragen von Charlie Lin in gh-140165.)Der MIME-Typ für Dateien mit der Endung
.aiwurde zuapplication/pdfgeändert. (Beigetragen von Stan Ulbrych in gh-141239.)
mmap¶
mmap.mmaphat unter Windows jetzt einen Parameter trackfd; ist erFalse, 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 vonparent_mode=modedas 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 alsFileNotFoundErrorerneut 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 beiparents=Trueder Modus für Zwischenverzeichnisse festlegen lässt. (Beigetragen von Gregory P. Smith in gh-86533.)
pdb¶
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
pickletoolsist 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()undpprint.pp()hinzugefügt. Ist es wahr, wird die Ausgabe ähnlich wie beijson.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
pprinthinzugefügt. (Beigetragen von Loïc Simon und Hugo van Kemenade in gh-134551.)
re¶
re.prefixmatch()und das entsprechendere.Pattern.prefixmatch()wurden als alternative, explizitere Namen für die bestehenden und jetzt sanft abgekündigten APIsre.match()undre.Pattern.match()hinzugefügt. Sie sollen Verwirrung darüber vermeiden, was match bedeutet, und folgen damit dem Grundsatz „Explizit ist besser als implizit“ aus dem Zen of Python. Die Bibliotheken für reguläre Ausdrücke der meisten anderen Sprachen verwenden eine API namens match für das, was in Python schon immer search heißt. (Beigetragen von Gregory P. Smith in gh-86519.)
resource¶
Neue Konstanten hinzugefügt:
RLIMIT_NTHR,RLIMIT_UMTXP,RLIMIT_THREADS,RLIM_SAVED_CURundRLIM_SAVED_MAX. (Beigetragen von Serhiy Storchaka in gh-137512.)
shelve¶
Neue Methode
reorganize()inshelvehinzugefü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
shelvehinzugefü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_TLS13wird angezeigt, ob das Modulssl„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 Methodessl.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 weiterhinssl.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(): WenntimeoutnichtNoneist und die Plattform es unterstützt, wird ein effizienter ereignisgesteuerter Mechanismus verwendet, um auf das Prozessende zu warten:Linux >= 5.3 verwendet
os.pidfd_open()+select.poll().macOS und andere BSD-Varianten verwenden
select.kqueue()+KQ_FILTER_PROC+KQ_NOTE_EXIT.Windows verwendet weiterhin
WaitForSingleObject(unverändert).
Steht keiner dieser Mechanismen zur Verfügung, greift die Funktion auf die herkömmliche Busy-Loop zurück (nicht blockierender Aufruf und kurze Pausen). (Beigetragen von Giampaolo Rodola in gh-83069.)
symtable¶
Methoden
symtable.Function.get_cells()undsymtable.Symbol.is_cell()hinzugefügt. (Beigetragen von Yashp002 in gh-143504.)
sys¶
Namensraum
sys.abi_infohinzugefügt, um den Zugriff auf ABI-Informationen zu verbessern. (Beigetragen von Klaus Zimmermann in gh-137476.)
sys.monitoring¶
Die anderen Ereignisse (
PY_THROW,PY_UNWIND,RAISE,EXCEPTION_HANDLEDundRERAISE) können jetzt pro Codeobjekt aktiviert und deaktiviert werden. Gibt ein Callback für eines dieser EreignisseDISABLEzurück, wird das Ereignis für das gesamte Codeobjekt (für das aktuelle Werkzeug) deaktiviert, statt wie in früheren Versionen einenValueErrorauszulösen. (Beigetragen von Gabriele N. Tornetta in gh-146182.)
tarfile¶
data_filter()normalisiert jetzt die Ziele symbolischer Links, um Path-Traversal-Angriffe zu verhindern. (Beigetragen von Petr Viktorin in gh-127987 und CVE 2025-4138.)extractall()überspringt jetzt das Korrigieren von Verzeichnisattributen, wenn ein Verzeichnis entfernt oder durch eine andere Dateiart ersetzt wurde. (Beigetragen von Petr Viktorin in gh-127987 und CVE 2024-12718.)extract()undextractall()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 AusnahmeLinkFallbackErrorausgelöst. (Beigetragen von Petr Viktorin für CVE 2025-4330 und CVE 2024-12718.)extract()undextractall()extrahieren abgelehnte Elemente nicht mehr, wennerrorlevel()null ist. (Beigetragen von Matt Prodani und Petr Viktorin in gh-112887 und CVE 2025-4435.)extract()undextractall()ersetzen unter Windows jetzt Schrägstriche durch Backslashes in den Zielen symbolischer Links, um das Erzeugen beschädigter Links zu verhindern. (Beigetragen von Christoph Walcher in gh-57911.)gettarinfo()ersetzt unter Windows jetzt Backslashes durch Schrägstriche in den Zielen symbolischer Links, um dem Standard des tar-Formats zu entsprechen. (Beigetragen von Daniele Nicolodi in gh-151669.)
threading¶
serialize_iterator,synchronized_iterator()undconcurrent_tee()wurden hinzugefügt, um den nebenläufigen Zugriff auf Generatoren und Iteratoren zu unterstützen. (Beigetragen von Raymond Hettinger in gh-124397.)
timeit¶
Die Ausgabe der Kommandozeilenschnittstelle von
timeitist 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-allund-overlapalle Treffer eines Musters suchen. (Beigetragen von Rihaan Meher in gh-130848.)Neue Methoden
pack_content(),place_content()undgrid_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
Eventhinzugefügt:user_datafür virtuelle Tk-Ereignisse unddetailfür die EreignisseEnter,Leave,FocusIn,FocusOutundConfigureRequest. (Beigetragen von Matthias Kievernagel und Serhiy Storchaka in gh-47655.)
tokenize¶
Die Ausgabe von
tokenizeauf der Kommandozeilenschnittstelle ist standardmäßig farbig. Dies lässt sich über Umgebungsvariablen steuern. (Beigetragen von Hugo van Kemenade in gh-148991.)
tomllib¶
Das Modul
tomllibunterstü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
\xHHfür einfache Zeichenketten für Codepoints unter 255 und das Escape\efür das Escape-Zeichen wurden hinzugefügt:null = "null byte: \x00; letter a: \x61" csi = "\e["
Sekunden in Datums-/Zeit- und Zeitwerten sind jetzt optional. Folgendes ist jetzt gültig:
dt = 2010-02-03 14:15 t = 14:15
(Beigetragen von Taneli Hukkinen in gh-142956.)
types¶
Der durchschreibende Proxy-Typ von
locals()wird alstypes.FrameLocalsProxyTypebereitgestellt. Er stellt den Typ des Attributsframe.f_localsdar, wie in PEP 667 beschrieben. (Beigetragen von Peter Bierma in gh-136492.)
typing¶
PEP 747:
TypeFormhinzugefügt, eine neue spezielle Form zum Annotieren von Werten, die selbst Typausdrücke sind.TypeForm[T]bedeutet „ein Typform-Objekt, dasTbeschreibt (oder einen Typ, derTzugewiesen werden kann)“. Zur Laufzeit gibtTypeForm(x)einfachxzurü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 TypTypedDictoderlist[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
TypedDicthinzugefügt. Ein geschlossenesTypedDicterlaubt keine zusätzlichen Schlüssel über die im Klassenrumpf angegebenen hinaus, während einTypedDictmitextra_itemsbeliebige 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 einenTypeErroraus, weilSnicht in den Parametern vonProtocolaufgefü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_basehinzugefü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 KlasseCeine disjunkte Basis, können Unterklassen dieser Klasse nicht von anderen disjunkten Basen erben, die weder Eltern- noch Kindklassen vonCsind. (Beigetragen von Jelle Zijlstra in gh-148639.)TypeVarTupleakzeptiert jetzt die Schlüsselwortargumentebound,covariant,contravariantundinfer_variance, passend zur Schnittstelle vonTypeVarundParamSpec. Die Semantik vonboundbleibt in der Spezifikation undefiniert.
unicodedata¶
Die Unicode-Datenbank wurde auf Unicode 17.0.0 aktualisiert. (Beigetragen von Benjamin Peterson in gh-138706.)
Funktionen
unicodedata.isxidstart()undunicodedata.isxidcontinue()hinzugefügt, die prüfen, ob ein Zeichen einen Bezeichner nach Unicode Standard Annex #31 beginnen oder fortsetzen kann. (Beigetragen von Stan Ulbrych in gh-129117.)Funktion
iter_graphemes()hinzugefügt, die über Graphem-Cluster nach den Regeln aus Unicode Standard Annex #29, „Unicode Text Segmentation“ iteriert. Funktionengrapheme_cluster_break(),indic_conjunct_break()undextended_pictographic()hinzugefügt, um die mit diesem Algorithmus zusammenhängenden Eigenschaften eines Zeichens abzufragen. (Beigetragen von Serhiy Storchaka und Guillaume Sanchez in gh-74902.)Funktion
block()hinzugefügt, die den einem Zeichen zugewiesenen Unicode-Block zurückgibt. (Beigetragen von Stan Ulbrych in gh-66802.)
unittest¶
unittest.TestCase.assertLogs()akzeptiert jetzt einen Formatter, mit dem sich die Formatierung der Meldungen steuern lässt. (Beigetragen von Garry Cairns in gh-134567.)unittest.TestCase.assertWarns()undunittest.TestCase.assertWarnsRegex()verschlucken keine Warnungen mehr, die nicht zur angegebenen Kategorie oder zum angegebenen regulären Ausdruck passen. Verschachtelte Kontextmanager werden jetzt unterstützt. (Beigetragen von Serhiy Storchaka in gh-143231.)
urllib.parse¶
Parameter missing_as_none für die Funktionen
urlsplit(),urlparse()undurldefrag()hinzugefügt. Parameter keep_empty für die Funktionenurlunsplit()undurlunparse()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 -> libzu verwenden. Das bedeutet, dass sich purelib und platlib virtueller Umgebungen auf Plattformen, auf denensys.platlibdirnicht gleichlibist, nicht mehr dasselbe Verzeichnislibteilen. (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.pyabgeglichen, sondern auch mit Modulnamen, die ausgehend von verschiedenen übergeordneten Verzeichnissen des Dateinamens gebildet werden (ohne/__init__.py,.pyund unter Windows.pyw). (Beigetragen von Serhiy Storchaka in gh-135801.)
wave¶
Unterstützung für WAVE-Audio im IEEE-Gleitkommaformat (
WAVE_FORMAT_IEEE_FLOAT) inwavehinzugefügt.wave.Wave_read.getformat(),wave.Wave_write.getformat()undwave.Wave_write.setformat()für die explizite Behandlung des Frame-Formats hinzugefügt.wave.Wave_write.setparams()akzeptiert sowohl 7-elementige Tupel einschließlichformatals auch aus Gründen der Abwärtskompatibilität 6-elementige Tupel (mitWAVE_FORMAT_PCMals Standard).Die Ausgabe mit
WAVE_FORMAT_IEEE_FLOATenthält jetzt einen Chunkfact, 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.MacOSURLs über /usr/bin/open, statt AppleScript zu erzeugen und über osascript auszuführen. Der Standardbrowser wird mitplistlibaus der Einstellungsdatei von LaunchServices ermittelt, mitcom.apple.Safarials Rückfall bei Neuinstallationen. Für URLs, die nicht HTTP(S) verwenden, wird open -b <bundle-id> verwendet, um die URL über einen Browser statt über den Datei-Handler des Betriebssystems zu leiten; das verhindert Angriffe durch Einschleusen von Dateien. (Beigetragen von Jeff Lyon in gh-137586.)
xml¶
Funktion
xml.is_valid_name()hinzugefügt, die prüft, ob eine Zeichenkette als Element- oder Attributname in XML verwendet werden kann. (Beigetragen von Serhiy Storchaka in gh-139489.)Funktion
xml.is_valid_text()hinzugefügt, die prüft, ob eine Zeichenkette in einem XML-Dokument verwendet werden kann. (Beigetragen von Serhiy Storchaka in gh-139489.)
xml.parsers.expat¶
SetAllocTrackerActivationThreshold()undSetAllocTrackerMaximumAmplification()wurden den Objekten vom Typ xmlparser hinzugefügt, um den Schutz vor unverhältnismäßig hohem dynamischem Speicherverbrauch innerhalb eines Expat-Parsers einzustellen. (Beigetragen von Bénédikt Tran in gh-90949.)SetBillionLaughsAttackProtectionActivationThreshold()undSetBillionLaughsAttackProtectionMaximumAmplification()wurden den Objekten vom Typ xmlparser hinzugefügt, um den Schutz vor Angriffen vom Typ billion laughs einzustellen. (Beigetragen von Bénédikt Tran in gh-90949.)
zlib¶
Zwei Adler-32-Prüfsummen lassen sich jetzt mit
adler32_combine()kombinieren. (Beigetragen von Callum Attryde und Bénédikt Tran in gh-134635.)Zwei CRC-32-Prüfsummen lassen sich jetzt mit
crc32_combine()kombinieren. (Beigetragen von Bénédikt Tran in gh-134635.)
Optimierungen¶
mimallocwird jetzt als Standard-Allocator für rohe Speicheranforderungen verwendet, etwa überPyMem_RawMalloc(), um die Performance in Builds mit freien Threads zu verbessern. (Beigetragen von Kumar Aditya in gh-144914.)
base64 & binascii¶
Die zugrunde liegende base64-Implementierung von CPython kodiert jetzt dank einfacher Optimierungen für das CPU-Pipelining doppelt so schnell und dekodiert dreimal so schnell. (Beigetragen von Gregory P. Smith und Serhiy Storchaka in gh-143262.)
Die Implementierung der Kodierungen Ascii85, Base85 und Z85 wurde in C neu geschrieben. Kodieren und Dekodieren sind jetzt um zwei Größenordnungen schneller und verbrauchen zwei Größenordnungen weniger Speicher. (Beigetragen von James Seo und Serhiy Storchaka in gh-101178.)
Die Implementierung von Base32 wurde in C neu geschrieben. Kodieren und Dekodieren sind jetzt um zwei Größenordnungen schneller. (Beigetragen von James Seo in gh-146192.)
csv¶
Die Erkennung des Trennzeichens in
csv.Sniffer.sniff()ist jetzt bis zu 1,6-mal schneller. (Beigetragen von Maurycy Pawłowski-Wieroński in gh-137628.)
Verbesserter experimenteller JIT-Compiler¶
Ergebnisse der Benchmark-Sammlung pyperformance weisen für den JIT im geometrischen Mittel eine Leistungsverbesserung von 7-8 % gegenüber dem Standard-CPython-Interpreter aus, der auf x86-64-Linux mit allen Optimierungen gebaut wurde. Auf AArch64-macOS ist der JIT 11-12 % schneller als der Tail-Call-Interpreter mit allen aktivierten Optimierungen. Die Beschleunigung von Builds mit JIT gegenüber Builds ohne JIT reicht auf x86-64-Linux- und AArch64-macOS-Systemen von etwa 15 % Verlangsamung bis zu über 100 % Beschleunigung (vom Mikro-Benchmark unpack_sequence abgesehen).
Die wichtigsten Verbesserungen am JIT sind:
LLVM 21 als Abhängigkeit zur Build-Zeit
Neues Tracing-Frontend
Einfache Registerzuteilung im JIT
Weitere JIT-Optimierungen
Unterstützung für Unwinding mit GDB und GNU
backtrace()Bessere Generierung von Maschinencode
LLVM 21 als Abhängigkeit zur Build-Zeit
Der JIT-Compiler verwendet jetzt LLVM 21 zur Generierung der Stencils zur Build-Zeit. Wie bisher wird LLVM nur benötigt, wenn CPython mit aktiviertem JIT gebaut wird; Endbenutzer, die Python ausführen, müssen LLVM nicht installiert haben. Anleitungen zur Installation von LLVM für alle unterstützten Plattformen findest du in der Dokumentation des JIT-Compilers. (Beigetragen von Savannah Ostrowski in gh-140973.)
Ein neues Tracing-Frontend
Der JIT-Compiler unterstützt jetzt deutlich mehr Bytecode-Operationen und Kontrollfluss als in Python 3.14 und ermöglicht so Beschleunigungen bei einer größeren Vielfalt von Code. Zum Beispiel versteht der JIT-Compiler von 3.15 jetzt das einfache Erzeugen von Python-Objekten. Überladene Operationen und Generatoren werden ebenfalls teilweise unterstützt. Möglich wurde dies durch ein überarbeitetes Tracing-Frontend des JIT, das die tatsächlichen Ausführungspfade durch den Code aufzeichnet, statt sie wie die bisherige Implementierung zu schätzen. (Beigetragen von Ken Jin in gh-139109. Unterstützung für Windows hinzugefügt von Mark Shannon in gh-141703.)
Einfache Registerzuteilung im JIT
Dem Optimierer des JIT-Compilers wurde eine einfache Form der Registerzuteilung hinzugefügt. Dadurch kann der JIT-Compiler bestimmte Stack-Operationen ganz vermeiden und stattdessen mit Registern arbeiten. So kann der JIT effizientere Traces erzeugen, weil Lese- und Schreibzugriffe auf den Speicher entfallen. (Beigetragen von Mark Shannon in gh-135379.)
Weitere JIT-Optimierungen
Es wird jetzt mehr Konstantenpropagation durchgeführt. Das heißt: Wenn der JIT-Compiler erkennt, dass bestimmter Benutzercode Konstanten ergibt, kann der JIT diesen Code vereinfachen. (Beigetragen von Ken Jin und Savannah Ostrowski in gh-132732.)
Referenzanzahlen werden vermieden, wann immer das gefahrlos möglich ist. Das senkt im Allgemeinen die Kosten der meisten Operationen in Python. (Beigetragen von Ken Jin, Donghee Na, Zheao Li, Hai Zhu, Savannah Ostrowski, Reiden Ong, Noam Cohen, Tomas Roun, PuQing, Cajetan Rodrigues und Sacul in gh-134584.)
Durch das Verfolgen eindeutiger Referenzen auf Objekte kann der JIT-Optimierer jetzt Aktualisierungen der Referenzanzahl einsparen und In-place-Operationen auf Ganzzahlen und Gleitkommazahlen durchführen. (Beigetragen von Reiden Ong und Pieter Eendebak in gh-143414 und gh-146306.)
Der JIT-Optimierer unterstützt jetzt deutlich mehr Operationen als in 3.14. (Beigetragen von Kumar Aditya, Ken Jin, Jiahao Li und Sacul in gh-131798.)
Unterstützung für Unwinding mit GDB und GNU backtrace()
Der JIT-Compiler veröffentlicht jetzt auf unterstützten Linux-ELF-Plattformen Unwind-Informationen für generierten Maschinencode über die GDB-Schnittstelle. Wenn die Frame-Registrierung von libgcc verfügbar ist, werden dieselben Unwind-Informationen auch für Stack-Walker von GNU backtrace() registriert. Dadurch können native Debugger, Crash-Handler und Diagnosewerkzeuge, die diese Mechanismen nutzen, durch JIT-Frames hindurch abwickeln, statt am generierten Code anzuhalten. (Beigetragen von Diego Russo und Pablo Galindo Salgado in gh-146071 und gh-149104.)
Bessere Generierung von Maschinencode
Der Maschinencode-Generator des JIT-Compilers erzeugt jetzt besseren Maschinencode für x86-64 und AArch64 unter macOS und Linux. Im Allgemeinen sollten Benutzer im Vergleich zu 3.14 einen geringeren Speicherverbrauch für generierten Maschinencode und effizienteren Maschinencode feststellen. (Beigetragen von Brandt Bucher in gh-136528 und gh-135905. Implementierung für AArch64 beigetragen von Mark Shannon in gh-139855. Zusätzliche Optimierungen für AArch64 beigetragen von Mark Shannon und Diego Russo in gh-140683 und gh-142305.)
Wartbarkeit
Die Operationen des JIT-Optimierers wurden vereinfacht. Möglich wurde dies durch ein Refactoring der Datenstrukturen des JIT. (Beigetragen von Zhongtian Zheng in gh-148211 und Hai Zhu in gh-143421.)
Entfernt¶
ast¶
Die Konstruktoren von AST-Knoten lösen jetzt einen
TypeErroraus, 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 eineDeprecationWarningausgelöst. (Beigetragen von Brian Schubert und Jelle Zijlstra in gh-137600 und gh-105858.)
collections.abc¶
collections.abc.ByteStringwurde auscollections.abc.__all__entfernt.collections.abc.ByteStringist 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 einenValueErroraus, 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()undglob.glob1(), die seit Python 3.13 veraltet waren, wurden entfernt. Verwende stattdessenglob.glob()und übergib ein Verzeichnis an dessen Argument root_dir. (Beigetragen von Barney Gale in gh-137466.)
http.server¶
Die Klasse
CGIHTTPRequestHandlerund die Option--cgider 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()vonLoaderund 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 vonexec_module()veraltet. (Beigetragen von Brett Cannon in gh-97850.)
importlib.resources¶
Den veralteten Parameter
packageder Funktionimportlib.resources.files()entfernt. (Beigetragen von Semyon Moroz in gh-138044.)
pathlib¶
Das veraltete
pathlib.PurePath.is_reserved()entfernt. Verwendeos.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_constantsundsre_parsewurden entfernt. (Beigetragen von Stan Ulbrych in gh-135994.)
sysconfig¶
Den Parameter check_home von
sysconfig.is_python_build()entfernt. (Beigetragen von Filipe Laíns in gh-92897.)
threading¶
types¶
codeobject.co_lnotabwurde austypes.CodeTypeentfernt; es war seit Python 3.12 durch PEP 626 veraltet. (Beigetragen von Nikita Sobolev in gh-134690.)
typing¶
typing.ByteStringwurde austyping.__all__entfernt.typing.ByteStringist 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 BeispielPoint = 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")oderTD = TypedDict("TD", None)zum Erzeugen eines TypsTypedDictohne Felder wird nicht mehr unterstützt. Verwende stattdessenclass TD(TypedDict): passoderTD = TypedDict("TD", {}). (Beigetragen von Bénédikt Tran in gh-133823.)Der veraltete Dekorator
@typing.no_type_check_decoratorwurde entfernt. (Beigetragen von Nikita Sobolev in gh-133601.)
wave¶
Die Methoden
getmark(),setmark()undgetmarkers()der KlassenWave_readundWave_write, die seit Python 3.13 veraltet waren, wurden entfernt. (Beigetragen von Bénédikt Tran in gh-133873.)
zipimport¶
Das veraltete
zipimport.zipimporter.load_module()entfernt. Verwende stattdessenzipimport.zipimporter.exec_module(). (Beigetragen von Jiahao Li in gh-133656.)
Als veraltet markiert¶
Neu als veraltet markiert¶
ast:-
Das Akzeptieren der Zeichen
+und/bei einem alternativen Alphabet inb64decode()undurlsafe_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
-bund-bbsind 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 keineBytesWarningmehr ausgelöst; verwende stattdessen einen Typprüfer.(Beigetragen von Nikita Sobolev in gh-136355.)
-
Die folgenden Anweisungen lösen jetzt zur Laufzeit
DeprecationWarningaus:from collections.abc import ByteStringimport collections.abc; collections.abc.ByteString.
DeprecationWarningwurde bereits ausgelöst, wenn voncollections.abc.ByteStringabgeleitet wurde oder es als zweites Argument anisinstance()oderissubclass()übergeben wurde. Bisher wurden aber keine Warnungen ausgegeben, wenn es lediglich importiert oder aus dem Modulcollections.abcabgerufen wurde. (Beigetragen von Alex Waygood in gh-118803.)
-
Bei Konstruktoren von Hash-Funktionen wie
new()oder den direkt nach dem Hash benannten Konstruktoren wiemd5()undsha256()konnte der optionale Parameter für die Anfangsdaten in verschiedenen Implementierungen vonhashlibauch als Schlüsselwortargument namensdata=oderstring=übergeben werden.Die Unterstützung des Schlüsselwortarguments
stringist 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.)
-
Morsel.js_outputundBaseCookie.js_outputsind veraltet und werden in Python 3.19 entfernt. Verwende stattdessenMorsel.outputoderBaseCookie.output. (Beigetragen von kishorhange111 in gh-148849.)
-
Das Ändern von
IMAP4.fileist 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.)
-
Das Modul
profileist veraltet und wird in Python 3.17 entfernt. Verwende stattdessenprofiling.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()undre.Pattern.match()sind jetzt sanft abgekündigt, zugunsten der neuen APIsre.prefixmatch()undre.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 weiterhinmatch()verwenden, während neuer Codeprefixmatch()bevorzugen sollte. Siehe prefixmatch() vs. match().(Beigetragen von Gregory P. Smith in gh-86519 und Hugo van Kemenade in gh-148100.)
-
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 ObjektStructist 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.)
-
Die folgenden Anweisungen lösen jetzt zur Laufzeit
DeprecationWarningaus:from typing import ByteStringimport typing; typing.ByteString.
DeprecationWarningwurde bereits ausgelöst, wenn vontyping.ByteStringabgeleitet wurde oder es als zweites Argument anisinstance()oderissubclass()übergeben wurde. Bisher wurden aber keine Warnungen ausgegeben, wenn es lediglich importiert oder aus dem Modultypingabgerufen wurde. (Beigetragen von Alex Waygood in gh-118803.)Es ist veraltet, Prüfungen mit
isinstance()undissubclass()auf Protokollklassen anzuwenden, die nicht explizit mitruntime_checkable()dekoriert sind, aber von einer zur Laufzeit prüfbaren Protokollklasse erben. In Python 3.20 wird dies einenTypeErrorauslösen.(Beigetragen von Bartosz Sławecki in gh-132604.)
-
webbrowser.MacOSXOSAScriptist zugunsten vonwebbrowser.MacOSveraltet und soll in Python 3.17 entfernt werden. (Beigetragen von Jeff Lyon in gh-137586.)
__version__:Die Attribute
__version__,versionundVERSIONsind in diesen Modulen der Standardbibliothek veraltet und werden in Python 3.20 entfernt. Verwende stattdessensys.version_info.ctypes.macholibdecimal(stattdessendecimal.SPEC_VERSIONverwenden)logging(__date__ist ebenfalls veraltet)xml.sax.expatreader
(Beigetragen von Hugo van Kemenade und Stan Ulbrych in gh-76007.)
Geplante Entfernung in Python 3.16¶
Das Importsystem:
Das Setzen von
__loader__für ein Modul, ohne__spec__.loaderzu setzen, ist veraltet. In Python 3.16 wird__loader__vom Importsystem und der Standardbibliothek weder gesetzt noch berücksichtigt.
-
Das Formatzeichen
'u'(wchar_t) ist seit Python 3.3 in der Dokumentation und seit Python 3.13 zur Laufzeit veraltet. Verwende für Unicode-Zeichen stattdessen das Formatzeichen'w'(Py_UCS4).
-
asyncio.iscoroutinefunction()ist veraltet und wird in Python 3.16 entfernt; verwende stattdesseninspect.iscoroutinefunction(). (Beigetragen von Jiahao Li und Kumar Aditya in gh-122875.)Das Policy-System von
asyncioist veraltet und wird in Python 3.16 entfernt. Insbesondere die folgenden Klassen und Funktionen sind veraltet:Verwende
asyncio.run()oderasyncio.Runnermit loop_factory, um die gewünschte Implementierung der Ereignisschleife zu verwenden.Zum Beispiel, um
asyncio.SelectorEventLoopunter Windows zu verwenden:import asyncio async def main(): ... asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
(Beigetragen von Kumar Aditya in gh-127949.)
-
Die bitweise Invertierung boolescher Typen,
~Trueoder~False, ist seit Python 3.12 veraltet, da sie überraschende und unintuitive Ergebnisse liefert (-2und-1). Verwende stattdessennot xfür die logische Negation eines booleschen Werts. In dem seltenen Fall, dass du die bitweise Invertierung der zugrunde liegenden Ganzzahl benötigst, konvertiere explizit nachint(~int(x)).
-
Der Aufruf der Python-Implementierung von
functools.reduce()mit function oder sequence als Schlüsselwortargumenten ist seit Python 3.14 veraltet.
-
Die Unterstützung eigener Logging-Handler mit dem Argument strm ist veraltet und soll in Python 3.16 entfernt werden. Definiere Handler stattdessen mit dem Argument stream. (Beigetragen von Mariusz Felisiak in gh-115032.)
-
Gültige Endungen für
mimetypes.MimeTypes.add_type()beginnen mit einem „.“ oder sind leer. Endungen ohne Punkt sind veraltet und lösen in Python 3.16 einenValueErroraus. (Beigetragen von Hugo van Kemenade in gh-75223.)
-
Die Ausnahme
ExecErrorist seit Python 3.14 veraltet. Sie wird seit Python 3.4 von keiner Funktion inshutilmehr verwendet und ist jetzt ein Alias vonRuntimeError.
-
Die Methode
Class.get_methodsist seit Python 3.14 veraltet.
sys:Die Funktion
_enablelegacywindowsfsencoding()ist seit Python 3.13 veraltet. Verwende stattdessen die UmgebungsvariablePYTHONLEGACYWINDOWSFSENCODING.
-
Die Funktion
sysconfig.expand_makefile_vars()ist seit Python 3.14 veraltet. Verwende stattdessen das Argumentvarsvonsysconfig.get_paths().
-
Das undokumentierte und ungenutzte Attribut
TarFile.tarfileist seit Python 3.13 veraltet.
Geplante Entfernung in Python 3.17¶
-
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.ByteStringsoll in Python 3.17 entfernt werden.Verwende
isinstance(obj, collections.abc.Buffer), um zur Laufzeit zu prüfen, obobjdas Buffer-Protokoll implementiert. Für Typannotationen verwende entwederBufferoder eine Union, die explizit die von deinem Code unterstützten Typen angibt (z. B.bytes | bytearray | memoryview).ByteStringwar ursprünglich als abstrakte Klasse gedacht, die als Obertyp sowohl vonbytesals auch vonbytearraydienen sollte. Da die ABC jedoch nie Methoden hatte, sagte das Wissen, dass ein Objekt eine Instanz vonByteStringist, nie etwas Nützliches über das Objekt aus. Andere gängige Puffertypen wiememoryviewwurden ebenfalls nie als Untertypen vonByteStringverstanden (weder zur Laufzeit noch von statischen Typprüfern).Weitere Details findest du in PEP 688. (Beigetragen von Shantanu Jain in gh-91896.)
-
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.)
-
Das Modul
profileist veraltet und wird in Python 3.17 entfernt. Verwende stattdessenprofiling.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.MacOSXOSAScriptist zugunsten vonwebbrowser.MacOSveraltet. (gh-137586)
-
Vor Python 3.14 wurden Unions im alten Stil mit der privaten Klasse
typing._UnionGenericAliasimplementiert. 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 wietyping.get_origin()undtyping.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, obobjdas Buffer-Protokoll implementiert. Für Typannotationen verwende entwederBufferoder eine Union, die explizit die von deinem Code unterstützten Typen angibt (z. B.bytes | bytearray | memoryview).ByteStringwar ursprünglich als abstrakte Klasse gedacht, die als Obertyp sowohl vonbytesals auch vonbytearraydienen sollte. Da die ABC jedoch nie Methoden hatte, sagte das Wissen, dass ein Objekt eine Instanz vonByteStringist, nie etwas Nützliches über das Objekt aus. Andere gängige Puffertypen wiememoryviewwurden ebenfalls nie als Untertypen vonByteStringverstanden (weder zur Laufzeit noch von statischen Typprüfern).Weitere Details findest du in PEP 688. (Beigetragen von Shantanu Jain in gh-91896.)
-
Bei
tkinter.Variablesollen die seit Python 3.14 veralteten Methodentrace_variable(),trace()(ein Alias vontrace_variable()),trace_vdelete()undtrace_vinfo()in Python 3.17 entfernt werden. Verwende stattdessentrace_add(),trace_remove()undtrace_info(). (Beigetragen von Serhiy Storchaka in gh-120220.)
Geplante Entfernung in Python 3.18¶
Geplante Entfernung in Python 3.19¶
-
Bei Konstruktoren von Hash-Funktionen wie
new()oder den direkt nach dem Hash benannten Konstruktoren wiemd5()undsha256()konnte dem optionalen Parameter für die Anfangsdaten in verschiedenen Implementierungen vonhashlibauch ein Schlüsselwortargument namensdata=oderstring=übergeben werden.Die Unterstützung des Schlüsselwortarguments
stringist jetzt veraltet und soll in Python 3.19 entfernt werden.Vor Python 3.13 wurde der Schlüsselwortparameter
stringje 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.Morsel.js_output()ist veraltet und wird in Python 3.19 entfernt.http.cookies.BaseCookie.js_output()ist veraltet und wird in Python 3.19 entfernt.
-
Das Ändern von
IMAP4.fileist 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()undreadline()vonIMAP4zu implementieren; das ist seitdem nicht mehr der Fall.
Geplante Entfernung in Python 3.20¶
Der Aufruf der Methode
__new__()vonstruct.Structohne das Argument format ist veraltet und wird in Python 3.20 entfernt. Der Aufruf der Methode__init__()auf bereits initialisierten Objekten vom TypStructist veraltet und wird in Python 3.20 entfernt.(Beigetragen von Sergey B Kirpichev und Serhiy Storchaka in gh-143715.)
Die Attribute
__version__,versionundVERSIONsind in diesen Modulen der Standardbibliothek veraltet und werden in Python 3.20 entfernt. Verwende stattdessensys.version_info.ctypes.macholibdecimal(stattdessendecimal.SPEC_VERSIONverwenden)logging(__date__ist ebenfalls veraltet)xml.sax.expatreader
(Beigetragen von Hugo van Kemenade und Stan Ulbrych in gh-76007.)
Durch PEP 829 festgelegte Abkündigungen:
Für Zeilen mit
importin Dateien vom Typname.pthwerden Warnungen ausgegeben.Dateien vom Typ
name.pthwerden standardmäßig nicht mehr in der Kodierung des Gebietsschemas dekodiert. Sie MÜSSEN inutf-8-sigkodiert sein.
(Beigetragen von Barry Warsaw in gh-148641.)
ast:Das Erzeugen von Instanzen abstrakter AST-Knoten (etwa
ast.ASToderast.expr) ist veraltet und wird in Python 3.20 einen Fehler auslösen.
-
Es ist veraltet, Prüfungen mit
isinstance()undissubclass()auf Protokollklassen anzuwenden, die nicht explizit mitruntime_checkable()dekoriert sind, aber von einer zur Laufzeit prüfbaren Protokollklasse erben. In Python 3.20 wird dies einenTypeErrorauslösen.(Beigetragen von Bartosz Sławecki in gh-132604.)
Geplante Entfernung in zukünftigen Versionen¶
Die folgenden APIs werden in Zukunft entfernt, auch wenn derzeit noch kein Termin für ihre Entfernung feststeht.
-
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.FileTypeist veraltet.
-
Generatoren: Die Signatur
throw(type, exc, tb)undathrow(type, exc, tb)ist veraltet: Verwende stattdessenthrow(exc)undathrow(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örterand,else,for,if,in,isundorfolgt. 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 vonintzurückgeben.Unterstützung dafür, dass die Methode
__float__()eine strikte Unterklasse vonfloatzurückgibt: Diese Methoden müssen künftig eine Instanz vonfloatzurückgeben.Unterstützung dafür, dass die Methode
__complex__()eine strikte Unterklasse voncomplexzurückgibt: Diese Methoden müssen künftig eine Instanz voncomplexzurü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 Konstantencalendar.Januaryundcalendar.Februarysind veraltet und werden durchcalendar.JANUARYundcalendar.FEBRUARYersetzt. (Beigetragen von Prince Roshan in gh-103636.)codecs: Verwendeopen()stattcodecs.open(). (gh-133038)codeobject.co_lnotab: Verwende stattdessen die Methodecodeobject.co_lines().-
utcnow(): Verwendedatetime.datetime.now(tz=datetime.UTC).utcfromtimestamp(): Verwendedatetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC).
gettext: Der Pluralwert muss eine Ganzzahl sein.-
cache_from_source(): Der Parameter debug_override ist veraltet: Verwende stattdessen den Parameter optimization.
-
Die Tupel-Schnittstelle von
EntryPoints.Implizites
Nonebei Rückgabewerten.
logging: Die Methodewarn()ist seit Python 3.3 veraltet, verwende stattdessenwarning().mailbox: Die Verwendung von StringIO-Eingaben und Textmodus ist veraltet, verwende stattdessen BytesIO und Binärmodus.os: Der Aufruf vonos.register_at_fork()in einem Prozess mit mehreren Threads.os.path:os.path.commonprefix()ist veraltet, verwendeos.path.commonpath()für Pfadpräfixe. Die Funktionos.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 vonrmtree()ist seit Python 3.12 veraltet; verwende stattdessen den Parameter onexc.Optionen und Protokolle von
ssl:ssl.SSLContextohne Protokollargument ist veraltet.ssl.SSLContext:set_npn_protocols()undselected_npn_protocol()sind veraltet: Verwende stattdessen ALPN.Optionen
ssl.OP_NO_SSL*Optionen
ssl.OP_NO_TLS*ssl.PROTOCOL_SSLv3ssl.PROTOCOL_TLSssl.PROTOCOL_TLSv1ssl.PROTOCOL_TLSv1_1ssl.PROTOCOL_TLSv1_2ssl.TLSVersion.SSLv3ssl.TLSVersion.TLSv1ssl.TLSVersion.TLSv1_1
Methoden von
threading:threading.Condition.notifyAll(): Verwendenotify_all().threading.Event.isSet(): Verwendeis_set().threading.Thread.isDaemon(),threading.Thread.setDaemon(): Verwende das Attributthreading.Thread.daemon.threading.Thread.getName(),threading.Thread.setName(): Verwende das Attributthreading.Thread.name.threading.currentThread(): Verwendethreading.current_thread().threading.activeCount(): Verwendethreading.active_count().
Die interne Klasse
typing._UnionGenericAliaswird nicht mehr zur Implementierung vontyping.Unionverwendet. 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 nichtNoneist.Veraltete Funktionen in
urllib.parse: Verwende stattdessenurlparse()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 einesElementist veraltet. In einer künftigen Version wird es immerTruezurückgeben. Verwende stattdessen explizite Prüfungen mitlen(elem)oderelem is not None.sys._clear_type_cache()ist veraltet: Verwende stattdessensys._clear_internal_caches().
Sanfte Abkündigungen¶
Es ist nicht geplant, sanft abgekündigte APIs zu entfernen.
re.match()undre.Pattern.match()sind jetzt sanft abgekündigt, zugunsten der neuen APIsre.prefixmatch()undre.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 weiterhinmatch()verwenden, während neuer Codeprefixmatch()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 Modulsstructist jetzt sanft abgekündigt zugunsten der zweibuchstabigen Formen'Zf'und'Zd'. (Beigetragen von Sergey B Kirpichev in gh-121249.)
Änderungen an der C-API¶
Neue Features¶
Funktionen
PyArg_ParseArray()undPyArg_ParseArrayAndKeywords()hinzugefügt, um Argumente von Funktionen mit der AufrufkonventionMETH_FASTCALLzu parsen. (Beigetragen von Victor Stinner in gh-144175.)Die folgenden Funktionen für den neuen Typ
frozendicthinzugefügt:(Beigetragen von Victor Stinner in gh-141510.)
Funktion
PyObject_CallFinalizerFromDealloc()zur eingeschränkten C-API hinzugefügt. (Beigetragen von Victor Stinner in gh-146063.)Funktionen
PySys_GetAttr(),PySys_GetAttrString(),PySys_GetOptionalAttr()undPySys_GetOptionalAttrString()als Ersatz fürPySys_GetObject()hinzugefügt. (Beigetragen von Serhiy Storchaka in gh-108512.)PyUnstable_Unicode_GET_CACHED_HASH()hinzugefügt, um den zwischengespeicherten Hash einer Zeichenkette abzurufen. Einschränkungen sind in der Dokumentation beschrieben. (Beigetragen von Petr Viktorin in gh-131510.)API zur Prüfung der ABI-Kompatibilität eines Erweiterungsmoduls hinzugefügt:
Py_mod_abi,PyABIInfo_Check()undPyABIInfo_VAR. (Beigetragen von Petr Viktorin in gh-137210.)
PEP 782, die PyBytesWriter-API, implementiert. Neue Funktionen:
(Beigetragen von Victor Stinner in gh-129813.)
PyCriticalSectionund zugehörige Funktionen wurden zur stabilen ABI hinzugefügt. (Beigetragen von Petr Viktorin in gh-149225.)Neue C-API
PyImport_CreateModuleFromInitfunc()zum Erzeugen eines Moduls aus spec und initfunc hinzugefügt. (Beigetragen von Itamar Oren in gh-116146.)PyTuple_FromArray()hinzugefügt, um eintupleaus einem Array zu erzeugen. (Beigetragen von Victor Stinner in gh-111489.)Neuen Export-Hook für Module hinzugefügt:
PyModExport_*.Funktionen hinzugefügt, die garantiert sicher in Handlern für
tp_traverseverwendet werden können:PyObject_GetTypeData_DuringGC(),PyObject_GetItemData_DuringGC(),PyType_GetModuleState_DuringGC(),PyModule_GetState_DuringGC(),PyModule_GetToken_DuringGC(),PyType_GetBaseByToken_DuringGC(),PyType_GetModule_DuringGC(),PyType_GetModuleByToken_DuringGC(). (Beigetragen von Petr Viktorin in gh-145925.)PyObject_Dump()hinzugefügt, um ein Objekt nachstderrauszugeben. Sie sollte nur zum Debuggen verwendet werden. (Beigetragen von Victor Stinner in gh-141070.)PEP 820 implementiert:
PySlot– Einheitliches Slot-System für die C-API. Die Dokumentation findest du unter Definition slots.Dies fügt hinzu:
Die Struktur
PySlot;die Funktion
PyType_FromSlots();neue Slot-IDs:
Py_slot_end,Py_slot_invalid;Py_slot_subslots,Py_tp_slots,Py_mod_slots;Py_tp_name,Py_tp_basicsize,Py_tp_extra_basicsize,Py_tp_itemsize,Py_tp_flags,Py_tp_metaclass,Py_tp_module;Hilfsmakros:
PySlot_DATA,PySlot_FUNC,PySlot_SIZE,PySlot_INT64,PySlot_UINT64,PySlot_STATIC_DATA,PySlot_END,PySlot_PTR,PySlot_PTR_STATIC.
Die Funktion
PyModule_FromSlotsAndSpec()und derPyModExportExport-Hook für Module verwenden ebenfalls die neue StrukturPySlot.Die folgenden Funktionen sind sanft abgekündigt:
Die Slots
Py_tp_basesundPy_tp_basesind jetzt gleichwertig: Sie können entweder auf einen einzelnen Typ oder auf ein Tupel von Typen gesetzt werden. Der SlotPy_tp_baseswird bevorzugt; der andere wird ignoriert, wenn beide angegeben sind.(Beigetragen von Petr Viktorin in gh-149044.)
Funktionen
PyUnstable_ThreadState_SetStackProtection()undPyUnstable_ThreadState_ResetStackProtection()hinzugefügt, um die Basisadresse und die Größe des Stackschutzes eines Python-Thread-Zustands festzulegen. (Beigetragen von Victor Stinner in gh-139653.)C-API-Funktion
PyUnstable_SetImmortal()hinzugefügt, um Objekte als unsterblich zu markieren. (Beigetragen von Kumar Aditya in gh-143300.)Die private, vorläufige Funktion
_Py_InitializeMain(), die in Python 3.14 entfernt worden war, wurde wiederhergestellt. (Beigetragen von Victor Stinner in gh-142417.)Funktionen
PyUnstable_DumpTraceback()undPyUnstable_DumpTracebackThreads()hinzugefügt, um Python-Stacktraces auszugeben. (Beigetragen von Alex Malyshev in gh-145559.)
Geänderte C-APIs¶
Wenn das Flag
Py_TPFLAGS_MANAGED_DICToderPy_TPFLAGS_MANAGED_WEAKREFgesetzt ist, muss auchPy_TPFLAGS_HAVE_GCgesetzt sein. (Beigetragen von Sergey Miryanov in gh-134786.)PyDateTime_IMPORTist jetzt threadsicher. Code, derPyDateTimeAPIdirekt aufNULLprüft, sollte so geändert werden, dass er stattdessenPyDateTime_IMPORTaufruft. (Beigetragen von Kumar Aditya in gh-141563.)
Entfernte C-APIs¶
Veraltete Funktionen von
PyUnicodeentfernt:PyUnicode_AsDecodedObject(): Verwende stattdessenPyCodec_Decode().PyUnicode_AsDecodedUnicode(): Verwende stattdessenPyCodec_Decode(); beachte, dass manche Codecs (zum Beispiel „base64“) einen anderen Typ alsstrzurückgeben können, etwabytes.PyUnicode_AsEncodedObject(): Verwende stattdessenPyCodec_Encode().PyUnicode_AsEncodedUnicode(): Verwende stattdessenPyCodec_Encode(); beachte, dass manche Codecs (zum Beispiel „base64“) einen anderen Typ alsbyteszurückgeben können, etwastr.
(Beigetragen von Stan Ulbrych in gh-133612.)
PyImport_ImportModuleNoBlock(): veralteter Alias vonPyImport_ImportModule(). (Beigetragen von Bénédikt Tran in gh-133644.)PyWeakref_GetObject()undPyWeakref_GET_OBJECT: Verwende stattdessenPyWeakref_GetRef(). Mit dem pythoncapi-compat project lässt sichPyWeakref_GetRef()unter Python 3.12 und älter nutzen. (Beigetragen von Bénédikt Tran in gh-133644.)Das veraltete
PySys_ResetWarnOptions()entfernt. Leere stattdessensys.warnoptionsundwarnings.filters.(Beigetragen von Nikita Sobolev in gh-138886.)
Die folgenden Funktionen wurden zugunsten von PyConfig_Get() entfernt. Mit dem pythoncapi-compat project lässt sich PyConfig_Get() unter Python 3.13 und älter nutzen.
Funktionen zur Initialisierung von Python:
Py_GetExecPrefix(): Verwende stattdessenPyConfig_Get("base_exec_prefix")(sys.base_exec_prefix). VerwendePyConfig_Get("exec_prefix")(sys.exec_prefix), wenn virtuelle Umgebungen berücksichtigt werden müssen.Py_GetPath(): Verwende stattdessenPyConfig_Get("module_search_paths")(sys.path).Py_GetPrefix(): Verwende stattdessenPyConfig_Get("base_prefix")(sys.base_prefix). VerwendePyConfig_Get("prefix")(sys.prefix), wenn virtuelle Umgebungen berücksichtigt werden müssen.Py_GetProgramFullPath(): Verwende stattdessenPyConfig_Get("executable")(sys.executable).Py_GetProgramName(): Verwende stattdessenPyConfig_Get("executable")(sys.executable).Py_GetPythonHome(): Verwende stattdessenPyConfig_Get("home")oder die UmgebungsvariablePYTHONHOME.
(Beigetragen von Bénédikt Tran in gh-133644.)
Veraltete C-APIs¶
Die Unterstützung aus PEP 456 für eine externe Definition des Hash-Verfahrens für Zeichenketten ist veraltet. Die Entfernung ist für Python 3.19 geplant.
Bisher konnten Einbettende
Py_HASH_ALGORITHMaufPy_HASH_EXTERNALsetzen, um anzugeben, dass das Hash-Verfahren extern bereitgestellt wird. Diese Funktion war jedoch undokumentiert, ungetestet und wurde höchstwahrscheinlich nicht verwendet.(Beigetragen von Bénédikt Tran in gh-141226.)
Bei vorzeichenlosen Ganzzahlformaten in
PyArg_ParseTuple()ist es jetzt veraltet, Python-Ganzzahlen zu akzeptieren, deren Wert größer als der Maximalwert des C-Typs oder kleiner als der Minimalwert des entsprechenden vorzeichenbehafteten Ganzzahltyps gleicher Größe ist. (Beigetragen von Serhiy Storchaka in gh-132629.)PyBytes_FromStringAndSize(NULL, len)und_PyBytes_Resize()sind sanft abgekündigt; verwende stattdessen die APIPyBytesWriter. (Beigetragen von Victor Stinner in gh-129813.)_PyObject_CallMethodId(),_PyObject_GetAttrId()und_PyUnicode_FromId()sind seit Python 3.15 veraltet und werden in Python 3.20 entfernt. Verwende stattdessenPyUnicode_InternFromString(), speichere das Ergebnis im Modulzustand zwischen und rufe dannPyObject_CallMethod()oderPyObject_GetAttr()auf. (Beigetragen von Victor Stinner in gh-141049.)Das Feld
cvaldes TypsPyComplexObjectist veraltet. VerwendePyComplex_AsCComplex()undPyComplex_FromCComplex(), um eine komplexe Python-Zahl in die C-DarstellungPy_complexbzw. aus ihr zu konvertieren. (Beigetragen von Sergey B Kirpichev in gh-128813.)Die Funktionen
_Py_c_sum(),_Py_c_diff(),_Py_c_neg(),_Py_c_prod(),_Py_c_quot(),_Py_c_pow()und_Py_c_abs()sind sanft abgekündigt. (Beigetragen von Sergey B Kirpichev in gh-128813.)bytes_warningist seit Python 3.15 veraltet und wird in Python 3.17 entfernt. (Beigetragen von Nikita Sobolev in gh-136355.)Das Makro
Py_INFINITYist sanft abgekündigt; verwende stattdessen das<math.h>INFINITYdes C11-Standards. (Beigetragen von Sergey B Kirpichev in gh-141004.)Die folgenden Makros sind sanft abgekündigt:
Py_ALIGNED: Verwende stattdessenalignas.PY_FORMAT_SIZE_T: Verwende direkt"z".PY_LONG_LONG,PY_LLONG_MIN,PY_LLONG_MAX,PY_ULLONG_MAX,PY_INT32_T,PY_UINT32_T,PY_INT64_T,PY_UINT64_T,PY_SIZE_MAX: Verwende die Typen und Grenzwerte von C99.Py_UNICODE_SIZE: Verwende direktsizeof(wchar_t).Py_VA_COPY: Verwende direktva_copy.
Das Makro
Py_UNICODE_WIDE, dessen Entfernung geplant war, ist stattdessen sanft abgekündigt.(Beigetragen von Petr Viktorin in gh-146175.)
Py_MATH_ElundPy_MATH_PIlsind seit Python 3.15 veraltet und werden in Python 3.20 entfernt. (Beigetragen von Sergey B Kirpichev in gh-141004.)
Änderungen am Build¶
Der implizite Rückgriff auf die mitgelieferte Kopie der Bibliothek
libmpdecwurde entfernt. Er muss jetzt explizit aktiviert werden, indem--with-system-libmpdecaufnogesetzt oder--without-system-libmpdecangegeben wird. (Beigetragen von Sergey B Kirpichev in gh-115119.)Mit der neuen configure-Option
--with-missing-stdlib-config=FILEkö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-hugepagesaktiviert 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 verwendetMAP_HUGETLB(Linux) oderMEM_LARGE_PAGES(Windows) mit automatischem Rückgriff auf normale Seiten. Unter Windows verwendebuild.bat --pymalloc-hugepages. Zur Laufzeit müssen Huge Pages explizit aktiviert werden, indem die UmgebungsvariablePYTHON_PYMALLOC_HUGEPAGESauf1gesetzt 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>/mapssichtbar, wenn der Kernel das Feature unterstützt und Python mit-X devgestartet 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-pointerund ähnliche Flags zuCFLAGShinzu. 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.Connectionwurden bereinigt.Alle Parameter von
sqlite3.connect()außer database sind jetzt reine Schlüsselwortparameter.Die ersten drei Parameter der Methoden
create_function()undcreate_aggregate()sind jetzt reine Positionsparameter.Der erste Parameter der Methoden
set_authorizer(),set_progress_handler()undset_trace_callback()ist jetzt ein reiner Positionsparameter.
(Beigetragen von Serhiy Storchaka in gh-133595.)
resource.RLIM_INFINITYist jetzt immer positiv. Die Übergabe eines negativen Ganzzahlwerts, der seinem alten Wert entsprach (etwa-1oder-3, je nach Plattform), anresource.setrlimit()undresource.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 einenSystemErrorauszulö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 Methodeclose()oder den Kontextmanagercontextlib.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. Beiadd_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 Argumentpadded=Trueoder verwendebase64.b64decode()mit dem Argumentaltchars=b'-_'(das funktioniert auch mit älteren Python-Versionen), um Padding vorauszusetzen. (Beigetragen von Serhiy Storchaka in gh-73613.)Da
unittest.TestCase.assertWarns()undunittest.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ätzlicheassertWarns*(), um sie abzufangen und zu prüfen. (Beigetragen von Serhiy Storchaka in gh-143231.)