Was ist neu in Python 3.13

Herausgeber:

Adam Turner und Thomas Wouters

Dieser Artikel erklärt die neuen Funktionen in Python 3.13 im Vergleich zu 3.12. Python 3.13 wurde am 7. Oktober 2024 veröffentlicht. Vollständige Details finden Sie im Changelog.

Siehe auch

PEP 719 – Python 3.13 Release-Zeitplan

Zusammenfassung – Release-Highlights

Python 3.13 ist eine stabile Version der Python-Programmiersprache mit einer Mischung aus Änderungen an der Sprache, der Implementierung und der Standardbibliothek. Zu den wichtigsten Änderungen gehören ein neuer interaktiver Interpreter, experimentelle Unterstützung für den Betrieb in einem frei-threadfähigen Modus (PEP 703) und ein Just-In-Time Compiler (PEP 744).

Fehlermeldungen werden weiterhin verbessert, mit standardmäßig farblich hervorgehobenen Tracebacks. Die eingebaute Funktion locals() hat nun definierte Semantik für die Änderung der zurückgegebenen Zuordnung, und Typparameter unterstützen jetzt Standardwerte.

Die Bibliotheksänderungen enthalten die Entfernung von veralteten APIs und Modulen sowie die üblichen Verbesserungen in Bezug auf Benutzerfreundlichkeit und Korrektheit. Mehrere ältere Standardbibliotheksmodule wurden entfernt, nachdem sie in Python 3.11 als veraltet markiert wurden (PEP 594).

Dieser Artikel versucht nicht, eine vollständige Spezifikation aller neuen Funktionen zu liefern, sondern gibt stattdessen einen praktischen Überblick. Vollständige Details finden Sie in der Dokumentation, wie dem Bibliotheksreferenz und der Sprachreferenz. Um die vollständige Implementierung und die Designbegründung für eine Änderung zu verstehen, lesen Sie die PEP für eine bestimmte neue Funktion; beachten Sie jedoch, dass PEPs normalerweise nicht aktuell gehalten werden, sobald eine Funktion vollständig implementiert ist. Sehen Sie Porting zu Python 3.13 für Anleitungen zur Aktualisierung von früheren Python-Versionen.


Interpreter-Verbesserungen

Verbesserungen am Python-Datenmodell

  • __static_attributes__ speichert die Namen von Attributen, auf die über self.X in jeder Funktion im Klassenkörper zugegriffen wird.

  • __firstlineno__ zeichnet die Nummer der ersten Zeile einer Klassendefinition auf.

Signifikante Verbesserungen in der Standardbibliothek

Sicherheitsverbesserungen

C-API-Verbesserungen

  • Der Slot Py_mod_gil wird nun verwendet, um anzuzeigen, dass ein Erweiterungsmodul die Ausführung mit deaktiviertem GIL unterstützt.

  • Die PyTime C API wurde hinzugefügt und bietet Zugriff auf Systemuhren.

  • PyMutex ist eine neue leichtgewichtige Mutex, die ein einzelnes Byte belegt.

  • Es gibt eine neue Sammlung von Funktionen zur Generierung von PEP 669-Monitoring-Ereignissen in der C-API.

Neue Typ-Annotation-Funktionen

Plattformunterstützung

Wichtige Entfernungen

  • PEP 594: Die verbleibenden 19 „toten Batterien“ (ältere stdlib-Module) wurden aus der Standardbibliothek entfernt: aifc, audioop, cgi, cgitb, chunk, crypt, imghdr, mailcap, msilib, nis, nntplib, ossaudiodev, pipes, sndhdr, spwd, sunau, telnetlib, uu und xdrlib.

  • Entfernen Sie das Tool 2to3 und das Modul lib2to3 (veraltet in Python 3.11).

  • Entfernen Sie das Modul tkinter.tix (veraltet in Python 3.6).

  • Entfernen Sie die Funktion locale.resetlocale().

  • Entfernen Sie die Namensräume typing.io und typing.re.

  • Entfernen Sie verkettete classmethod-Deskriptoren.

Änderungen am Release-Zeitplan

PEP 602 („Annual Release Cycle for Python“) wurde aktualisiert, um den vollen Support-Zeitraum („Bugfix“) für neue Releases auf zwei Jahre zu verlängern. Diese aktualisierte Richtlinie bedeutet, dass

  • Python 3.9–3.12 haben anderthalb Jahre vollen Support, gefolgt von dreieinhalb Jahren Sicherheitspatches.

  • Python 3.13 und neuere Versionen haben zwei Jahre vollen Support, gefolgt von drei Jahren Sicherheitspatches.

Neue Funktionen

Ein besserer interaktiver Interpreter

Python verwendet nun standardmäßig eine neue interaktive Shell, basierend auf Code aus dem PyPy-Projekt. Wenn der Benutzer die REPL von einem interaktiven Terminal aus startet, werden nun folgende neue Funktionen unterstützt:

  • Mehrzeilige Bearbeitung mit Speicherung des Verlaufs.

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

  • Aufforderungen und Tracebacks mit standardmäßig aktivierter Farbe.

  • Interaktive Hilfe-Browsing mit F1 und einem separaten Befehlsverlauf.

  • Verlaufs-Browsing mit F2, das Ausgaben sowie die Aufforderungen >>> und überspringt.

  • „Paste Mode“ mit F3, der das Einfügen größerer Codeblöcke erleichtert (drücken Sie F3 erneut, um zum regulären Prompt zurückzukehren).

Um die neue interaktive Shell zu deaktivieren, setzen Sie die Umgebungsvariable PYTHON_BASIC_REPL. Weitere Informationen zum interaktiven Modus finden Sie unter Interaktiver Modus.

(Beigetragen von Pablo Galindo Salgado, Łukasz Langa und Lysandros Nikolaou in gh-111201 basierend auf Code aus dem PyPy-Projekt. Windows-Unterstützung von Dino Viehland und Anthony Shaw beigesteuert.)

Verbesserte Fehlermeldungen

  • Der Interpreter verwendet nun standardmäßig Farbe beim Anzeigen von Tracebacks im Terminal. Dieses Feature kann gesteuert werden über die neue Umgebungsvariable PYTHON_COLORS sowie die kanonischen Umgebungsvariablen NO_COLOR und FORCE_COLOR. (Beigetragen von Pablo Galindo Salgado in gh-112730.)

  • Ein häufiger Fehler ist es, ein Skript mit demselben Namen wie ein Standardbibliotheksmodul zu schreiben. Wenn dies zu Fehlern führt, geben wir nun eine hilfreichere Fehlermeldung aus.

    $ 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, wenn ein Skript denselben Namen wie ein Drittanbietermodul hat, das es zu importieren versucht, und dies zu Fehlern führt, geben wir ebenfalls eine hilfreichere Fehlermeldung aus.

    $ 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 nun, das korrekte Schlüsselwortargument vorzuschlagen, wenn ein falsches Schlüsselwortargument an eine Funktion ü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.)

Frei-threadfähiges CPython

CPython verfügt nun über experimentelle Unterstützung für den Betrieb im frei-threadfähigen Modus, wobei der Global Interpreter Lock (GIL) deaktiviert ist. Dies ist eine experimentelle Funktion und daher nicht standardmäßig aktiviert. Der frei-threadfähige Modus erfordert eine andere ausführbare Datei, die normalerweise python3.13t oder python3.13t.exe genannt wird. Vorinstallierte Binärdateien, die als frei-threadfähig gekennzeichnet sind, können als Teil der offiziellen Installer für Windows und macOS installiert werden, oder CPython kann aus dem Quellcode mit der Option --disable-gil erstellt werden.

Die frei-threadfähige Ausführung ermöglicht die volle Auslastung der verfügbaren Rechenleistung durch die parallele Ausführung von Threads auf verfügbaren CPU-Kernen. Obwohl nicht alle Software davon automatisch profitiert, werden Programme, die für Threading konzipiert sind, auf Multi-Core-Hardware schneller ausgeführt. **Der frei-threadfähige Modus ist experimentell** und es wird weiter daran gearbeitet, ihn zu verbessern: erwarten Sie einige Fehler und einen erheblichen Leistungsverlust im Single-Threaded-Betrieb. Frei-threadfähige Builds von CPython unterstützen die optionale Ausführung mit aktiviertem GIL zur Laufzeit über die Umgebungsvariable PYTHON_GIL oder die Kommandozeilenoption -X gil=1.

Um zu überprüfen, ob der aktuelle Interpreter frei-threading unterstützt, enthalten python -VV und sys.version den Hinweis „experimental free-threading build“. Die neue Funktion sys._is_gil_enabled() kann verwendet werden, um zu überprüfen, ob der GIL im laufenden Prozess tatsächlich deaktiviert ist.

C-API-Erweiterungsmodule müssen speziell für den frei-threadfähigen Build erstellt werden. Erweiterungen, die die Ausführung mit deaktiviertem GIL unterstützen, sollten den Slot Py_mod_gil verwenden. Erweiterungen, die eine einphasige Initialisierung verwenden, sollten PyUnstable_Module_SetGIL() verwenden, um anzugeben, ob sie die Ausführung mit deaktiviertem GIL unterstützen. Der Import von C-Erweiterungen, die diese Mechanismen nicht verwenden, führt zur Aktivierung des GIL, es sei denn, der GIL wurde explizit mit der Umgebungsvariable PYTHON_GIL oder der Kommandozeilenoption -X gil=0 deaktiviert. pip 24.1 oder neuer ist erforderlich, um Pakete mit C-Erweiterungen im frei-threadfähigen Build zu installieren.

Diese Arbeit wurde durch viele Einzelpersonen und Organisationen ermöglicht, darunter die große Community von Mitwirkenden an Python und Drittanbieterprojekten, die die Unterstützung für frei-threading getestet und ermöglicht haben. Bemerkenswerte Mitwirkende sind: Sam Gross, Ken Jin, Donghee Na, Itamar Oren, Matt Page, Brett Simmers, Dino Viehland, Carl Meyer, Nathan Goldbaum, Ralf Gommers, Lysandros Nikolaou und viele andere. Viele dieser Mitwirkenden sind bei Meta beschäftigt, das erhebliche technische Ressourcen 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 Informationen zu dieser Arbeit.

Porting Extension Modules to Support Free-Threading: Ein Community-geführter Portierungsleitfaden für Erweiterungsautoren.

Ein experimenteller Just-in-Time (JIT) Compiler

Wenn CPython mit der Option --enable-experimental-jit konfiguriert und erstellt wird, wird ein Just-in-Time (JIT) Compiler hinzugefügt, der einige Python-Programme beschleunigen kann. Unter Windows verwenden Sie PCbuild/build.bat --experimental-jit, um den JIT zu aktivieren, oder --experimental-jit-interpreter, um den Tier 2 Interpreter zu aktivieren. Build-Anforderungen und weitere unterstützende Informationen finden Sie unter Tools/jit/README.md.

Die Option --enable-experimental-jit akzeptiert diese (optionalen) Werte und standardmäßig yes, wenn --enable-experimental-jit ohne optionalen Wert vorhanden ist.

  • no: Deaktiviert die gesamte Tier 2- und JIT-Pipeline.

  • yes: Aktiviert den JIT. Um den JIT zur Laufzeit zu deaktivieren, übergeben Sie die Umgebungsvariable PYTHON_JIT=0.

  • yes-off: Erstellt den JIT, deaktiviert ihn aber standardmäßig. Um den JIT zur Laufzeit zu aktivieren, übergeben Sie die Umgebungsvariable PYTHON_JIT=1.

  • interpreter: Aktiviert den Tier 2 Interpreter, deaktiviert aber den JIT. Der Interpreter kann durch Ausführung mit PYTHON_JIT=0 deaktiviert werden.

