Was ist neu in Python 3.13

Herausgeber:

Adam Turner und Thomas Wouters

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

Siehe auch

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

Zusammenfassung – Highlights des Releases

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

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

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

Dieser Artikel versucht nicht, eine vollständige Spezifikation aller neuen Features zu liefern, sondern gibt einen handlichen Überblick. Alle Einzelheiten stehen in der Dokumentation, etwa in der Bibliotheksreferenz und der Sprachreferenz. Um die vollständige Implementierung und die Entwurfsgründe einer Änderung zu verstehen, sieh im PEP zum jeweiligen neuen Feature nach. Beachte aber, dass PEPs in der Regel nicht mehr aktualisiert werden, sobald ein Feature vollständig umgesetzt ist. Hinweise zum Umstieg von früheren Python-Versionen findest du unter Portierung auf Python 3.13.


Verbesserungen am Interpreter:

Verbesserungen am Python-Datenmodell:

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

  • __firstlineno__ hält die erste Zeilennummer einer Klassendefinition fest.

Wesentliche Verbesserungen in der Standardbibliothek:

Verbesserungen bei der Sicherheit:

Verbesserungen der C-API:

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

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

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

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

Neue Typisierungsfunktionen:

Unterstützte Plattformen:

Wichtige Entfernungen:

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

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

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

  • Die Funktion locale.resetlocale() ist entfernt.

  • Die Namensräume typing.io und typing.re sind entfernt.

  • Verkettete classmethod-Deskriptoren sind entfernt.

Änderungen am Veröffentlichungszeitplan:

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

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

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

Neue Funktionen

Eine bessere interaktive Shell

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

  • Mehrzeiliges Bearbeiten mit erhaltener Chronik.

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

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

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

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

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

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

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

Verbesserte Fehlermeldungen

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

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

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

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

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

    (Beigetragen von Shantanu Jain in gh-95754.)

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

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

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

Free-Threaded CPython

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

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

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

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

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

Siehe auch

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

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

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

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

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

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

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

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

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

Die innere Architektur sieht grob so aus:

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

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

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

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

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

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

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

Siehe auch

PEP 744

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

Festgelegte Semantik für Änderungen an locals()

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

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

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

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

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

Unterstützung für mobile Plattformen

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

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

Siehe auch

PEP 730, PEP 738

Andere sprachliche Änderungen

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

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

    (Beigetragen von Inada Naoki in gh-81283.)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    (Beigetragen von Victor Stinner in gh-114570.)

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

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

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

Neue Module

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

Verbesserte Module

argparse

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

Array

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

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

ast

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

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

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

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

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

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

asyncio

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

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

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

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

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

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

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

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

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

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

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

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

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

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

base64

compileall

concurrent.futures

configparser

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

copy

ctypes

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

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

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

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

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

dbm

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

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

dis

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

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

doctest

email

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

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

enum

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

fractions

glob

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

importlib

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

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

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

io

ipaddress

itertools

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

marshal

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

math

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

mimetypes

mmap

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

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

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

multiprocessing

os

os.path

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

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

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

pathlib

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

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

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

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

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

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

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

pdb

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

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

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

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

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

queue

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

random

re

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

shutil

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

site

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

sqlite3

ssl

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

    Bemerkung

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

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

    (Beigetragen von William Woodruff in gh-112389.)

statistics

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

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

subprocess

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

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

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

sys

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

tempfile

time

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

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

tkinter

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

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

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

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

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

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

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

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

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

Traceback

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

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

types

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

typing

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

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

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

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

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

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

unicodedata

venv

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

warnings

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

xml

zipimport

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

Optimierungen

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

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

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

Entfernte Module und APIs

PEP 594: „leere Batterien“ aus der Standardbibliothek entfernt

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

  • aifc

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

  • audioop

    • audioop-lts: Verwende die Bibliothek audioop-lts von PyPI.

  • chunk

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

  • cgi und cgitb

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

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

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

      from email.message import EmailMessage
      
      msg = EmailMessage()
      msg['content-type'] = 'application/json; charset="utf8"'
      main, params = msg.get_content_type(), msg['content-type'].params
      
    • cgi.parse_multipart() lässt sich durch die Funktionalität des Pakets email ersetzen, das dieselben MIME-RFCs umsetzt, oder durch die Bibliothek multipart. Zum Beispiel durch die Klassen email.message.EmailMessage und email.message.Message.

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

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

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

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

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

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

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

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

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

  • mailcap: Verwende stattdessen das Modul mimetypes.

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

  • msilib

  • nis

  • nntplib: Verwende stattdessen die Bibliothek pynntp von PyPI.

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

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

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

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

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

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

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

  • sunau

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

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

  • uu: Verwende als neuzeitliche Alternative stattdessen das Modul base64.

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

  • xdrlib

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

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