Die interne Architektur ist ungefähr wie folgt:

  • Wir beginnen mit spezialisiertem Tier 1 Bytecode. Details finden Sie unter Was ist neu in 3.11.

  • Wenn der Tier 1 Bytecode heiß genug wird, wird er in eine neue rein interne Zwischenrepräsentation (IR) übersetzt, die als Tier 2 IR bezeichnet wird und manchmal auch als Micro-Ops („uops“) bezeichnet wird.

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

  • Wir haben mehrere Optimierungsdurchläufe für Tier 2 IR, die angewendet werden, bevor er interpretiert oder in Maschinencode übersetzt wird.

  • Es gibt einen Tier 2 Interpreter, aber er ist hauptsächlich für das Debugging der früheren Stufen der Optimierungspipeline gedacht. Der Tier 2 Interpreter kann durch Konfiguration von Python mit --enable-experimental-jit=interpreter aktiviert werden.

  • Wenn der JIT aktiviert ist, wird die optimierte Tier 2 IR in Maschinencode übersetzt, der dann ausgeführt wird.

  • Der Maschinencode-Übersetzungsprozess verwendet eine Technik namens Copy-and-Patch. Er hat keine Laufzeitabhängigkeiten, aber es gibt eine neue Build-Abhängigkeit von LLVM.

Siehe auch

PEP 744

(JIT von Brandt Bucher, inspiriert von einem Paper von Haoran Xu und Fredrik Kjolstad. Tier 2 IR von Mark Shannon und Guido van Rossum. Tier 2 Optimizer von Ken Jin.)

Definierte Mutationssemantik für locals()

Historisch gesehen war das erwartete Ergebnis der Mutation des Rückgabewerts von locals() individuellen Python-Implementierungen überlassen. Ab Python 3.13 standardisiert PEP 667 das historische Verhalten von CPython für die meisten Codeausführungsumgebungen, ändert jedoch optimierte Umgebungen (Funktionen, Generatoren, Koroutinen, Comprehensions und Generatorausdrücke), um explizit unabhängige Schnappschüsse der aktuell zugewiesenen lokalen Variablen zurückzugeben, einschließlich lokal referenzierter nichtlokaler Variablen, die in Closures erfasst werden.

Diese Änderung der Semantik von locals() in optimierten Umgebungen wirkt sich auch auf das Standardverhalten von Codeausführungsfunktionen aus, die implizit auf locals() abzielen, wenn kein expliziter Namensraum bereitgestellt wird (wie exec() und eval()). In früheren Versionen war es implementierungsabhängig, ob Änderungen durch Aufruf von locals() nach dem Aufruf der Codeausführungsfunktion zugänglich waren. Insbesondere in CPython schien ein solcher Code normalerweise wie gewünscht zu funktionieren, konnte aber manchmal in optimierten Umgebungen fehlschlagen, basierend auf anderem Code (einschließlich Debuggern und Codeausführungs-Tracing-Tools), der den gemeinsamen Schnappschuss in dieser Umgebung möglicherweise zurücksetzte. Jetzt läuft der Code immer gegen einen unabhängigen Schnappschuss der lokalen Variablen in optimierten Umgebungen, und daher sind die Änderungen bei nachfolgenden Aufrufen von locals() niemals sichtbar. Um die in diesen Fällen vorgenommenen Änderungen abzurufen, muss jetzt ein expliziter Namensraumverweis an die entsprechende Funktion übergeben werden. Alternativ kann es sinnvoll sein, betroffenen Code zu aktualisieren, um eine Codeausführungs-API auf höherer Ebene zu verwenden, die den resultierenden Codeausführungsnamensraum zurückgibt (z. B. runpy.run_path() beim Ausführen von Python-Dateien von der Festplatte).

Um sicherzustellen, dass Debugger und ähnliche Tools lokale Variablen in Umgebungen, die von dieser Änderung betroffen sind, zuverlässig aktualisieren können, gibt FrameType.f_locals in diesen Umgebungen jetzt einen Write-Through-Proxy für die lokalen und lokal referenzierten nichtlokalen Variablen des Frames zurück, anstatt eine inkonsistent aktualisierte freigegebene dict-Instanz mit undefinierten Laufzeitssemantiken zurückzugeben.

Weitere Details, einschließlich relevanter C-API-Änderungen und Deprecations, finden Sie unter PEP 667. Portierungshinweise für die betroffenen Python-APIs und C-APIs finden Sie ebenfalls unten.

(PEP und Implementierung beigesteuert von Mark Shannon und Tian Gao in gh-74929. Dokumentationsaktualisierungen von Guido van Rossum und Alyssa Coghlan.)

Unterstützung für mobile Plattformen

PEP 730: iOS ist nun eine PEP 11 unterstützte Plattform, mit den Zielen arm64-apple-ios und arm64-apple-ios-simulator auf Tier 3 (iPhone und iPad Geräte, die nach 2013 veröffentlicht wurden, und der Xcode iOS Simulator, der auf Apple Silicon Hardware läuft). x86_64-apple-ios-simulator (der Xcode iOS Simulator, der auf älterer x86_64 Hardware läuft) ist keine Tier 3 unterstützte Plattform, wird aber bestmöglich unterstützt. (PEP geschrieben und Implementierung beigesteuert von Russell Keith-Magee in gh-114099.)

PEP 738: Android ist nun eine PEP 11 unterstützte Plattform, mit den Zielen aarch64-linux-android und x86_64-linux-android auf Tier 3. Die 32-Bit-Ziele arm-linux-androideabi und i686-linux-android sind keine Tier 3 unterstützten Plattformen, werden aber bestmöglich unterstützt. (PEP geschrieben und Implementierung beigesteuert von Malcolm Smith in gh-116622.)

Siehe auch

PEP 730, PEP 738

Andere Sprachänderungen

  • Der Compiler entfernt nun gemeinsame führende Leerzeichen von jeder Zeile eines Docstrings. Dies reduziert die Größe des Bytecode-Caches (wie z. B. .pyc-Dateien), mit Dateigrößenreduktionen von etwa 5 %, zum Beispiel in sqlalchemy.orm.session von SQLAlchemy 2.0. Diese Änderung betrifft Tools, die Docstrings verwenden, wie z. B. 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'
    

    (Beigesteuert von Inada Naoki in gh-81283.)

  • Annotation-Umgebungen innerhalb von Klassen-Umgebungen können nun Lambdas und Comprehensions enthalten. Comprehensions, die sich innerhalb von Klassen-Umgebungen befinden, werden nicht in ihre übergeordnete Umgebung inline eingefügt.

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

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

  • Future-Anweisungen werden nicht mehr durch relative Importe des __future__-Moduls ausgelöst, was bedeutet, dass Anweisungen der Form from .__future__ import ... nun einfach Standard-Relative-Importe sind, ohne dass spezielle Funktionen aktiviert werden. (Beigesteuert von Jeremiah Gabriel Pascual in gh-118216.)

  • global-Deklarationen sind nun in except-Blöcken zulässig, wenn dieses globale in dem else-Block verwendet wird. Zuvor wurde hier ein fehlerhaftes SyntaxError ausgelöst. (Beigesteuert von Irit Katriel in gh-111123.)

  • Hinzufügen von PYTHON_FROZEN_MODULES, einer neuen Umgebungsvariable, die bestimmt, ob eingefrorene Module von der Importmechanik ignoriert werden, was dem Befehlszeilen-Option -X frozen_modules entspricht. (Beigesteuert von Yilei Yang in gh-111374.)

  • Hinzufügen von Unterstützung für den perf-Profiler ohne Frame-Pointer über die neue Umgebungsvariable PYTHON_PERF_JIT_SUPPORT und die Befehlszeilen-Option -X perf_jit. (Beigesteuert von Pablo Galindo in gh-118518.)

  • Der Speicherort einer .python_history-Datei kann über die neue Umgebungsvariable PYTHON_HISTORY geändert werden. (Beigesteuert von Levi Sabah, Zackery Spytz und Hugo van Kemenade in gh-73965.)

  • Klassen haben ein neues Attribut __static_attributes__. Dieses wird vom Compiler mit einem Tupel von Klassennamen gefüllt, die über self.<name> aus einer Funktion in ihrem Körper zugewiesen werden. (Beigesteuert von Irit Katriel in gh-115775.)

  • Der Compiler erstellt nun ein Attribut __firstlineno__ für Klassen mit der Zeilennummer der ersten Zeile der Klassendefinition. (Beigesteuert von Serhiy Storchaka in gh-118465.)

  • Die Builtin-Funktionen exec() und eval() akzeptieren nun die Argumente globals und locals als Schlüsselwörter. (Beigesteuert von Raphael Gaschignard in gh-105879)

  • Die Builtin-Funktion compile() akzeptiert nun ein neues Flag, ast.PyCF_OPTIMIZED_AST, das ast.PyCF_ONLY_AST ähnlich ist, mit der Ausnahme, dass das zurückgegebene AST gemäß dem Wert des optimize-Arguments optimiert wird. (Beigesteuert von Irit Katriel in gh-108113).

  • Hinzufügen eines Attributs __name__ zu property-Objekten. (Beigesteuert von Eugene Toder in gh-101860.)

  • Hinzufügen von PythonFinalizationError, einer neuen Ausnahme, die von RuntimeError abgeleitet ist und verwendet wird, um zu signalisieren, wenn Operationen während der Finalisierung blockiert sind. Die folgenden aufrufbaren Elemente lösen nun PythonFinalizationError anstelle von RuntimeError aus:

    (Beigesteuert von Victor Stinner in gh-114570.)

  • Erlauben, dass das count-Argument von str.replace() ein Schlüsselwort ist. (Beigesteuert von Hugo van Kemenade in gh-106487.)

  • Viele Funktionen geben nun eine Warnung aus, wenn ein boolescher Wert als Dateideskriptor-Argument übergeben wird. Dies kann helfen, einige Fehler früher zu erkennen. (Beigesteuert von Serhiy Storchaka in gh-82626.)

  • Hinzugefügt wurden die Attribute name und mode für komprimierte und archivierte dateiähnliche Objekte in den Modulen bz2, lzma, tarfile und zipfile. (Beigesteuert von Serhiy Storchaka in gh-115961.)

Neue Module

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

Verbesserte Module

argparse

  • Hinzufügen des Parameters deprecated zu den Methoden add_argument() und add_parser(), um die Deprecation von Befehlszeilenoptionen, Positionsargumenten und Unterbefehlen zu ermöglichen. (Beigesteuert von Serhiy Storchaka in gh-83648.)

array

  • Hinzufügen des Typs `'w'` (Code Py_UCS4) für Unicode-Zeichen. Er sollte anstelle des veralteten Typs `'u'` verwendet werden. (Beigesteuert von Inada Naoki in gh-80480.)

  • Registrieren von array.array als MutableSequence durch Implementierung der Methode clear(). (Beigesteuert von Mike Zimin in gh-114894.)