2to3

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

builtins

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

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

configparser

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

importlib.metadata

locale

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

opcode

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

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

optparse

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

pathlib

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

re

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

tkinter.tix

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

turtle

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

typing

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

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

unittest

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

    • unittest.findTestCases()

    • unittest.makeSuite()

    • unittest.getTestCaseNames()

    Verwende stattdessen die Methoden von TestLoader:

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

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

urllib

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

webbrowser

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

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

Neu als veraltet markiert

  • Selbst definierte Funktionen:

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

  • array:

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

  • ctypes:

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

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

  • decimal:

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

  • dis:

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

  • gettext:

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

  • glob:

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

  • http.server:

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

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

  • mimetypes:

  • re:

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

  • pathlib:

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

  • platform:

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

  • pydoc:

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

  • sqlite3

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

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

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

  • sys:

  • tarfile:

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

  • traceback:

  • typing:

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

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

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

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

  • wave:

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

Geplante Entfernung in Python 3.14

  • argparse: Die Parameter type, choices und metavar von argparse.BooleanOptionalAction sind veraltet und werden in Version 3.14 entfernt. (Beitrag von Nikita Sobolev unter gh-92248.)

  • ast: Die folgenden Funktionen sind seit Python 3.8 in der Dokumentation als veraltet gekennzeichnet, lösen nun bei Zugriff oder Verwendung zur Laufzeit eine „ DeprecationWarning “ aus und werden in Python 3.14 entfernt:

    • ast.Num

    • ast.Str

    • ast.Bytes

    • ast.NameConstant

    • ast.Ellipsis

    Verwende stattdessen ast.Constant. (Beigetragen von Serhiy Storchaka in gh-90953.)

  • asyncio:

    • Die „Child-Watcher“-Klassen asyncio.MultiLoopChildWatcher, asyncio.FastChildWatcher, asyncio.AbstractChildWatcher und asyncio.SafeChildWatcher sind veraltet und werden in Python 3.14 entfernt. (Beitrag von Kumar Aditya unter gh-94597.)

    • asyncio.set_child_watcher(), asyncio.get_child_watcher(), asyncio.AbstractEventLoopPolicy.set_child_watcher() und asyncio.AbstractEventLoopPolicy.get_child_watcher() sind veraltet und werden in Python 3.14 entfernt. (Beitrag von Kumar Aditya unter gh-94597.)

    • Die Methode „ get_event_loop() “ der Standard-Ereignisschleifenrichtlinie löst nun eine „ DeprecationWarning “ aus, wenn derzeit keine Ereignisschleife festgelegt ist und sie beschließt, eine solche zu erstellen. (Beitrag von Serhiy Storchaka und Guido van Rossum unter gh-100160.)

  • email: Der Parameter isdst in email.utils.localtime() wurde als veraltet markiert. (Beitrag von Alan Williams unter gh-72346.)

  • importlib.abc veraltete Klassen:

    • importlib.abc.ResourceReader

    • importlib.abc.Traversable

    • importlib.abc.TraversableResources

    Verwende stattdessen importlib.resources.abc Klassen:

    (Beigetragen von Jason R. Coombs und Hugo van Kemenade in gh-93963.)

  • itertools boten eine undokumentierte, ineffiziente, seit jeher fehleranfällige und inkonsistente Unterstützung für copy-, deepcopy- und pickle-Operationen. Diese wird in Version 3.14 entfernt, um den Codeumfang und den Wartungsaufwand deutlich zu reduzieren. (Beitrag von Raymond Hettinger unter gh-101588.)

  • multiprocessing: Die Standard-Startmethode wird unter Linux, BSD und anderen POSIX-Plattformen, die nicht macOS sind, auf eine sicherere Variante umgestellt, sofern dort derzeit „ 'fork' “ als Standard eingestellt ist (gh-84559). Das Hinzufügen einer Laufzeitwarnung hierzu wurde als zu störend erachtet, da davon ausgegangen wird, dass dies für den Großteil des Codes keine Rolle spielt. Verwende die APIs „ get_context() “ oder „ set_start_method() “, um explizit anzugeben, wann dein Code „ 'fork' “ erfordert. Siehe Contexts and start methods.

  • pathlib: is_relative_to() und relative_to(): Die Übergabe zusätzlicher Argumente ist veraltet.

  • pkgutil: „ pkgutil.find_loader() “ und „ pkgutil.get_loader() “ lösen nun eine „ DeprecationWarning “-Fehlermeldung aus. Verwende stattdessen „ importlib.util.find_spec() “. (Beitrag von Nikita Sobolev unter gh-97850.)

  • pty:

  • sqlite3

  • urllib: „ urllib.parse.Quoter “ ist veraltet: Es war nicht als öffentliche API vorgesehen. (Beitrag von Gregory P. Smith unter gh-88168.)

Geplante Entfernung in Python 3.15

  • Das Importsystem:

    • __cached__ an einem Modul zu setzen, ohne __spec__.cached zu setzen, ist als veraltet markiert. In Python 3.15 wird __cached__ vom Importsystem und von der Standardbibliothek nicht mehr gesetzt und nicht mehr berücksichtigt. (gh-97879)

    • __package__ an einem Modul zu setzen, ohne __spec__.parent zu setzen, ist als veraltet markiert. In Python 3.15 wird __package__ vom Importsystem und von der Standardbibliothek nicht mehr gesetzt und nicht mehr berücksichtigt. (gh-97879)

  • ctypes:

    • Die nicht dokumentierte Funktion ctypes.SetPointerType() ist seit Python 3.13 als veraltet markiert.

  • http.server:

    • Die überholte und selten verwendete Klasse CGIHTTPRequestHandler ist seit Python 3.13 als veraltet markiert. Es gibt keinen unmittelbaren Ersatz. Alles ist besser als CGI, um einen Webserver an einen Request-Handler anzubinden.

    • Der Schalter --cgi der Befehlszeilenschnittstelle python -m http.server ist seit Python 3.13 als veraltet markiert.

  • importlib:

    • Methode load_module(): verwende stattdessen exec_module().

  • pathlib:

    • .PurePath.is_reserved() ist seit Python 3.13 als veraltet markiert. Verwende os.path.isreserved(), um unter Windows vorbehaltene Pfade zu erkennen.

  • platform:

    • platform.java_ver() ist seit Python 3.13 als veraltet markiert. Diese Funktion ist nur für die Unterstützung von Jython nützlich, hat eine verwirrende API und ist kaum getestet.

  • sysconfig:

  • threading:

    • RLock() nimmt in Python 3.15 keine Argumente mehr an. Argumente zu übergeben ist seit Python 3.14 als veraltet markiert, denn die Python-Fassung erlaubt keine Argumente, während die C-Fassung beliebig viele positionsbezogene oder Schlüsselwortargumente annimmt und sie alle übergeht.

  • types:

    • types.CodeType: Der Zugriff auf codeobject.co_lnotab wurde in PEP 626 seit 3.10 als veraltet markiert und sollte in 3.12 entfernt werden, bekam dort aber erst eine richtige DeprecationWarning. Entfernt werden kann er in 3.15. (Beigetragen von Nikita Sobolev in gh-101866.)

  • typing:

    • Die nicht dokumentierte Schreibweise mit Schlüsselwortargumenten, um NamedTuple-Klassen zu erzeugen (zum Beispiel Point = NamedTuple("Point", x=int, y=int)), ist seit Python 3.13 als veraltet markiert. Verwende stattdessen die klassenbasierte oder die funktionale Schreibweise.

    • Bei der funktionalen Schreibweise von TypedDicts ist es seit Python 3.13 als veraltet markiert, dem Parameter fields keinen Wert zu übergeben (TD = TypedDict("TD")) oder None zu übergeben (TD = TypedDict("TD", None)). Verwende class TD(TypedDict): pass oder TD = TypedDict("TD", {}), um ein TypedDict ohne Felder zu erzeugen.

    • Die Dekoratorfunktion @typing.no_type_check_decorator ist seit Python 3.13 als veraltet markiert. Nach acht Jahren im Modul typing wird sie noch von keinem größeren Typprüfer unterstützt.

  • Module sre_compile, sre_constants und sre_parse.

  • wave:

    • Die Methoden getmark(), setmark() und getmarkers() der Klassen Wave_read und Wave_write sind seit Python 3.13 als veraltet markiert.

  • zipimport:

    • zipimport.zipimporter.load_module() ist seit Python 3.10 als veraltet markiert. Verwende stattdessen exec_module(). (gh-125746.)

Geplante Entfernung in Python 3.16

Geplante Entfernung in Python 3.17

  • datetime:

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

  • collections.abc:

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

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

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

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

  • encodings:

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

  • profile:

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

  • webbrowser:

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

  • typing:

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

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

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

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

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

  • tkinter:

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