ast

  • Die Konstruktoren von Knotentypen im ast-Modul sind nun strenger bei den akzeptierten Argumenten, mit intuitiverem Verhalten, wenn Argumente weggelassen werden.

    Wenn ein optionales Feld eines AST-Knotens nicht als Argument beim Erstellen einer Instanz enthalten ist, wird das Feld nun auf None gesetzt. Ebenso wird, wenn ein Listenfeld weggelassen wird, dieses Feld nun auf eine leere Liste gesetzt, und wenn ein expr_context-Feld weggelassen wird, ist es standardmäßig Load(). (Zuvor war in allen Fällen das Attribut auf der neu erstellten AST-Knoteninstanz nicht vorhanden.)

    In allen anderen Fällen, in denen ein erforderliches Argument weggelassen wird, gibt der Knotenkonstruktor eine DeprecationWarning aus. Dies löst in Python 3.15 eine Ausnahme aus. Ebenso ist das Übergeben eines Schlüsselwortarguments an den Konstruktor, das keinem Feld auf dem AST-Knoten zugeordnet ist, nun veraltet und löst in Python 3.15 eine Ausnahme aus.

    Diese Änderungen gelten nicht für benutzerdefinierte Unterklassen von ast.AST, es sei denn, die Klasse optiert für das neue Verhalten, indem sie die AST._field_types-Zuordnung definiert.

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

  • ast.parse() akzeptiert nun ein optionales Argument optimize, das an compile() weitergegeben wird. Dies ermöglicht die Erzielung eines optimierten AST. (Beigesteuert von Irit Katriel in gh-108113.)

asyncio

  • asyncio.as_completed() gibt nun ein Objekt zurück, das sowohl ein asynchroner Iterator als auch ein normaler Iterator von Awaitables ist. Die von der asynchronen Iteration erzeugten Awaitables enthalten die ursprünglichen Task- oder Future-Objekte, die übergeben wurden, was die Zuordnung von Ergebnissen zu den abgeschlossenen Tasks erleichtert. (Beigesteuert von Justin Arthur in gh-77714.)

  • asyncio.loop.create_unix_server() entfernt nun automatisch den Unix-Socket, wenn der Server geschlossen wird. (Beigesteuert von Pierre Ossman in gh-111246.)

  • DatagramTransport.sendto() sendet nun Null-Längen-Datagramme, wenn es mit einem leeren Bytes-Objekt aufgerufen wird. Die Transportflusskontrolle berücksichtigt nun auch den Datagramm-Header bei der Berechnung der Puffergröße. (Beigesteuert von Jamie Phan in gh-115199.)

  • Hinzufügen von Queue.shutdown und QueueShutDown zur Verwaltung der Warteschlangenterminierung. (Beigesteuert von Laurie Opperman und Yves Duprat in gh-104228.)

  • Hinzufügen der Methoden Server.close_clients() und Server.abort_clients(), die einen Asyncio-Server stärker schließen. (Beigesteuert von Pierre Ossman in gh-113538.)

  • Akzeptieren eines Tupels von Trennzeichen in StreamReader.readuntil(), wobei die Funktion stoppt, sobald eines davon angetroffen wird. (Beigesteuert von Bruce Merry in gh-81322.)

  • Verbesserung des Verhaltens von TaskGroup, wenn eine externe Stornierung mit einer internen Stornierung kollidiert. Wenn beispielsweise zwei Task-Gruppen verschachtelt sind und beide gleichzeitig eine Ausnahme in einem Kind-Task erleben, war es möglich, dass die äußere Task-Gruppe hängt, da ihre interne Stornierung von der inneren Task-Gruppe verschluckt wurde.

    In dem Fall, dass eine Task-Gruppe extern storniert wird und auch eine ExceptionGroup auslösen muss, wird nun die Methode cancel() des Eltern-Tasks aufgerufen. Dies stellt sicher, dass bei der nächsten await eine CancelledError ausgelöst wird, sodass die Stornierung nicht verloren geht.

    Ein zusätzlicher Vorteil dieser Änderungen ist, dass Task-Gruppen nun die Stornierungszahl (cancelling()) beibehalten.

    Um einige Eckfälle zu behandeln, kann uncancel() nun das undokumentierte Flag _must_cancel zurücksetzen, wenn die Stornierungszahl Null erreicht.

    (Inspiriert von einem von Arthur Tacca gemeldeten Problem in gh-116720.)

  • Wenn TaskGroup.create_task() auf einer inaktiven TaskGroup aufgerufen wird, wird die übergebene Koroutine geschlossen (was eine RuntimeWarning darüber verhindert, dass die übergebene Koroutine nie awaitet wurde). (Beigesteuert von Arthur Tacca und Jason Zhang in gh-115957.)

  • Die Funktionen und Methoden mit dem Namen create_task haben ein neues **kwargs-Argument erhalten, das an den Task-Konstruktor weitergegeben wird. Diese Änderung wurde versehentlich in 3.13.3 hinzugefügt und brach die API-Vereinbarung für benutzerdefinierte Task-Fabriken. Mehrere benutzerdefinierte Task-Fabriken implementierten Workarounds dafür. In 3.13.4 und späteren Versionen wird die alte Fabrikvereinbarung wieder eingehalten (bis 3.14). Um die Workarounds funktionsfähig zu halten, erlaubt das zusätzliche **kwargs-Argument weiterhin die Übergabe zusätzlicher Schlüsselwortargumente an Task und an benutzerdefinierte Task-Fabriken.

    Dies betrifft die folgenden Funktionen und Methoden: asyncio.create_task(), asyncio.loop.create_task(), asyncio.TaskGroup.create_task(). (Beigesteuert von Thomas Grainger in gh-128307.)

base64

compileall

concurrent.futures

configparser

  • ConfigParser unterstützt nun unbenannte Abschnitte, was Schlüssel-Wert-Paare auf oberster Ebene ermöglicht. Dies kann mit dem neuen Parameter allow_unnamed_section aktiviert werden. (Beigesteuert von Pedro Sousa Lacerda in gh-66449.)

copy

ctypes

  • Als Folge notwendiger interner Refaktorierungen erfolgt die Initialisierung interner Metaklassen nun in __init__ anstelle von __new__. Dies betrifft Projekte, die diese internen Metaklassen unterklassifizieren, um benutzerdefinierte Initialisierung bereitzustellen. Im Allgemeinen:

    • Benutzerdefinierte Logik, die in __new__ nach dem Aufruf von super().__new__ durchgeführt wurde, sollte nach __init__ verschoben werden.

    • Um eine Klasse zu erstellen, rufen Sie die Metaklasse auf, nicht nur die __new__-Methode der Metaklasse.

    Siehe gh-124520 für Diskussionen und Links zu Änderungen in einigen betroffenen Projekten.

  • ctypes.Structure-Objekte haben ein neues Attribut _align_, mit dem die Ausrichtung der Struktur beim Packen/Entpacken aus dem Speicher explizit angegeben werden kann. (Beigetragen von Matt Sanderson in gh-112433)

dbm

  • Fügen Sie dbm.sqlite3 hinzu, ein neues Modul, das ein SQLite-Backend implementiert, und machen Sie es zum Standard-Backend für dbm. (Beigetragen von Raymond Hettinger und Erlend E. Aasland in gh-100414.)

  • Ermöglicht das Entfernen aller Elemente aus der Datenbank über die neuen clear()-Methoden der GDBM- und NDBM-Datenbankobjekte. (Beigetragen von Donghee Na in gh-107122.)

dis

  • Ändert die Ausgabe der Funktionen des Moduls dis, um logische Bezeichnungen für Sprungziele und Ausnahmebehandler anstelle von Offsets anzuzeigen. Die Offsets können mit der neuen Befehlszeilenoption -O oder dem Argument show_offsets hinzugefügt werden. (Beigetragen von Irit Katriel in gh-112137.)

  • get_instructions() stellt Cache-Einträge nicht mehr als separate Anweisungen dar. Stattdessen werden sie als Teil der Instruction im neuen Feld cache_info zurückgegeben. Das Argument show_caches für get_instructions() ist veraltet und hat keine Auswirkung mehr. (Beigetragen von Irit Katriel in gh-112962.)

doctest

email

  • Kopfzeilen mit eingebetteten Zeilenumbrüchen werden nun bei der Ausgabe in Anführungszeichen gesetzt. Der generator weigert sich nun, Kopfzeilen zu serialisieren (schreiben), die falsch gefaltet oder getrennt sind, so dass sie als mehrere Kopfzeilen analysiert oder mit benachbarten Daten verbunden würden. Wenn Sie diese Sicherheitsfunktion deaktivieren müssen, setzen Sie verify_generated_headers. (Beigetragen von Bas Bloemsaat und Petr Viktorin in gh-121650.)

  • getaddresses() und parseaddr() geben nun in mehr Situationen, in denen ungültige E-Mail-Adressen angetroffen werden, statt potenziell ungenauer Werte ('', '')-Paare zurück. Die beiden Funktionen haben einen neuen optionalen Parameter strict (Standard True). Um das alte Verhalten zu erhalten (Akzeptieren von fehlerhaften Eingaben), verwenden Sie strict=False. getattr(email.utils, 'supports_strict_parsing', False) kann verwendet werden, um zu prüfen, ob der Parameter strict verfügbar ist. (Beigetragen von Thomas Dwyer und Victor Stinner für gh-102988 zur Verbesserung der CVE 2023-27043-Korrektur.)

enum

  • EnumDict wurde öffentlich gemacht, um die Unterklassebildung von EnumType besser zu unterstützen.

fractions

glob

  • Fügen Sie translate() hinzu, eine Funktion zur Konvertierung einer Pfadangabe mit Shell-Wildcards in einen regulären Ausdruck. (Beigetragen von Barney Gale in gh-72904.)

importlib

  • Die folgenden Funktionen in importlib.resources erlauben nun den Zugriff auf ein Verzeichnis (oder einen Baum) von Ressourcen, unter Verwendung mehrerer Positionsargumente (die Argumente encoding und errors in den Textlesefunktionen sind jetzt nur noch Schlüsselwortargumente)

    Diese Funktionen sind nicht mehr veraltet und werden nicht zur Entfernung eingeplant. (Beigetragen von Petr Viktorin in gh-116608.)

  • contents() bleibt zugunsten der voll ausgestatteten Traversable API veraltet. Es gibt jedoch derzeit keine Pläne, 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 der letzte Batch kürzer als die angegebene Batch-Größe ist. (Beigetragen von Raymond Hettinger in gh-113202.)

marshal

  • Fügen Sie den Parameter allow_code in Modulfunktionen hinzu. Die Übergabe von allow_code=False verhindert die Serialisierung und Deserialisierung von Code-Objekten, die zwischen Python-Versionen inkompatibel sind. (Beigetragen von Serhiy Storchaka in gh-113626.)

math

  • Die neue Funktion fma() führt Fused Multiply-Add-Operationen durch. Diese berechnet x * y + z mit nur einer einzigen Rundung und vermeidet so jeglichen Zwischenverlust an Präzision. Sie wrappt die von C99 bereitgestellte Funktion fma() und folgt der Spezifikation der IEEE 754 "fusedMultiplyAdd"-Operation für Sonderfälle. (Beigetragen von Mark Dickinson und Victor Stinner in gh-73468.)

mimetypes

mmap

  • mmap ist nun vor Abstürzen unter Windows geschützt, wenn der zugeordnete Speicher aufgrund von Dateisystemfehlern oder Zugriffsverletzungen unzugänglich ist. (Beigetragen von Jannis Weigend in gh-118209.)

  • mmap hat eine neue Methode seekable(), die verwendet werden kann, wenn ein suchbares dateiähnliches Objekt benötigt wird. Die Methode seek() gibt nun die neue absolute Position zurück. (Beigetragen von Donghee Na und Sylvie Liberman in gh-111835.)

  • Der neue UNIX-spezifische Parameter trackfd für mmap steuert die Duplizierung des Dateideskriptors; wenn false, wird der durch fileno angegebene Dateideskriptor nicht dupliziert. (Beigetragen von Zackery Spytz und Petr Viktorin in gh-78502.)

multiprocessing

os

os.path

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

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

  • realpath() löst nun MS-DOS-Stil-Dateinamen auf, auch wenn die Datei nicht zugänglich ist. (Beigetragen von Moonsik Park in gh-82367.)

pathlib

  • Fügen Sie UnsupportedOperation hinzu, das anstelle von NotImplementedError ausgelöst wird, wenn eine Pfadoperation nicht unterstützt wird. (Beigetragen von Barney Gale in gh-89812.)

  • Fügen Sie einen neuen Konstruktor hinzu, um Path-Objekte aus "file"-URIs (file:///) zu erstellen: Path.from_uri(). (Beigetragen von Barney Gale in gh-107465.)

  • Fügen Sie PurePath.full_match() zum Abgleichen von Pfaden mit Shell-Wildcards hinzu, einschließlich des rekursiven Wildcards „**“. (Beigetragen von Barney Gale in gh-73435.)

  • Fügen Sie das Klassenattribut PurePath.parser hinzu, um die Implementierung von os.path für Low-Level-Pfadparsing und -verknüpfung zu speichern. Dies wird entweder posixpath oder ntpath sein.

  • Fügen Sie das schlüsselwort-only Argument recurse_symlinks zu Path.glob() und rglob() hinzu. (Beigetragen von Barney Gale in gh-77609.)

  • Path.glob() und rglob() geben nun Dateien und Verzeichnisse zurück, wenn ein Muster angegeben wird, das mit „**“ endet. Zuvor wurden nur Verzeichnisse zurückgegeben. (Beigetragen von Barney Gale in gh-70303.)

  • Fügen Sie das schlüsselwort-only Argument follow_symlinks zu Path.is_file, Path.is_dir, Path.owner() und Path.group() hinzu. (Beigetragen von Barney Gale in gh-105793 und Kamil Turek in gh-107962.)

pdb

  • breakpoint() und set_trace() betreten nun sofort den Debugger und nicht erst in der nächsten auszuführenden Codezeile. Diese Änderung verhindert, dass der Debugger außerhalb des Kontexts unterbrochen wird, wenn breakpoint() am Ende des Kontexts platziert ist. (Beigetragen von Tian Gao in gh-118579.)

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

  • zipapp wird nun als Debugging-Ziel unterstützt. (Beigetragen von Tian Gao in gh-118501.)

  • Fügen Sie die Möglichkeit hinzu, zwischen verketteten Ausnahmen während des Post-Mortem-Debuggings in pm() zu wechseln, indem Sie den neuen Befehl exceptions [exc_number] für Pdb verwenden. (Beigetragen von Matthias Bussonnier in gh-106676.)

  • Ausdrücke und Anweisungen, deren Präfix ein pdb-Befehl ist, werden nun korrekt identifiziert und ausgeführt. (Beigetragen von Tian Gao in gh-108464.)

queue

  • Fügen Sie Queue.shutdown und ShutDown zur Verwaltung der Warteschlangenbeendigung hinzu. (Beigetragen von Laurie Opperman und Yves Duprat in gh-104750.)

random

re

  • Benennen Sie re.error in PatternError um, um die Klarheit zu verbessern. re.error wird aus Gründen der Abwärtskompatibilität beibehalten.

shutil

  • Unterstützen Sie die Schlüsselwortargumente dir_fd und follow_symlinks in chown(). (Beigetragen von Berker Peksag und Tahia K in gh-62308)

site

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

sqlite3

ssl

  • Die API create_default_context() beinhaltet nun VERIFY_X509_PARTIAL_CHAIN und VERIFY_X509_STRICT in ihren Standardflags.

    Hinweis

    VERIFY_X509_STRICT kann Zertifikate vor-RFC 5280 oder fehlerhafte Zertifikate ablehnen, die die zugrunde liegende OpenSSL-Implementierung möglicherweise andernfalls akzeptieren würde. Obwohl die Deaktivierung nicht empfohlen wird, können Sie dies tun mit

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

    (Beigetragen von William Woodruff in gh-112389.)

statistics

  • Fügen Sie kde() für die Kernel-Dichteschätzung hinzu. Dies ermöglicht die Schätzung einer kontinuierlichen Wahrscheinlichkeitsdichtefunktion aus einer festen Anzahl von diskreten Stichproben. (Beigetragen von Raymond Hettinger in gh-115863.)

  • Fügen Sie kde_random() zum Stichprobenziehen aus einer geschätzten Wahrscheinlichkeitsdichtefunktion hinzu, die von kde() erstellt wurde. (Beigetragen von Raymond Hettinger in gh-115863.)

subprocess

  • Das Modul subprocess verwendet nun die Funktion posix_spawn() in mehr Situationen.

    Bemerkenswerterweise wird, wenn close_fds auf True (der Standardwert) gesetzt ist, posix_spawn() verwendet, wenn die C-Bibliothek posix_spawn_file_actions_addclosefrom_np() bereitstellt, was aktuelle Versionen von Linux, FreeBSD und Solaris einschließt. Unter Linux sollte dies ähnlich wie der bestehende vfork()-basierte Code funktionieren.

    Ein privater Steuerknopf subprocess._USE_POSIX_SPAWN kann auf False gesetzt werden, wenn Sie erzwingen möchten, dass subprocess niemals posix_spawn() verwendet. Bitte melden Sie Ihren Grund und Ihre Plattformdetails im Issue Tracker, wenn Sie dies tun, damit wir unsere API-Auswahllogik für alle verbessern können. (Beigetragen von Jakub Kulik in gh-113117.)

sys

  • Fügen Sie die Funktion _is_interned() hinzu, um zu testen, ob ein String interniert wurde. Diese Funktion ist nicht garantiert in allen Implementierungen von Python vorhanden. (Beigetragen von Serhiy Storchaka in gh-78573.)

tempfile

  • Unter Windows beschränkt der Standardmodus 0o700, der von tempfile.mkdtemp() verwendet wird, aufgrund von Änderungen an os.mkdir() den Zugriff auf das neue Verzeichnis. Dies ist eine Abhilfemaßnahme für CVE 2024-4030. (Beigetragen von Steve Dower in gh-118486.)

time

  • Unter Windows verwendet monotonic() nun die QueryPerformanceCounter()-Uhr für eine Auflösung von 1 Mikrosekunde, anstelle der GetTickCount64()-Uhr, die eine Auflösung von 15,6 Millisekunden hat. (Beigetragen von Victor Stinner in gh-88494.)

  • Unter Windows verwendet time() nun die GetSystemTimePreciseAsFileTime()-Uhr für eine Auflösung von 1 Mikrosekunde, anstelle der GetSystemTimeAsFileTime()-Uhr, die eine Auflösung von 15,6 Millisekunden hat. (Beigetragen von Victor Stinner in gh-63207.)

tkinter

  • Fügen Sie die tkinter-Widget-Methoden hinzu: 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() akzeptiert nun den Attributnamen ohne das Minus-Präfix, um Fensterattribute abzurufen, z. B. w.wm_attributes('alpha'), und ermöglicht die Angabe von Attributen und Werten als Schlüsselwortargumente, z. B. w.wm_attributes(alpha=0.5). (Beigetragen von Serhiy Storchaka in gh-43457.)

  • wm_attributes() kann nun Attribute als dict zurückgeben, indem der neue optionale schlüsselwortexklusive Parameter return_python_dict verwendet wird. (Beigetragen von Serhiy Storchaka in gh-43457.)

  • Text.count() kann nun ein einfaches int zurückgeben, wenn der neue optionale schlüsselwortexklusive Parameter return_ints verwendet wird. Andernfalls wird die einzelne Anzahl als 1-Tupel oder None zurückgegeben. (Beigetragen von Serhiy Storchaka in gh-97928.)

  • Unterstützen Sie den Elementtyp „vsapi“ in der Methode element_create() von tkinter.ttk.Style. (Beigetragen von Serhiy Storchaka in gh-68166.)

  • Fügen Sie die Methode after_info() für Tkinter-Widgets hinzu. (Beigetragen von Cheryl Sabella in gh-77020.)

  • Fügen Sie der PhotoImage-Methode copy_replace() eine neue Methode hinzu, um einen Bereich von einem Bild in ein anderes zu kopieren, möglicherweise mit Pixel-Zoom, Subsampling oder beidem. (Beigetragen von Serhiy Storchaka in gh-118225.)

  • Fügen Sie den Parameter from_coords zu den PhotoImage-Methoden copy(), zoom() und subsample() hinzu. Fügen Sie die Parameter zoom und subsample zur PhotoImage-Methode copy() hinzu. (Beigetragen von Serhiy Storchaka in gh-118225.)

  • Fügen Sie die PhotoImage-Methoden read() zum Lesen eines Bildes aus einer Datei und data() zum Abrufen der Bilddaten hinzu. Fügen Sie die Parameter background und grayscale zur Methode write() hinzu. (Beigetragen von Serhiy Storchaka in gh-118271.)

traceback

  • Fügen Sie das Attribut exc_type_str zu TracebackException hinzu, das eine Zeichenfolgendarstellung des exc_type enthält. Deprecieren Sie das Attribut exc_type, das das Typobjekt selbst enthält. Fügen Sie den Parameter save_exc_type (Standardwert True) hinzu, um anzugeben, ob exc_type gespeichert werden soll. (Beigetragen von Irit Katriel in gh-112332.)

  • Fügen Sie einen neuen schlüsselwortexklusiven Parameter show_group zu TracebackException.format_exception_only() hinzu, um die verschachtelten Ausnahmen einer Instanz von BaseExceptionGroup (rekursiv) zu formatieren. (Beigetragen von Irit Katriel in gh-105292.)

types

  • SimpleNamespace kann nun ein einzelnes Positionsargument zur Initialisierung der Argumente des Namespace entgegennehmen. Dieses Argument muss entweder eine Abbildung oder ein Iterable von Schlüssel-Wert-Paaren sein. (Beigetragen von Serhiy Storchaka in gh-108191.)

typing

  • PEP 705: Fügen Sie ReadOnly hinzu, einen speziellen Typkonstruktor, um ein TypedDict-Element für Typüberprüfer als schreibgeschützt zu markieren.

  • PEP 742: Fügen Sie TypeIs hinzu, einen Typkonstruktor, der verwendet werden kann, um einem Typüberprüfer mitzuteilen, wie ein Typ eingeschränkt werden kann.

  • Fügen Sie NoDefault hinzu, ein Sentinel-Objekt, das verwendet wird, um die Standardwerte einiger Parameter im Modul typing darzustellen. (Beigetragen von Jelle Zijlstra in gh-116126.)

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

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

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

unicodedata

venv

  • Fügen Sie Unterstützung für die Erstellung von Source Control Management (SCM) Ignore-Dateien im Verzeichnis einer virtuellen Umgebung hinzu. Standardmäßig wird Git unterstützt. Dies wird als Opt-in über die API implementiert, die erweitert werden kann, um andere SCMs zu unterstützen (EnvBuilder und create()) und als Opt-out über die CLI mit --without-scm-ignore-files. (Beigetragen von Brett Cannon in gh-108125.)

warnings

xml

zipimport

  • Fügen Sie Unterstützung für Dateien im ZIP64-Format hinzu. Jeder liebt riesige Daten, richtig? (Beigetragen von Tim Hatch in gh-94146.)

Optimierungen

  • Mehrere Standardbibliotheksmodule haben deutlich verbesserte Importzeiten. Zum Beispiel wurde die Importzeit des Moduls typing um etwa ein Drittel reduziert, indem Abhängigkeiten von re und contextlib entfernt wurden. Andere Module, die von Importzeit-Beschleunigungen profitieren, 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 jetzt bei großen Eingaben etwa 30 % schneller als zuvor. (Beigetragen von Inada Naoki in gh-107369.)

  • Das Modul subprocess verwendet nun die Funktion posix_spawn() in mehr Situationen, einschließlich, wenn close_fds True (der Standardwert) auf vielen modernen Plattformen ist. Dies sollte zu einer deutlichen Leistungssteigerung beim Starten von Prozessen unter FreeBSD und Solaris führen. Einzelheiten finden Sie im Abschnitt subprocess oben. (Beigetragen von Jakub Kulik in gh-113117.)

Entfernte Module und APIs

PEP 594: Entfernen von „toten Batterien“ aus der Standardbibliothek

PEP 594 schlug die Entfernung von 19 Modulen aus der Standardbibliothek vor, die umgangssprachlich als „tote Batterien“ bezeichnet werden, da sie historisch, veraltet oder unsicher sind. Alle folgenden Module wurden in Python 3.11 als veraltet markiert und sind nun entfernt

  • aifc

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

  • audioop

    • audioop-lts: Verwenden Sie die audioop-lts-Bibliothek von PyPI.

  • chunk

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

  • cgi und cgitb

    • cgi.FieldStorage kann typischerweise durch urllib.parse.parse_qsl() für GET- und HEAD-Anfragen ersetzt werden, und das Modul email.message oder die Bibliothek multipart für POST- und PUT-Anfragen.

    • cgi.parse() kann durch direkten Aufruf von urllib.parse.parse_qs() auf der gewünschten Query-String ersetzt werden, es sei denn, die Eingabe ist multipart/form-data, die wie unten für cgi.parse_multipart() beschrieben ersetzt werden sollte.

    • cgi.parse_header() kann durch die Funktionalität des Pakets email ersetzt werden, das die gleichen MIME-RFCs implementiert. 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() kann durch die Funktionalität des Pakets email, das die gleichen MIME-RFCs implementiert, oder mit der Bibliothek multipart ersetzt werden. Zum Beispiel die Klassen email.message.EmailMessage und email.message.Message.

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

  • crypt und die private Erweiterung _crypt. Das Modul hashlib kann ein geeigneter Ersatz sein, wenn einfach nur ein Wert gehasht werden muss. Andernfalls sind verschiedene Drittanbieterbibliotheken auf PyPI verfügbar

    • bcrypt: Moderne Passwort-Hashing für Ihre Software und Ihre Server.

    • argon2-cffi: Der sichere Argon2-Passwort-Hashing-Algorithmus.

    • legacycrypt: ctypes Wrapper für den POSIX crypt-Bibliotheksaufruf und zugehörige Funktionalität.

    • crypt_r: Fork des Moduls crypt, Wrapper für den Bibliotheksaufruf crypt_r(3) und zugehörige Funktionalität.

    • standard-crypt und deprecated-crypt-alternative: Verwenden Sie die Weiterverteilung von crypt und die Neuimplementierung der Bibliotheken _crypt von PyPI.

  • imghdr: Die Bibliotheken filetype, puremagic oder python-magic sollten als Ersatz verwendet werden. Zum Beispiel kann die Funktion puremagic.what() verwendet werden, um die Funktion imghdr.what() für alle Dateiformate zu ersetzen, die von imghdr unterstützt wurden.

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

  • mailcap: Verwenden Sie stattdessen das Modul mimetypes.

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

  • msilib

  • nis

  • nntplib: Verwenden Sie stattdessen die Bibliothek pynntp von PyPI.

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

  • ossaudiodev: Für die Audiowiedergabe verwenden Sie stattdessen die Bibliothek pygame von PyPI.

  • pipes: Verwenden Sie stattdessen das Modul subprocess. Verwenden Sie shlex.quote(), um die undokumentierte Funktion pipes.quote zu ersetzen.

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

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

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

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

  • sunau

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

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

    • standard-telnetlib: Verwenden Sie die Weiterverteilung der telnetlib-Bibliothek von PyPI.

  • uu: Verwenden Sie stattdessen das Modul base64 als moderne Alternative.

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

  • xdrlib

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

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

2to3

  • Entfernen Sie das Programm 2to3 und das Modul lib2to3, die zuvor in Python 3.11 als veraltet markiert wurden. (Beigetragen von Victor Stinner in gh-104780.)

builtins

  • Entfernen Sie die Unterstützung für verkettete classmethod-Deskriptoren (eingeführt in gh-63272). Diese können nicht mehr verwendet werden, um andere Deskriptoren wie property zu umschließen. Das Kernkonzept dieser Funktion war fehlerhaft und führte zu mehreren Problemen. Um einen classmethod zu „durchleiten“, sollten Sie das Attribut __wrapped__ verwenden, das in Python 3.10 hinzugefügt wurde. (Beigetragen von Raymond Hettinger in gh-89519.)

  • Lösen Sie einen RuntimeError aus, wenn frame.clear() für einen angehaltenen Frame aufgerufen wird (wie es für einen ausführenden Frame immer der Fall war). (Beigetragen von Irit Katriel in gh-79932.)

configparser

  • Entfernen Sie die undokumentierte Klasse LegacyInterpolation, die seit Python 3.2 in der Dokumentation und seit Python 3.11 zur Laufzeit als veraltet markiert war. (Beigetragen von Hugo van Kemenade in gh-104886.)

importlib.metadata

locale

  • Entfernen Sie die Funktion locale.resetlocale(), die in Python 3.11 als veraltet markiert wurde. Verwenden Sie stattdessen locale.setlocale(locale.LC_ALL, ""). (Beigetragen von Victor Stinner in gh-104783.)

opcode

  • Verschieben Sie opcode.ENABLE_SPECIALIZATION nach _opcode.ENABLE_SPECIALIZATION. Dieses Feld wurde in 3.12 hinzugefügt, wurde nie dokumentiert und ist nicht für die externe Verwendung bestimmt. (Beigetragen von Irit Katriel in gh-105481.)

  • Entfernen Sie opcode.is_pseudo(), opcode.MIN_PSEUDO_OPCODE und opcode.MAX_PSEUDO_OPCODE, die in Python 3.12 hinzugefügt wurden, aber weder dokumentiert noch über dis verfügbar waren und nicht für die externe Verwendung bestimmt waren. (Beigetragen von Irit Katriel in gh-105481.)

optparse

  • Dieses Modul gilt nicht mehr als soft deprecated. Obwohl argparse für neue Projekte, die keine Befehlszeilenargumentverarbeitungsbibliothek eines Drittanbieters verwenden, weiterhin bevorzugt wird, gibt es Aspekte der Funktionsweise von argparse, die dazu führen, dass das Low-Level-Modul optparse eine bessere Grundlage für das *Schreiben* von Argumentverarbeitungsbibliotheken und die Implementierung von Befehlszeilenanwendungen bieten kann, die sich strikter als argparse an verschiedene Konventionen zur Verarbeitung von Befehlszeilen halten, die im Verhalten der C-Funktion getopt() ihren Ursprung haben. (Beigetragen von Alyssa Coghlan und Serhiy Storchaka in gh-126180.)

pathlib

  • Entfernen Sie die Möglichkeit, Path-Objekte als Context-Manager zu verwenden. Diese Funktionalität wurde als veraltet markiert und hatte seit Python 3.9 keine Auswirkung mehr. (Beigetragen von Barney Gale in gh-83863.)

re

  • Entfernen Sie die undokumentierte, veraltete und fehlerhafte Funktion re.template() sowie das Flag re.TEMPLATE / re.T. (Beigetragen von Serhiy Storchaka und Nikita Sobolev in gh-105687.)

tkinter.tix

  • Entfernen Sie das Modul tkinter.tix, das seit Python 3.6 als veraltet markiert war. Die Tix-Bibliothek von Drittanbietern, die das Modul umschloss, ist nicht mehr gepflegt. (Beigetragen von Zachary Ware in gh-75552.)

turtle

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

typing

  • Entfernen Sie die Namespaces typing.io und typing.re, die seit Python 3.8 als veraltet markiert sind. Die Elemente in diesen Namespaces können direkt aus dem Modul typing importiert werden. (Beigetragen von Sebastian Rittau in gh-92871.)

  • Entfernen Sie die Methode zur Erstellung von TypedDict-Typen über Schlüsselwortargumente, die seit Python 3.11 als veraltet markiert ist. (Beigetragen von Tomas Roun in gh-104786.)

unittest

  • Entfernen Sie die folgenden Funktionen von unittest, die seit Python 3.11 als veraltet markiert sind

    • unittest.findTestCases()

    • unittest.makeSuite()

    • unittest.getTestCaseNames()

    Verwenden Sie stattdessen Methoden von TestLoader

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

  • Entfernen Sie die nicht getestete und undokumentierte Methode TestProgram.usageExit(), die seit Python 3.11 als veraltet markiert ist. (Beigetragen von Hugo van Kemenade in gh-104992.)

urllib

  • Entfernen Sie die Parameter cafile, capath und cadefault der Funktion urllib.request.urlopen(), die seit Python 3.6 als veraltet markiert sind. Verwenden Sie stattdessen den Parameter context mit einer Instanz von SSLContext. Die Funktion ssl.SSLContext.load_cert_chain() kann verwendet werden, um spezifische Zertifikate zu laden, oder Sie können ssl.create_default_context() die vertrauenswürdigen Zertifizierungsstellen (CA) des Betriebssystems auswählen lassen. (Beigetragen von Victor Stinner in gh-105382.)

webbrowser

  • Entfernen Sie die nicht getestete und undokumentierte Klasse MacOSX, die seit Python 3.11 als veraltet markiert ist. Verwenden Sie stattdessen die Klasse MacOSXOSAScript (eingeführt in Python 3.2). (Beigetragen von Hugo van Kemenade in gh-104804.)

  • Entfernen Sie das veraltete Attribut MacOSXOSAScript._name. Verwenden Sie stattdessen das Attribut MacOSXOSAScript.name. (Beigetragen von Nikita Sobolev in gh-105546.)

Neue veraltete Funktionen

  • Benutzerdefinierte Funktionen:

    • Markieren Sie die Zuweisung zum Attribut __code__ einer Funktion als veraltet, wenn der Typ des neuen Codeobjekts nicht mit dem Typ der Funktion übereinstimmt. Die verschiedenen Typen sind: normale Funktion, Generator, asynchroner Generator und Koroutine. (Beigetragen von Irit Katriel in gh-81137.)

  • array:

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

  • ctypes:

    • Markieren Sie die undokumentierte Funktion SetPointerType() als veraltet, die in Python 3.15 entfernt wird. (Beigetragen von Victor Stinner in gh-105733.)

    • Soft-deprecate die Funktion ARRAY() zugunsten der Multiplikation type * length. (Beigetragen von Victor Stinner in gh-105733.)

  • decimal:

    • Markieren Sie den nicht standardmäßigen und undokumentierten Format-Spezifizierer 'N' für Decimal als veraltet, der nur in der C-Implementierung des Moduls decimal unterstützt wird. (Beigetragen von Serhiy Storchaka in gh-89902.)

  • dis:

    • Markieren Sie den Separator HAVE_ARGUMENT als veraltet. Prüfen Sie stattdessen die Mitgliedschaft in hasarg. (Beigetragen von Irit Katriel in gh-109319.)

  • gettext:

    • Markieren Sie nicht-ganzzahlige Zahlen als Argumente für Funktionen und Methoden, die Pluralformen im Modul gettext berücksichtigen, als veraltet, selbst wenn keine Übersetzung gefunden wurde. (Beigetragen von Serhiy Storchaka in gh-88434.)

  • glob:

    • Markieren Sie die undokumentierten Funktionen glob0() und glob1() als veraltet. Verwenden Sie stattdessen glob() und übergeben Sie ein pfadähnliches Objekt, das das Stammverzeichnis angibt, an den Parameter root_dir. (Beigetragen von Barney Gale in gh-117337.)

  • http.server:

    • Markieren Sie CGIHTTPRequestHandler als veraltet, die in Python 3.15 entfernt wird. Prozessbasierte CGI-HTTP-Server sind seit langem veraltet. Dieser Code war veraltet, wurde nicht gepflegt und selten verwendet. Er hat ein hohes Potenzial für Sicherheits- und Funktionsfehler. (Beigetragen von Gregory P. Smith in gh-109096.)

    • Markieren Sie das Flag --cgi für die Befehlszeilenschnittstelle python -m http.server als veraltet, die in Python 3.15 entfernt wird. (Beigetragen von Gregory P. Smith in gh-109096.)

  • mimetypes:

  • re:

    • Markieren Sie das Übergeben der optionalen Argumente maxsplit, count oder flags als positionsbezogene Argumente an die Modul-Level-Funktionen split(), sub() und subn() als veraltet. Diese Parameter werden in einer zukünftigen Version von Python keyword-only sein. (Beigetragen von Serhiy Storchaka in gh-56166.)

  • pathlib:

  • platform:

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

  • pydoc:

    • Markieren Sie die undokumentierte Funktion ispackage() als veraltet. (Beigetragen von Zackery Spytz in gh-64020.)

  • sqlite3:

    • Markieren Sie das Übergeben von mehr als einem positionsbezogenen Argument an die Funktion connect() und den Konstruktor Connection als veraltet. Die verbleibenden Parameter werden in Python 3.15 zu keyword-only. (Beigetragen von Erlend E. Aasland in gh-107948.)

    • Markieren Sie das Übergeben von Name, Anzahl der Argumente und der aufrufbaren Funktion als Schlüsselwortargumente für Connection.create_function() und Connection.create_aggregate() als veraltet. Diese Parameter werden in Python 3.15 zu positional-only. (Beigetragen von Erlend E. Aasland in gh-108278.)

    • Markieren Sie das Übergeben der Callback-Funktion per Schlüsselwort für die Methoden set_authorizer(), set_progress_handler() und set_trace_callback() der Klasse Connection als veraltet. Die Callback-Funktionen werden in Python 3.15 zu positional-only. (Beigetragen von Erlend E. Aasland in gh-108278.)

  • sys:

  • tarfile:

    • Markieren Sie das undokumentierte und ungenutzte Attribut TarFile.tarfile als veraltet, das in Python 3.16 entfernt wird. (Beigetragen in gh-115256.)

  • traceback:

  • typing:

    • Markieren Sie die undokumentierte Schlüsselwortargument-Syntax für die Erstellung von NamedTuple-Klassen (z. B. Point = NamedTuple("Point", x=int, y=int)) als veraltet, die in Python 3.15 entfernt wird. Verwenden Sie stattdessen die klassenbasierte Syntax oder die funktionale Syntax. (Beigetragen von Alex Waygood in gh-105566.)

    • Markieren Sie das Auslassen des Parameters fields bei der Erstellung einer NamedTuple- oder typing.TypedDict-Klasse sowie das Übergeben von None an den Parameter fields beider Typen als veraltet. Python 3.15 erfordert eine gültige Sequenz für den Parameter fields. Um eine NamedTuple-Klasse mit null Feldern zu erstellen, verwenden Sie class NT(NamedTuple): pass oder NT = NamedTuple("NT", ()). Um eine TypedDict-Klasse mit null Feldern zu erstellen, verwenden Sie class TD(TypedDict): pass oder TD = TypedDict("TD", {}). (Beigetragen von Alex Waygood in gh-105566 und gh-105570.)

    • Markieren Sie die Decorator-Funktion typing.no_type_check_decorator() als veraltet, die in Python 3.15 entfernt wird. Nach acht Jahren im Modul typing wurde sie noch von keinem großen Typenprüfer unterstützt. (Beigetragen von Alex Waygood in gh-106309.)

    • Markieren Sie typing.AnyStr als veraltet. In Python 3.16 wird es aus typing.__all__ entfernt, und beim Importieren oder Zugreifen wird zur Laufzeit eine DeprecationWarning ausgelöst. Es wird in Python 3.18 vollständig entfernt. Verwenden Sie stattdessen die neue Typenparametrisierungssyntax. (Beigetragen von Michael The in gh-107116.)

  • wave:

Wird in Python 3.14 entfernt

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

  • ast: Die folgenden Funktionen sind seit Python 3.8 in der Dokumentation als veraltet markiert, lösen nun zur Laufzeit eine DeprecationWarning aus, wenn sie aufgerufen oder verwendet werden, und werden in Python 3.14 entfernt

    • ast.Num

    • ast.Str

    • ast.Bytes

    • ast.NameConstant

    • ast.Ellipsis

    Verwenden Sie 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. (Beigetragen von Kumar Aditya in 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. (Beigetragen von Kumar Aditya in gh-94597.)

    • Die Methode get_event_loop() der Standard-Eventloop-Policy löst nun eine DeprecationWarning aus, wenn kein aktueller Eventloop gesetzt ist und dieser einen erstellt. (Beigetragen von Serhiy Storchaka und Guido van Rossum in gh-100160.)

  • email: Das Argument isdst in email.utils.localtime() ist veraltet. (Beigetragen von Alan Williams in gh-72346.)

  • importlib.abc: veraltete Klassen

    • importlib.abc.ResourceReader

    • importlib.abc.Traversable

    • importlib.abc.TraversableResources

    Verwenden Sie stattdessen die Klassen von importlib.resources.abc

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

  • itertools hatte undokumentierte, ineffiziente, historisch fehlerhafte und inkonsistente Unterstützung für Copy-, Deepcopy- und Pickle-Operationen. Dies wird in 3.14 entfernt, um den Codeumfang und den Wartungsaufwand erheblich zu reduzieren. (Beigetragen von Raymond Hettinger in gh-101588.)

  • multiprocessing: Die Standard-Startmethode wird auf Linux, BSDs und anderen Nicht-macOS-POSIX-Plattformen, auf denen 'fork' derzeit die Standardmethode ist, auf eine sicherere umgestellt (gh-84559). Das Hinzufügen einer Laufzeitwarnung hierzu wurde als zu störend erachtet, da die Mehrheit des Codes voraussichtlich keine Probleme haben wird. Verwenden Sie die APIs get_context() oder set_start_method(), um explizit anzugeben, wann Ihr Code 'fork' *benötigt*. Siehe Kontexte und Startmethoden.

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

  • pkgutil: pkgutil.find_loader() und pkgutil.get_loader() lösen nun DeprecationWarning aus; verwenden Sie stattdessen importlib.util.find_spec(). (Beigetragen von Nikita Sobolev in gh-97850.)

  • pty:

  • sqlite3:

  • urllib: urllib.parse.Quoter ist veraltet: es war nicht als öffentliche API gedacht. (Beigetragen von Gregory P. Smith in gh-88168.)

Zur Entfernung vorgesehen in Python 3.15

  • Das Importsystem

    • Das Setzen von __cached__ für ein Modul, während __spec__.cached nicht gesetzt wird, ist veraltet. In Python 3.15 wird __cached__ vom Import-System oder der Standardbibliothek nicht mehr gesetzt oder berücksichtigt. (gh-97879)

    • Das Setzen von __package__ für ein Modul, während __spec__.parent nicht gesetzt wird, ist veraltet. In Python 3.15 wird __package__ vom Import-System oder der Standardbibliothek nicht mehr gesetzt oder berücksichtigt. (gh-97879)

  • ctypes:

    • Die undokumentierte Funktion ctypes.SetPointerType() ist seit Python 3.13 veraltet.

  • http.server:

    • Die veraltete und selten genutzte CGIHTTPRequestHandler ist seit Python 3.13 veraltet. Es gibt keinen direkten Ersatz. *Alles* ist besser als CGI, um einen Webserver mit einem Request-Handler zu verbinden.

    • Das Flag --cgi für die Kommandozeilenschnittstelle python -m http.server ist seit Python 3.13 veraltet.

  • importlib:

    • Methode load_module(): verwenden Sie stattdessen exec_module().

  • locale:

  • pathlib:

  • platform:

    • java_ver() ist seit Python 3.13 veraltet. Diese Funktion ist nur für die Jython-Unterstützung nützlich, hat eine verwirrende API und wird weitgehend nicht getestet.

  • sysconfig:

  • threading:

    • RLock() wird in Python 3.15 keine Argumente mehr akzeptieren. Das Übergeben von Argumenten ist seit Python 3.14 veraltet, da die Python-Version keine Argumente zulässt, die C-Version jedoch beliebige Positions- oder Schlüsselwortargumente zulässt und alle ignoriert.

  • types:

  • typing:

    • Die undokumentierte Schlüsselwortargument-Syntax für die Erstellung von NamedTuple-Klassen (z. B. Point = NamedTuple("Point", x=int, y=int)) ist seit Python 3.13 veraltet. Verwenden Sie stattdessen die klassenbasierte Syntax oder die funktionale Syntax.

    • Bei Verwendung der funktionalen Syntax von TypedDicts ist das Nicht-Übergeben eines Werts an den Parameter fields (TD = TypedDict("TD")) oder das Übergeben von None (TD = TypedDict("TD", None)) seit Python 3.13 als veraltet markiert. Verwenden Sie class TD(TypedDict): pass oder TD = TypedDict("TD", {}), um einen TypedDict mit null Feldern zu erstellen.

    • Der Dekorator typing.no_type_check_decorator() ist seit Python 3.13 veraltet. Nach acht Jahren im Modul typing wurde er von keinem wichtigen Typ-Checker unterstützt.

  • wave:

  • zipimport:

    • load_module() ist seit Python 3.10 veraltet. Verwenden Sie stattdessen exec_module(). (Beigetragen von Jiahao Li in gh-125746.)

Vorschlag zur Entfernung in Python 3.16

  • Das Importsystem

    • Das Setzen von __loader__ für ein Modul, während gleichzeitig __spec__.loader nicht gesetzt wird, ist veraltet. In Python 3.16 wird __loader__ vom Importsystem und der Standardbibliothek weder gesetzt noch berücksichtigt.

  • array:

    • Der Formatcode 'u' (wchar_t) ist seit Python 3.3 in der Dokumentation und seit Python 3.13 zur Laufzeit veraltet. Verwenden Sie stattdessen den Formatcode 'w' (Py_UCS4) für Unicode-Zeichen.

  • asyncio:

  • builtins:

    • Bitweise Inversion auf booleschen Typen, ~True oder ~False, ist seit Python 3.12 veraltet, da sie überraschende und unintuitive Ergebnisse liefert (-2 und -1). Verwenden Sie stattdessen not x für die logische Negation eines Boole-Wertes. In dem seltenen Fall, dass Sie die bitweise Inversion der zugrunde liegenden Ganzzahl benötigen, konvertieren Sie explizit zu int (~int(x)).

  • functools:

    • Das Aufrufen der Python-Implementierung von functools.reduce() mit function oder sequence als Schlüsselwortargumente ist seit Python 3.14 veraltet.

  • logging:

    Die Unterstützung für benutzerdefinierte Logging-Handler mit dem Argument strm ist veraltet und soll in Python 3.16 entfernt werden. Definieren Sie Handler stattdessen mit dem Argument stream. (Beigetragen von Mariusz Felisiak in gh-115032.)

  • mimetypes:

    • Gültige Erweiterungen beginnen mit einem Punkt oder sind leer für mimetypes.MimeTypes.add_type(). Nicht-punktierte Erweiterungen sind veraltet und lösen in Python 3.16 einen ValueError aus. (Beigetragen von Hugo van Kemenade in gh-75223.)

  • shutil:

    • Die Ausnahme ExecError ist seit Python 3.14 veraltet. Sie wurde seit Python 3.4 von keiner Funktion in shutil verwendet und ist nun ein Alias für RuntimeError.

  • symtable:

  • sys:

  • sysconfig:

    • Die Funktion sysconfig.expand_makefile_vars() ist seit Python 3.14 veraltet. Verwenden Sie stattdessen das Argument vars von sysconfig.get_paths().

  • tarfile:

    • Das undokumentierte und ungenutzte Attribut TarFile.tarfile ist seit Python 3.13 veraltet.

Zur Entfernung vorgesehen in Python 3.17

  • collections.abc:

    • collections.abc.ByteString ist für die Entfernung in Python 3.17 geplant.

      Verwenden Sie isinstance(obj, collections.abc.Buffer), um zur Laufzeit zu testen, ob obj das Buffer-Protokoll implementiert. Für die Verwendung in Typ-Annotationen verwenden Sie entweder Buffer oder eine Union, die explizit die von Ihrem Code unterstützten Typen angibt (z. B. bytes | bytearray | memoryview).

      ByteString war ursprünglich als abstrakte Klasse gedacht, die als Oberklasse sowohl für bytes als auch für bytearray dienen sollte. Da die ABC jedoch nie Methoden hatte, wusste man nie wirklich etwas Nützliches über ein Objekt, nur weil es eine Instanz von ByteString war. Andere gängige Puffertypen wie memoryview wurden auch nie als Untertypen von ByteString verstanden (weder zur Laufzeit noch von statischen Typprüfern).

      Weitere Details finden Sie in PEP 688. (Beigetragen von Shantanu Jain in gh-91896.)

  • typing:

    • Vor Python 3.14 wurden alte Unions mit der privaten Klasse typing._UnionGenericAlias implementiert. Diese Klasse wird für die Implementierung nicht mehr benötigt, wurde aber zur Abwärtskompatibilität beibehalten und soll spätestens in Python 3.17 entfernt werden. Benutzer sollten dokumentierte Introspektionshilfen wie typing.get_origin() und typing.get_args() verwenden, anstatt sich auf private Implementierungsdetails zu verlassen.

    • typing.ByteString, das seit Python 3.9 veraltet ist, ist für die Entfernung in Python 3.17 geplant.

      Verwenden Sie isinstance(obj, collections.abc.Buffer), um zur Laufzeit zu testen, ob obj das Buffer-Protokoll implementiert. Für die Verwendung in Typ-Annotationen verwenden Sie entweder Buffer oder eine Union, die explizit die von Ihrem Code unterstützten Typen angibt (z. B. bytes | bytearray | memoryview).

      ByteString war ursprünglich als abstrakte Klasse gedacht, die als Oberklasse sowohl für bytes als auch für bytearray dienen sollte. Da die ABC jedoch nie Methoden hatte, wusste man nie wirklich etwas Nützliches über ein Objekt, nur weil es eine Instanz von ByteString war. Andere gängige Puffertypen wie memoryview wurden auch nie als Untertypen von ByteString verstanden (weder zur Laufzeit noch von statischen Typprüfern).

      Weitere Details finden Sie in PEP 688. (Beigetragen von Shantanu Jain in gh-91896.)

Zur Entfernung vorgesehen in zukünftigen Versionen

Die folgenden APIs werden in Zukunft entfernt, obwohl derzeit kein Datum für ihre Entfernung geplant ist.

  • argparse:

    • Verschachtelte Argumentgruppen und verschachtelte gegenseitig ausschließende Gruppen sind veraltet.

    • Das Übergeben des undokumentierten Schlüsselwortarguments prefix_chars an add_argument_group() ist nun veraltet.

    • Der Typ-Konverter argparse.FileType ist veraltet.

  • builtins:

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

    • Derzeit akzeptiert Python numerische Literale, denen unmittelbar Schlüsselwörter folgen, z. B. 0in x, 1or x, 0if 1else 2. Dies ermöglicht verwirrende und mehrdeutige Ausdrücke wie [0x1for x in y] (was als [0x1 for x in y] oder [0x1f or x in y] interpretiert werden kann). Es wird eine Syntaxwarnung ausgegeben, wenn auf das numerische Literal unmittelbar eines der Schlüsselwörter and, else, for, if, in, is und or folgt. In einer zukünftigen Version wird dies zu einem Syntaxfehler geändert. (gh-87999)

    • Unterstützung für die Methode __index__() und __int__(), die einen Nicht-Int-Typ zurückgibt: diese Methoden müssen eine Instanz einer strengen Unterklasse von int zurückgeben.

    • Unterstützung für die Methode __float__(), die eine strenge Unterklasse von float zurückgibt: diese Methoden müssen eine Instanz von float zurückgeben.

    • Unterstützung für die Methode __complex__(), die eine strenge Unterklasse von complex zurückgibt: diese Methoden müssen eine Instanz von complex zurückgeben.

    • Delegation von int() an die Methode __trunc__().

    • Das Übergeben einer komplexen Zahl als Argument real oder imag im Konstruktor complex() ist nun veraltet; sie sollte nur als einzelnes 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: Verwenden Sie open() anstelle von codecs.open(). (gh-133038)

  • codeobject.co_lnotab: Verwenden Sie stattdessen die Methode codeobject.co_lines().

  • datetime:

    • utcnow(): Verwenden Sie datetime.datetime.now(tz=datetime.UTC).

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

  • gettext: Der Pluralwert muss eine ganze Zahl sein.

  • importlib:

    • Der Parameter debug_override von cache_from_source() ist veraltet: verwenden Sie stattdessen den Parameter optimization.

  • importlib.metadata:

    • Schnittstelle des EntryPoints-Tupels.

    • Implizites None bei Rückgabewerten.

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

  • mailbox: Die Verwendung von StringIO-Eingabe und Textmodus ist veraltet, verwenden Sie stattdessen BytesIO und Binärmodus.

  • os: Aufruf von os.register_at_fork() in einem Multithreading-Prozess.

  • pydoc.ErrorDuringImport: Die Übergabe eines Tupelwerts für den Parameter exc_info ist veraltet, verwenden Sie stattdessen eine Ausnahmeinstanz.

  • re: Für numerische Gruppennummern und Gruppennamen in regulären Ausdrücken werden nun strengere Regeln angewendet. Nur eine Sequenz von ASCII-Ziffern wird nun als numerische Referenz akzeptiert. Der Gruppenname in Byte-Mustern und Ersetzungszeichenfolgen darf nun nur ASCII-Buchstaben, Ziffern und Unterstriche enthalten. (Beigetragen von Serhiy Storchaka in gh-91760.)

  • Module sre_compile, sre_constants und sre_parse.

  • shutil: Das Parameter onerror von rmtree() ist in Python 3.12 veraltet; verwenden Sie stattdessen den Parameter onexc.

  • SSL-Optionen und -Protokolle

    • ssl.SSLContext ohne Protokollargument ist veraltet.

    • ssl.SSLContext: set_npn_protocols() und selected_npn_protocol() sind veraltet: verwenden Sie 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 erhalten, wird bis mindestens Python 3.17 ein Kompatibilitäts-Shim bereitgestellt. (Beigetragen von Jelle Zijlstra in gh-105499.)

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

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

    • splitattr()

    • splithost()

    • splitnport()

    • splitpasswd()

    • splitport()

    • splitquery()

    • splittag()

    • splittype()

    • splituser()

    • splitvalue()

    • to_bytes()

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

  • xml.etree.ElementTree: Das Testen des Wahrheitswerts eines Element ist veraltet. In einer zukünftigen Version wird dies immer True zurückgeben. Bevorzugen Sie explizite Tests mit len(elem) oder elem is not None.

  • sys._clear_type_cache() ist veraltet: verwenden Sie stattdessen sys._clear_internal_caches().

CPython Bytecode-Änderungen

  • Der `oparg` von YIELD_VALUE ist jetzt 1, wenn das Yield Teil eines Yield-From oder await ist, und 0 sonst. Der `oparg` von RESUME wurde geändert, um ein Bit hinzuzufügen, das angibt, ob die Ausnahme-Tiefe 1 ist, was zur Optimierung des Schließens von Generatoren erforderlich ist. (Beigetragen von Irit Katriel in gh-111354.)

C-API-Änderungen

Neue Funktionen

Geänderte C-APIs

Begrenzte C-API-Änderungen

Entfernte C-APIs

  • Entfernen Sie mehrere Funktionen, Makros, Variablen usw. mit Namen, die mit _Py oder _PY beginnen (die als privat gelten). Wenn Ihr Projekt von einer dieser Entfernungen betroffen ist und Sie glauben, dass die entfernte API verfügbar bleiben sollte, öffnen Sie bitte ein neues Issue, um eine öffentliche C-API zu beant সুপারিশ, und fügen Sie cc: @vstinner zu dem Issue hinzu, um Victor Stinner zu benachrichtigen. (Beigetragen von Victor Stinner in gh-106320.)

  • Entfernen Sie die in Python 3.0 deprecate alten Pufferprotokolle. Verwenden Sie stattdessen das Pufferprotokoll.

    • PyObject_CheckReadBuffer(): Verwenden Sie PyObject_CheckBuffer(), um zu prüfen, ob das Objekt das Pufferprotokoll unterstützt. Beachten Sie, dass PyObject_CheckBuffer() nicht garantiert, dass PyObject_GetBuffer() erfolgreich sein wird. Um zu prüfen, ob das Objekt tatsächlich lesbar ist, siehe das nächste Beispiel für PyObject_GetBuffer().

    • PyObject_AsCharBuffer(), PyObject_AsReadBuffer(): Verwenden Sie 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(): Verwenden Sie 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.)

  • Entfernen Sie verschiedene Funktionen, die in Python 3.9 deprecate wurden

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

      Warnung

      In PyObject_Call() müssen Positionsargumente 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 prüften und NULL für Positions- und Schlüsselwortargumente akzeptierten. Um PyEval_CallObjectWithKeywords(func, NULL, kwargs) durch PyObject_Call() zu ersetzen, übergeben Sie ein leeres Tupel als Positionsargumente mit PyTuple_New(0).

    • PyEval_CallFunction(): Verwenden Sie stattdessen PyObject_CallFunction().

    • PyEval_CallMethod(): Verwenden Sie stattdessen PyObject_CallMethod().

    • PyCFunction_Call(): Verwenden Sie stattdessen PyObject_Call().

    (Beigetragen von Victor Stinner in gh-105107.)

  • Entfernen Sie die folgenden alten Funktionen zur Konfiguration der Python-Initialisierung, die in Python 3.11 deprecate wurden

    Verwenden Sie die neue PyConfig API der Python-Initialisierungskonfiguration stattdessen (PEP 587), hinzugefügt zu Python 3.8. (Beigetragen von Victor Stinner in gh-105145.)

  • Entfernen Sie die Funktionen PyEval_AcquireLock() und PyEval_ReleaseLock(), die in Python 3.2 deprecate wurden. Sie aktualisierten den aktuellen Thread-Status nicht. Sie können ersetzt werden durch

    (Beigetragen von Victor Stinner in gh-105182.)

  • Entfernen Sie die Funktion PyEval_ThreadsInitialized(), die in Python 3.9 deprecate wurde. Seit Python 3.7 erstellt Py_Initialize() immer den GIL: der Aufruf von PyEval_InitThreads() tut nichts und PyEval_ThreadsInitialized() gibt immer einen Wert ungleich Null zurück. (Beigetragen von Victor Stinner in gh-105182.)

  • Entfernen Sie den Alias _PyInterpreterState_Get() zu PyInterpreterState_Get(), der zur Abwärtskompatibilität mit Python 3.8 beibehalten wurde. Das Projekt pythoncapi-compat kann verwendet werden, um PyInterpreterState_Get() unter Python 3.8 und älter zu erhalten. (Beigetragen von Victor Stinner in gh-106320.)

  • Entfernen Sie die private Funktion _PyObject_FastCall(): verwenden Sie stattdessen PyObject_Vectorcall(), das seit Python 3.8 verfügbar ist (PEP 590). (Beigetragen von Victor Stinner in gh-106023.)

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

  • Entfernen Sie die undokumentierte Konstante PY_TIMEOUT_MAX aus der begrenzten C-API. (Beigetragen von Victor Stinner in gh-110014.)

  • Entfernen Sie die alten Trashcan-Makros Py_TRASHCAN_SAFE_BEGIN und Py_TRASHCAN_SAFE_END. Ersetzen Sie beide durch die neuen Makros Py_TRASHCAN_BEGIN und Py_TRASHCAN_END. (Beigetragen von Irit Katriel in gh-105111.)

Deprecate C APIs

Zur Entfernung in Python 3.14 vorgesehen

Zur Entfernung in Python 3.15 vorgesehen

Zur Entfernung in Python 3.16 vorgesehen

  • Die gebündelte Kopie von libmpdec.

Anstehende Entfernung in Python 3.18

Zur Entfernung in zukünftigen Versionen vorgesehen

Die folgenden APIs sind veraltet und werden entfernt, obwohl derzeit kein Termin für ihre Entfernung geplant ist.

Build-Änderungen

  • arm64-apple-ios und arm64-apple-ios-simulator sind beide nun PEP 11 Tier 3 Plattformen. (PEP 730 geschrieben und Implementierung beigetragen von Russell Keith-Magee in gh-114099.)

  • aarch64-linux-android und x86_64-linux-android sind jetzt beide PEP 11 Tier-3-Plattformen. (PEP 738 geschrieben und Implementierung beigesteuert von Malcolm Smith in gh-116622.)

  • wasm32-wasi ist jetzt eine PEP 11 Tier-2-Plattform. (Beigesteuert von Brett Cannon in gh-115192.)

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

  • Das Kompilieren von CPython erfordert nun einen Compiler mit Unterstützung für die C11-Atomic-Bibliothek, GCC-eingebaute Atomic-Funktionen oder MSVC-interlocked-Intrinsics.

  • Autoconf 2.71 und aclocal 1.16.5 sind nun erforderlich, um das configure-Skript neu zu generieren. (Beigesteuert von Christian Heimes in gh-89886 und von Victor Stinner in gh-112090.)

  • SQLite 3.15.2 oder neuer ist erforderlich, um das sqlite3-Erweiterungsmodul zu kompilieren. (Beigesteuert von Erlend Aasland in gh-105875.)

  • CPython bündelt jetzt standardmäßig die mimalloc-Bibliothek. Sie steht unter der MIT-Lizenz; siehe mimalloc license. Das gebündelte mimalloc enthält benutzerdefinierte Änderungen, siehe gh-113141 für Details. (Beigesteuert von Dino Viehland in gh-109914.)

  • Die configure-Option --with-system-libmpdec hat nun standardmäßig yes. Die gebündelte Kopie von libmpdec wird in Python 3.16 entfernt.

  • Mit configure --with-trace-refs (Referenzverfolgung) erstelltes Python ist nun ABI-kompatibel mit dem Python-Release-Build und dem Debug-Build. (Beigesteuert von Victor Stinner in gh-108634.)

  • Auf POSIX-Systemen enthalten die pkg-config (.pc)-Dateinamen nun die ABI-Flags. Zum Beispiel generiert der Free-Threaded-Build python-3.13t.pc und der Debug-Build generiert 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 nun mit der Limited C API erstellt. (Beigesteuert von Victor Stinner in gh-85283.)

Portierung auf Python 3.13

Dieser Abschnitt listet zuvor beschriebene Änderungen und weitere Fehlerbehebungen auf, die möglicherweise Änderungen an Ihrem Code erfordern.

Änderungen in der Python-API

  • PEP 667 führt mehrere Änderungen an der Semantik von locals() und f_locals ein.

    • Der Aufruf von locals() in einem optimierten Gültigkeitsbereich erzeugt nun bei jedem Aufruf einen unabhängigen Schnappschuss und aktualisiert daher nicht mehr implizit zuvor zurückgegebene Referenzen. Das Erhalten des Legacy-CPython-Verhaltens erfordert nun explizite Aufrufe, um das anfänglich zurückgegebene Wörterbuch mit den Ergebnissen nachfolgender Aufrufe von locals() zu aktualisieren. Codeausführungsfunktionen, die implizit auf locals() abzielen (wie exec und eval), müssen einen expliziten Namespace übergeben, um auf ihre Ergebnisse in einem optimierten Gültigkeitsbereich zuzugreifen. (Geändert als Teil von PEP 667.)

    • Der Aufruf von locals() aus einer Comprehension im Modul- oder Klassengültigkeitsbereich (einschließlich über exec oder eval) verhält sich wieder so, als würde die Comprehension als unabhängige verschachtelte Funktion ausgeführt (d.h. die lokalen Variablen aus dem übergeordneten Gültigkeitsbereich sind nicht enthalten). In Python 3.12 wurde dies geändert, um die lokalen Variablen aus dem übergeordneten Gültigkeitsbereich beim Implementieren von PEP 709 einzuschließen. (Geändert als Teil von PEP 667.)

    • Der Zugriff auf FrameType.f_locals in einem optimierten Gültigkeitsbereich gibt nun einen Write-Through-Proxy zurück, anstatt eines Schnappschusses, der zu schlecht spezifizierten Zeiten aktualisiert wird. Wenn ein Schnappschuss gewünscht ist, muss dieser explizit mit dict oder der .copy()-Methode des Proxys erstellt werden. (Geändert als Teil von PEP 667.)

  • functools.partial gibt nun eine FutureWarning aus, wenn es als Methode verwendet wird. Das Verhalten wird sich in zukünftigen Python-Versionen ändern. Wickeln Sie es in staticmethod(), wenn Sie das alte Verhalten beibehalten möchten. (Beigesteuert von Serhiy Storchaka in gh-121027.)

  • Eine OSError wird nun von getpass.getuser() bei jedem Fehler bei der Abfrage eines Benutzernamens ausgelöst, anstelle von ImportError auf Nicht-Unix-Plattformen oder KeyError auf Unix-Plattformen, bei denen die Passwortdatenbank leer ist.

  • Der Wert des mode-Attributs von gzip.GzipFile ist nun ein String ('rb' oder 'wb') anstelle einer Ganzzahl (1 oder 2). Der Wert des mode-Attributs des lesbaren dateiähnlichen Objekts, das von zipfile.ZipFile.open() zurückgegeben wird, ist nun 'rb' anstelle von 'r'. (Beigesteuert von Serhiy Storchaka in gh-115961.)

  • mailbox.Maildir ignoriert nun Dateien mit einem führenden Punkt (.). (Beigesteuert von Zackery Spytz in gh-65559.)

  • pathlib.Path.glob() und rglob() geben nun sowohl Dateien als auch Verzeichnisse zurück, wenn ein Muster angegeben wird, das mit „**“ endet, anstatt nur Verzeichnisse. Fügen Sie einen abschließenden Schrägstrich hinzu, um das vorherige Verhalten beizubehalten und nur Verzeichnisse abzugleichen.

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

    Jede Bibliothek oder Anwendung, die ein benutzerdefiniertes Modul _thread bereitstellt, muss _is_main_interpreter() bereitstellen, genau wie die anderen „privaten“ Attribute des Moduls. (gh-112826.)

Änderungen in der C-API

  • Python.h schließt nicht mehr die Standard-Headerdatei <ieeefp.h> ein. Sie wurde für die Funktion finite() eingebunden, die nun von der Headerdatei <math.h> bereitgestellt wird. Sie sollte nun explizit eingebunden werden, falls erforderlich. Entfernen Sie auch das Makro HAVE_IEEEFP_H. (Beigesteuert von Victor Stinner in gh-108765.)

  • Python.h schließt nicht mehr diese Standard-Headerdateien ein: <time.h>, <sys/select.h> und <sys/time.h>. Falls erforderlich, sollten diese nun explizit eingebunden werden. Zum Beispiel stellt <time.h> die Funktionen clock() und gmtime() bereit, <sys/select.h> stellt die Funktion select() bereit und <sys/time.h> stellt die Funktionen futimes(), gettimeofday() und setitimer() bereit. (Beigesteuert von Victor Stinner in gh-108765.)

  • Unter Windows schließt Python.h nicht mehr die Standard-Headerdatei <stddef.h> ein. Falls erforderlich, sollte diese nun explizit eingebunden werden. Sie stellt zum Beispiel die Funktion offsetof() sowie die Typen size_t und ptrdiff_t bereit. Das explizite Einbinden von <stddef.h> war für alle anderen Plattformen bereits erforderlich, das Makro HAVE_STDDEF_H ist nur unter Windows definiert. (Beigesteuert von Victor Stinner in gh-108765.)

  • Wenn das Makro Py_LIMITED_API definiert ist, werden die Makros Py_BUILD_CORE, Py_BUILD_CORE_BUILTIN und Py_BUILD_CORE_MODULE nun von <Python.h> undefiniert. (Beigesteuert von Victor Stinner in gh-85283.)

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

    Eine tp_dealloc-Funktion, die die alten Makros verwendet, wie zum Beispiel

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

    sollte wie folgt 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
    }
    

    Beachten Sie, dass Py_TRASHCAN_BEGIN ein zweites Argument hat, das die Deallocationsfunktion sein sollte, in der es sich befindet. Die neuen Makros wurden in Python 3.8 hinzugefügt und die alten Makros wurden in Python 3.11 als veraltet markiert. (Beigesteuert von Irit Katriel in gh-105111.)

Änderungen bei Regressionstests

  • Python, das mit configure --with-pydebug kompiliert wurde, unterstützt nun die Kommandozeilenoption -X presite=package.module. Wenn sie verwendet wird, gibt sie ein Modul an, das früh im Lebenszyklus des Interpreters importiert werden sollte, bevor site.py ausgeführt wird. (Beigesteuert von Łukasz Langa in gh-110769.)