Geplante Entfernung in Python 3.18

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

  • decimal:

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

  • Durch PEP 829 festgelegte Abkündigungen:

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

    (Beigetragen von Barry Warsaw in gh-148641.)

Geplante Entfernung in Python 3.19

  • ctypes:

    • Das implizite Umschalten auf das MSVC-kompatible Struct-Layout, wenn auf Nicht-Windows-Plattformen _pack_, aber nicht _layout_ gesetzt wird.

  • hashlib:

    • Bei Konstruktoren von Hash-Funktionen wie new() oder den direkt nach dem Hash benannten Konstruktoren wie md5() und sha256() konnte dem optionalen Parameter für die Anfangsdaten in verschiedenen Implementierungen von hashlib auch ein Schlüsselwortargument namens data= oder string= übergeben werden.

      Die Unterstützung des Schlüsselwortarguments string ist jetzt veraltet und soll in Python 3.19 entfernt werden.

      Vor Python 3.13 wurde der Schlüsselwortparameter string je nach Backend-Implementierung der Hash-Funktionen nicht korrekt unterstützt. Übergib die Anfangsdaten für die größtmögliche Abwärtskompatibilität am besten als Positionsargument.

  • http.cookies:

  • imaplib:

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

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

Geplante Entfernung in Python 3.20

Geplante Entfernung in zukünftigen Versionen

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

  • argparse:

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

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

    • Der Typkonverter argparse.FileType ist veraltet.

  • builtins:

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

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

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

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

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

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

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

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

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

  • datetime:

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

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

  • gettext: Der Pluralwert muss eine Ganzzahl sein.

  • importlib:

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

  • importlib.metadata:

    • Die Tupel-Schnittstelle von EntryPoints.

    • Implizites None bei Rückgabewerten.

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

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

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

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

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

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

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

  • Optionen und Protokolle von ssl:

    • ssl.SSLContext ohne Protokollargument ist veraltet.

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

    • Optionen ssl.OP_NO_SSL*

    • Optionen ssl.OP_NO_TLS*

    • ssl.PROTOCOL_SSLv3

    • ssl.PROTOCOL_TLS

    • ssl.PROTOCOL_TLSv1

    • ssl.PROTOCOL_TLSv1_1

    • ssl.PROTOCOL_TLSv1_2

    • ssl.TLSVersion.SSLv3

    • ssl.TLSVersion.TLSv1

    • ssl.TLSVersion.TLSv1_1

  • Methoden von threading:

  • typing.Text (gh-92332).

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

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

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

    • splitattr()

    • splithost()

    • splitnport()

    • splitpasswd()

    • splitport()

    • splitquery()

    • splittag()

    • splittype()

    • splituser()

    • splitvalue()

    • to_bytes()

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

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

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

Änderungen am Bytecode von CPython

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

C API Änderungen

Neue Funktionen

Geänderte C-APIs

Änderungen an der eingeschränkten C-API

Entfernte C-APIs

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

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

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

    • PyObject_AsCharBuffer(), PyObject_AsReadBuffer(): Verwende stattdessen PyObject_GetBuffer() und PyBuffer_Release():

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

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

    (Beigetragen von Inada Naoki in gh-85275.)

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

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

      Warnung

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

    • PyEval_CallFunction(): Verwende stattdessen PyObject_CallFunction().

    • PyEval_CallMethod(): Verwende stattdessen PyObject_CallMethod().

    • PyCFunction_Call(): Verwende stattdessen PyObject_Call().

    (Beigetragen von Victor Stinner in gh-105107.)

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

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

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

    (Beigetragen von Victor Stinner in gh-105182.)

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

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

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

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

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

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

Veraltete C-APIs

Geplante Entfernung in Python 3.14

Geplante Entfernung in Python 3.15

Geplante Entfernung in Python 3.16

  • Die mitgelieferte Kopie von libmpdec.

Geplante Entfernung in Python 3.18

Geplante Entfernung in zukünftigen Versionen

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

Build Änderungen

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

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

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

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

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

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

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

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

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

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

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

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

Portierung auf Python 3.13

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

Änderungen in der Python API

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

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

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

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

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

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

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

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

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

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

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

Änderungen an der C-API

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

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

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

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

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

    Eine tp_dealloc-Funktion mit den alten Makros, etwa:

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

    sollte folgendermaßen auf die neuen Makros umgestellt werden:

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

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

Änderungen an den Regressionstests

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