Was ist neu in Python 3.11

Editor:

Pablo Galindo Salgado

Dieser Artikel erklärt die neuen Features in Python 3.11 im Vergleich zu 3.10. Python 3.11 wurde am 24. Oktober 2022 veröffentlicht. Die vollständigen Details finden Sie im Changelog.

Zusammenfassung – Release-Highlights

  • Python 3.11 ist 10-60% schneller als Python 3.10. Im Durchschnitt haben wir eine Beschleunigung um das 1,25-fache auf der Standard-Benchmark-Suite gemessen. Details finden Sie unter Schnelleres CPython.

Neue Syntaxfunktionen

Neue eingebaute Funktionen

Neue Module der Standardbibliothek

Interpreter-Verbesserungen

Neue Typ-Annotation-Funktionen

Wichtige Deprecations, Entfernungen und Einschränkungen

Neue Funktionen

PEP 657: Granulare Fehlerstandorte in Tracebacks

Beim Drucken von Tracebacks zeigt der Interpreter nun auf den genauen Ausdruck, der den Fehler verursacht hat, anstatt nur auf die Zeile. Zum Beispiel

Traceback (most recent call last):
  File "distance.py", line 11, in <module>
    print(manhattan_distance(p1, p2))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "distance.py", line 6, in manhattan_distance
    return abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
                           ^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'x'

Frühere Versionen des Interpreters zeigten nur die Zeile an, was unklar machte, welches Objekt None war. Diese verbesserten Fehler können auch bei tief verschachtelten dict-Objekten und mehreren Funktionsaufrufen hilfreich sein.

Traceback (most recent call last):
  File "query.py", line 37, in <module>
    magic_arithmetic('foo')
  File "query.py", line 18, in magic_arithmetic
    return add_counts(x) / 25
           ^^^^^^^^^^^^^
  File "query.py", line 24, in add_counts
    return 25 + query_user(user1) + query_user(user2)
                ^^^^^^^^^^^^^^^^^
  File "query.py", line 32, in query_user
    return 1 + query_count(db, response['a']['b']['c']['user'], retry=True)
                               ~~~~~~~~~~~~~~~~~~^^^^^
TypeError: 'NoneType' object is not subscriptable

Sowie komplexe arithmetische Ausdrücke

Traceback (most recent call last):
  File "calculation.py", line 54, in <module>
    result = (x / y / z) * (a / b / c)
              ~~~~~~^~~
ZeroDivisionError: division by zero

Zusätzlich werden die von der verbesserten Traceback-Funktion verwendeten Informationen über eine allgemeine API bereitgestellt, die verwendet werden kann, um Bytecode- Instruktionen mit dem Quellcode-Standort zu korrelieren. Diese Informationen können abgerufen werden mit

Weitere Details finden Sie in PEP 657. (Beigetragen von Pablo Galindo, Batuhan Taskaya und Ammar Askar in bpo-43950.)

Hinweis

Diese Funktion erfordert das Speichern von Spaltenpositionen in Code Objects, was zu einer geringfügigen Erhöhung des Speicherverbrauchs des Interpreters und des Speicherplatzbedarfs für kompilierte Python-Dateien führen kann. Um die zusätzlichen Informationen nicht zu speichern und das Drucken der zusätzlichen Traceback-Informationen zu deaktivieren, verwenden Sie die Kommandozeilenoption -X no_debug_ranges oder die Umgebungsvariable PYTHONNODEBUGRANGES.

PEP 654: Exception Groups und except*

PEP 654 führt Sprachfeatures ein, die es einem Programm ermöglichen, mehrere unabhängige Exceptions gleichzeitig auszulösen und zu behandeln. Die eingebauten Typen ExceptionGroup und BaseExceptionGroup ermöglichen das Gruppieren von Exceptions und deren gemeinsames Auslösen, und die neue except*-Syntax erweitert except, um Untergruppen von Exception-Gruppen abzugleichen.

Weitere Details finden Sie in PEP 654.

(Beigetragen von Irit Katriel in bpo-45292. PEP geschrieben von Irit Katriel, Yury Selivanov und Guido van Rossum.)

PEP 678: Exceptions können mit Notizen angereichert werden

Die Methode add_note() wird zu BaseException hinzugefügt. Sie kann verwendet werden, um Exceptions mit Kontextinformationen anzureichern, die zum Zeitpunkt der Auslösung der Exception nicht verfügbar sind. Die hinzugefügten Notizen erscheinen im Standard-Traceback.

Weitere Details finden Sie in PEP 678.

(Beigetragen von Irit Katriel in bpo-45607. PEP geschrieben von Zac Hatfield-Dodds.)

Verbesserungen am Windows py.exe Launcher

Die im Lieferumfang von Python 3.11 enthaltene Kopie des Python-Installationsmanagers wurde erheblich aktualisiert. Sie unterstützt nun die in PEP 514 definierte Firmen-/Tag-Syntax mit dem Argument -V:<company>/<tag> anstelle der begrenzten -<major>.<minor>. Dies ermöglicht das Starten von Distributionen, die nicht PythonCore sind, die auf python.org gehostet wird.

Bei Verwendung von -V:-Selektoren kann entweder die Firma oder der Tag weggelassen werden, aber alle Installationen werden durchsucht. Zum Beispiel wählt -V:OtherPython/ den "besten" für OtherPython registrierten Tag, während -V:3.11 oder -V:/3.11 die "beste" Distribution mit dem Tag 3.11 wählt.

Bei Verwendung der Legacy-Argumente -<major>, -<major>.<minor>, -<major>-<bitness> oder -<major>.<minor>-<bitness> sollte das gesamte bisherige Verhalten beibehalten werden, und es werden nur Releases von PythonCore ausgewählt. Das Suffix -64 impliziert nun jedoch "nicht 32-Bit" (nicht notwendigerweise x86-64), da es mehrere unterstützte 64-Bit-Plattformen gibt. 32-Bit-Laufzeiten werden durch Überprüfung des Runtime-Tags auf ein -32-Suffix erkannt. Alle Python-Releases seit 3.5 enthalten dies in ihren 32-Bit-Builds.

Andere Sprachänderungen

  • Hinzugefügt wurde die Kommandozeilenoption -P und die Umgebungsvariable PYTHONSAFEPATH, die das automatische Voranstellen des Skriptverzeichnisses zu sys.path beim Ausführen eines Skripts oder des aktuellen Verzeichnisses beim Verwenden von -c und -m deaktiviert. Dies stellt sicher, dass nur stdlib- und installierte Module über import gefunden werden, und vermeidet das versehentliche oder böswillige Überschatten von Modulen mit denen in einem lokalen (und typischerweise schreibbaren) Verzeichnis. (Beigetragen von Victor Stinner in gh-57684.)

  • Eine Option "z" wurde zur Format Specification Mini-Language hinzugefügt, die negative Nullen nach der Rundung auf die Formatpräzision in positive Nullen umwandelt. Weitere Details finden Sie in PEP 682. (Beigetragen von John Belmonte in gh-90153.)

  • Bytes werden nicht mehr auf sys.path akzeptiert. Die Unterstützung brach irgendwo zwischen Python 3.2 und 3.6, ohne dass es jemand bemerkte, bis nach der Veröffentlichung von Python 3.10.0. Darüber hinaus wäre die Wiederherstellung der Unterstützung aufgrund von Interaktionen zwischen -b und sys.path_importer_cache bei einer Mischung aus str und bytes Schlüsseln problematisch. (Beigetragen von Thomas Grainger in gh-91181.)

Andere CPython Implementierungsänderungen

  • Die speziellen Methoden __complex__() für complex und __bytes__() für bytes werden zur Unterstützung der Protokolle typing.SupportsComplex und typing.SupportsBytes implementiert. (Beigetragen von Mark Dickinson und Donghee Na in bpo-24234.)

  • siphash13 wurde als neuer interner Hashing-Algorithmus hinzugefügt. Er hat ähnliche Sicherheitseigenschaften wie siphash24, ist aber für lange Eingaben etwas schneller. str, bytes und einige andere Typen verwenden ihn nun als Standardalgorithmus für hash(). PEP 552 Hash-basierte .pyc-Dateien verwenden nun ebenfalls siphash13. (Beigetragen von Inada Naoki in bpo-29410.)

  • Wenn eine aktive Ausnahme mit einer raise-Anweisung ohne Parameter erneut ausgelöst wird, ist nun immer der Traceback, der dieser Ausnahme zugeordnet ist, sys.exc_info()[1].__traceback__. Das bedeutet, dass Änderungen am Traceback in der aktuellen except-Klausel in der erneut ausgelösten Ausnahme widergespiegelt werden. (Beigetragen von Irit Katriel in bpo-45711.)

  • Die Darstellung von behandelten Ausnahmen im Interpreterzustand (auch bekannt als exc_info oder _PyErr_StackItem) enthält nun nur noch das Feld exc_value; exc_type und exc_traceback wurden entfernt, da sie aus exc_value abgeleitet werden können. (Beigetragen von Irit Katriel in bpo-45711.)

  • Für den Windows-Installer wurde eine neue Option in der Kommandozeile, AppendPath, hinzugefügt. Sie verhält sich ähnlich wie PrependPath, fügt aber die Installations- und Skriptverzeichnisse am Ende hinzu, anstatt sie voranzustellen. (Beigetragen von Bastian Neuburger in bpo-44934.)

  • Das Feld PyConfig.module_search_paths_set muss nun auf 1 gesetzt werden, damit die Initialisierung PyConfig.module_search_paths zum Initialisieren von sys.path verwendet. Andernfalls berechnet die Initialisierung den Pfad neu und ersetzt alle Werte, die zu module_search_paths hinzugefügt wurden.

  • Die Ausgabe der Option --help passt nun in 50 Zeilen/80 Spalten. Informationen zu Python-Umgebungsvariablen und -X-Optionen sind nun über die entsprechenden Flags --help-env und --help-xoptions sowie mit dem neuen --help-all verfügbar. (Beigetragen von Éric Araujo in bpo-46142.)

  • Die Konvertierung zwischen int und str in anderen Basen als 2 (binär), 4, 8 (oktal), 16 (hexadezimal) oder 32, wie z. B. Basis 10 (dezimal), löst nun einen ValueError aus, wenn die Anzahl der Ziffern in Zeichenkettenform über einem Grenzwert liegt, um potenzielle Denial-of-Service-Angriffe aufgrund der algorithmischen Komplexität zu vermeiden. Dies ist eine Abhilfemaßnahme für CVE 2020-10735. Dieser Grenzwert kann über die Umgebungsvariable, ein Kommandozeilenflag oder sys-APIs konfiguriert oder deaktiviert werden. Siehe die Dokumentation zur Begrenzung der Zeichenkettenlänge bei der Ganzzahlkonvertierung. Der Standardgrenzwert beträgt 4300 Ziffern in Zeichenkettenform.

Neue Module

Verbesserte Module

asyncio

contextlib

  • Ein nicht parallelsicher Kontextmanager chdir() wurde hinzugefügt, um das aktuelle Arbeitsverzeichnis zu ändern und es beim Beenden wiederherzustellen. Ein einfacher Wrapper um chdir(). (Beigetragen von Filipe Laíns in bpo-25625)

dataclasses

  • Die Prüfung der Standard-Mutabilität von Feldern wurde geändert, sodass nur noch Defaults zugelassen werden, die hashbar sind, anstatt jedes Objekt, das keine Instanz von dict, list oder set ist. (Beigetragen von Eric V. Smith in bpo-44674.)

datetime

enum

  • Umbenannt von EnumMeta zu EnumType (EnumMeta wurde als Alias beibehalten).

  • Hinzugefügt wurde StrEnum, mit Mitgliedern, die als (und sein müssen) Strings verwendet werden können.

  • Hinzugefügt wurde ReprEnum, das nur die __repr__() der Mitglieder modifiziert, während es für __str__() und __format__() (verwendet von str(), format() und f-strings) deren literale Werte (anstatt Namen) zurückgibt.

  • Enum.__format__() (der Standard für format(), str.format() und f-strings) wurde geändert, um immer das gleiche Ergebnis wie Enum.__str__() zu liefern: für von ReprEnum abgeleitete Enums ist dies der Wert des Mitglieds; für alle anderen Enums ist es der Name der Enum und des Mitglieds (z. B. Color.RED).

  • Ein neuer Klassenparameter *boundary* wurde zu Flag-Enums und dem Enum FlagBoundary mit seinen Optionen hinzugefügt, um zu steuern, wie mit Flag-Werten außerhalb des Bereichs umgegangen wird.

  • Der Enum-Decorator verify() und das Enum EnumCheck mit seinen Optionen wurden hinzugefügt, um Enum-Klassen anhand mehrerer spezifischer Einschränkungen zu überprüfen.

  • Die Decorator member() und nonmember() wurden hinzugefügt, um sicherzustellen, dass das dekorierte Objekt in ein Enum-Mitglied umgewandelt wird/wird nicht.

  • Der Decorator property() wurde hinzugefügt, der wie property() funktioniert, außer bei Enums. Verwenden Sie diesen anstelle von types.DynamicClassAttribute().

  • Der Enum-Decorator global_enum() wurde hinzugefügt, der __repr__() und __str__() anpasst, um Werte als Mitglieder ihres Moduls und nicht als Klassen-Members anzuzeigen. Zum Beispiel 're.ASCII' für das ASCII-Mitglied von re.RegexFlag anstelle von 'RegexFlag.ASCII'.

  • Flag wurde erweitert, um len(), Iteration und in/not in auf seine Mitglieder zu unterstützen. Zum Beispiel funktioniert Folgendes jetzt: len(AFlag(3)) == 2 and list(AFlag(3)) == (AFlag.ONE, AFlag.TWO)

  • Enum und Flag wurden so geändert, dass Mitglieder nun vor dem Aufruf von __init_subclass__() definiert werden; dir() schließt nun Methoden usw. von gemischten Datentypen ein.

  • Flag wurde so geändert, dass nur noch Primärwerte (Zweierpotenzen) als kanonisch betrachtet werden, während zusammengesetzte Werte (3, 6, 10 usw.) als Aliase betrachtet werden; invertierte Flags werden zu ihrem positiven Äquivalent umgewandelt.

fcntl

  • Unter FreeBSD werden die Flags F_DUP2FD und F_DUP2FD_CLOEXEC unterstützt, wobei ersteres der Verwendung von dup2 entspricht, während letzteres zusätzlich das Flag FD_CLOEXEC setzt.

fractions

  • Unterstützung für die PEP 515-seitige Initialisierung von Fraction aus Strings. (Beigetragen von Sergey B Kirpichev in bpo-44258.)

  • Fraction implementiert nun eine __int__-Methode, sodass eine Prüfung isinstance(some_fraction, typing.SupportsInt) erfolgreich ist. (Beigetragen von Mark Dickinson in bpo-44547.)

functools

  • functools.singledispatch() unterstützt nun types.UnionType und typing.Union als Annotationen für das Dispatch-Argument.

    >>> from functools import singledispatch
    >>> @singledispatch
    ... def fun(arg, verbose=False):
    ...     if verbose:
    ...         print("Let me just say,", end=" ")
    ...     print(arg)
    ...
    >>> @fun.register
    ... def _(arg: int | float, verbose=False):
    ...     if verbose:
    ...         print("Strength in numbers, eh?", end=" ")
    ...     print(arg)
    ...
    >>> from typing import Union
    >>> @fun.register
    ... def _(arg: Union[list, set], verbose=False):
    ...     if verbose:
    ...         print("Enumerate this:")
    ...     for i, elem in enumerate(arg):
    ...         print(i, elem)
    ...
    

    (Beigetragen von Yurii Karabas in bpo-46014.)

gzip

  • Die Funktion gzip.compress() ist nun schneller, wenn sie mit dem Argument mtime=0 verwendet wird, da die Komprimierung vollständig an eine einzige zlib.compress()-Operation delegiert wird. Es gibt eine Nebenwirkung dieser Änderung: Der Gzip-Datei-Header enthält ein „OS“-Byte in seinem Header. Dies wurde traditionell immer mit einem Wert von 255, der „unbekannt“ darstellt, vom gzip-Modul gesetzt. Nun, bei der Verwendung von compress() mit mtime=0, kann dieser Wert von der zugrunde liegenden zlib C-Bibliothek, mit der Python verknüpft wurde, geändert werden. (Siehe gh-112346 für Details zur Nebenwirkung.)

hashlib

  • hashlib.blake2b() und hashlib.blake2s() bevorzugen nun libb2 gegenüber der eigenen Kopie von Python. (Beigetragen von Christian Heimes in bpo-47095.)

  • Das interne Modul _sha3 mit SHA3- und SHAKE-Algorithmen verwendet nun *tiny_sha3* anstelle des *Keccak Code Package*, um Code- und Binärgrößen zu reduzieren. Das Modul hashlib bevorzugt optimierte SHA3- und SHAKE-Implementierungen von OpenSSL. Die Änderung betrifft nur Installationen ohne OpenSSL-Unterstützung. (Beigetragen von Christian Heimes in bpo-47098.)

  • Hinzugefügt wurde hashlib.file_digest(), eine Hilfsfunktion zum effizienten Hashing von Dateien oder dateiähnlichen Objekten. (Beigetragen von Christian Heimes in gh-89313.)

IDLE und idlelib

  • Syntaxhervorhebung für .pyi-Dateien angewendet. (Beigetragen von Alex Waygood und Terry Jan Reedy in bpo-45447.)

  • Prompts beim Speichern der Shell mit Eingaben und Ausgaben enthalten. (Beigetragen von Terry Jan Reedy in gh-95191.)

inspect

locale

logging

  • Hinzugefügt wurde getLevelNamesMapping(), um eine Zuordnung von Logging-Level-Namen (z. B. 'CRITICAL') zu den Werten ihrer entsprechenden Logging-Level (z. B. 50, standardmäßig) zurückzugeben. (Beigetragen von Andrei Kulakovin in gh-88024.)

  • Zu SysLogHandler wurde die Methode createSocket() hinzugefügt, um sie an SocketHandler.createSocket() anzupassen. Sie wird automatisch während der Handler-Initialisierung und beim Senden eines Ereignisses aufgerufen, wenn kein aktiver Socket vorhanden ist. (Beigetragen von Kirill Pinchuk in gh-88457.)

math

  • Hinzugefügt wurde math.exp2(): gibt 2 hoch x zurück. (Beigetragen von Gideon Mitchell in bpo-45917.)

  • Hinzugefügt wurde math.cbrt(): gibt die Kubikwurzel von x zurück. (Beigetragen von Ajith Ramachandran in bpo-44357.)

  • Das Verhalten zweier Eckfälle von math.pow() wurde geändert, um mit der IEEE 754-Spezifikation konsistent zu sein. Die Operationen math.pow(0.0, -math.inf) und math.pow(-0.0, -math.inf) geben nun inf zurück. Zuvor lösten sie einen ValueError aus. (Beigetragen von Mark Dickinson in bpo-44339.)

  • Der Wert math.nan ist nun immer verfügbar. (Beigetragen von Victor Stinner in bpo-46917.)

operator

  • Eine neue Funktion operator.call wurde hinzugefügt, so dass operator.call(obj, *args, **kwargs) == obj(*args, **kwargs) gilt. (Beigetragen von Antony Lee in bpo-44019.)

os

  • Unter Windows verwendet os.urandom() nun BCryptGenRandom() anstelle von CryptGenRandom(), das als veraltet gilt. (Beigetragen von Donghee Na in bpo-44611.)

pathlib

re

  • Atomare Gruppierung ((?>...)) und possessive Quantifizierer (*+, ++, ?+, {m,n}+) werden nun in regulären Ausdrücken unterstützt. (Beigetragen von Jeffrey C. Jacobs und Serhiy Storchaka in bpo-433030.)

shutil

socket

  • CAN-Socket-Unterstützung für NetBSD hinzugefügt. (Beigetragen von Thomas Klausner in bpo-30512.)

  • create_connection() hat eine Option, um im Falle eines Verbindungsfehlers eine ExceptionGroup mit allen Fehlern auszulösen, anstatt nur den letzten Fehler auszulösen. (Beigetragen von Irit Katriel in bpo-29980.)

sqlite3

string

sys

  • sys.exc_info() leitet nun die Felder type und traceback vom value (der Ausnahmeinstanz) ab. Wenn also eine Ausnahme während der Verarbeitung geändert wird, spiegeln sich die Änderungen in den Ergebnissen nachfolgender Aufrufe von exc_info() wider. (Beigetragen von Irit Katriel in bpo-45711.)

  • Hinzugefügt wurde sys.exception(), die die aktive Ausnahmeinstanz zurückgibt (äquivalent zu sys.exc_info()[1]). (Beigetragen von Irit Katriel in bpo-46328.)

  • Die Flagge sys.flags.safe_path wurde hinzugefügt. (Beigetragen von Victor Stinner in gh-57684.)

sysconfig

  • Drei neue Installationsschemata (posix_venv, nt_venv und venv) wurden hinzugefügt und werden verwendet, wenn Python neue virtuelle Umgebungen erstellt oder wenn es aus einer virtuellen Umgebung ausgeführt wird. Die ersten beiden Schemata (posix_venv und nt_venv) sind OS-spezifisch für Nicht-Windows und Windows, venv ist im Wesentlichen ein Alias für eines davon, je nach OS, auf dem Python läuft. Dies ist nützlich für nachgelagerte Verteiler, die sysconfig.get_preferred_scheme() modifizieren. Drittanbieter-Code, der neue virtuelle Umgebungen erstellt, sollte das neue venv-Installationsschema zur Pfadbestimmung verwenden, ebenso wie venv. (Beigetragen von Miro Hrončok in bpo-45413.)

tempfile

  • SpooledTemporaryFile-Objekte implementieren nun vollständig die Methoden von io.BufferedIOBase oder io.TextIOBase (abhängig vom Dateimodus). Dies ermöglicht es ihnen, korrekt mit APIs zu arbeiten, die Dateiobjekte erwarten, wie z. B. Kompressionsmodule. (Beigetragen von Carey Metcalfe in gh-70363.)

threading

  • Unter Unix verwendet die Methode threading.Lock.acquire() nun die monotone Uhr (time.CLOCK_MONOTONIC) für das Timeout, anstatt die Systemuhr (time.CLOCK_REALTIME) zu verwenden, um nicht von Systemuhränderungen beeinflusst zu werden, sofern die Funktion sem_clockwait() in der C-Bibliothek verfügbar ist (glibc 2.30 und neuer). (Beigetragen von Victor Stinner in bpo-41710.)

time

  • Unter Unix verwendet time.sleep() nun die Funktion clock_nanosleep() oder nanosleep(), falls verfügbar, die eine Auflösung von 1 Nanosekunde (10-9 Sekunden) hat, anstatt select() zu verwenden, das eine Auflösung von 1 Mikrosekunde (10-6 Sekunden) hat. (Beigetragen von Benjamin Szőke und Victor Stinner in bpo-21302.)

  • Unter Windows 8.1 und neuer verwendet time.sleep() nun einen wartbaren Timer, der auf Hochleistungs-Timern basiert und eine Auflösung von 100 Nanosekunden (10-7 Sekunden) hat. Zuvor hatte er eine Auflösung von 1 Millisekunde (10-3 Sekunden). (Beigetragen von Benjamin Szőke, Donghee Na, Eryk Sun und Victor Stinner in bpo-21302 und bpo-45429.)

tkinter

  • Die Methode info_patchlevel() wurde hinzugefügt, die die exakte Version der Tcl-Bibliothek als Named Tuple ähnlich wie sys.version_info zurückgibt. (Beigetragen von Serhiy Storchaka in gh-91827.)

traceback

typing

Für größere Änderungen siehe Neue Features im Zusammenhang mit Typ-Hinweisen.

  • Hinzugefügt wurden typing.assert_never() und typing.Never. typing.assert_never() ist nützlich, um einen Typ-Checker zu bitten zu bestätigen, dass eine Codezeile nicht erreichbar ist. Zur Laufzeit löst sie einen AssertionError aus. (Beigetragen von Jelle Zijlstra in gh-90633.)

  • Hinzugefügt wurde typing.reveal_type(). Dies ist nützlich, um einen Typ-Checker zu fragen, welchen Typ er für einen gegebenen Ausdruck abgeleitet hat. Zur Laufzeit gibt es den Typ des empfangenen Wertes aus. (Beigetragen von Jelle Zijlstra in gh-90572.)

  • Hinzugefügt wurde typing.assert_type(). Dies ist nützlich, um einen Typ-Checker zu bitten zu bestätigen, dass der von ihm für einen gegebenen Ausdruck abgeleitete Typ mit dem angegebenen Typ übereinstimmt. Zur Laufzeit gibt es einfach den empfangenen Wert zurück. (Beigetragen von Jelle Zijlstra in gh-90638.)

  • typing.TypedDict-Typen können nun generisch sein. (Beigetragen von Samodya Abeysiriwardane in gh-89026.)

  • NamedTuple-Typen können nun generisch sein. (Beigetragen von Serhiy Storchaka in bpo-43923.)

  • Das Unterklassifizieren von typing.Any ist nun erlaubt. Dies ist nützlich, um Typ-Checker-Fehler im Zusammenhang mit stark dynamischen Klassen, wie z.B. Mocks, zu vermeiden. (Beigetragen von Shantanu Jain in gh-91154.)

  • Der Dekorator typing.final() setzt nun das Attribut __final__ auf dem dekorierten Objekt. (Beigetragen von Jelle Zijlstra in gh-90500.)

  • Die Funktion typing.get_overloads() kann zur Inspektion von Überladungen einer Funktion verwendet werden. typing.clear_overloads() kann verwendet werden, um alle registrierten Überladungen einer Funktion zu löschen. (Beigetragen von Jelle Zijlstra in gh-89263.)

  • Die Methode __init__() von Protocol-Unterklassen wird nun beibehalten. (Beigetragen von Adrian Garcia Badarasco in gh-88970.)

  • Die Darstellung leerer Tupeltypen (Tuple[()]) wurde vereinfacht. Dies wirkt sich auf die Introspektion aus, z. B. evaluiert get_args(Tuple[()]) nun zu () anstelle von ((),). (Beigetragen von Serhiy Storchaka in gh-91137.)

  • Lockerung der Laufzeitanforderungen für Typ-Annotationen durch Entfernen der Callable-Prüfung in der privaten Funktion typing._type_check. (Beigetragen von Gregory Beauregard in gh-90802.)

  • typing.get_type_hints() unterstützt nun das Auswerten von Strings als Vorwärtsreferenzen in PEP 585 generische Aliase. (Beigetragen von Niklas Rosenstein in gh-85542.)

  • typing.get_type_hints() fügt nun keine Optional mehr zu Parametern mit None als Standardwert hinzu. (Beigetragen von Nikita Sobolev in gh-90353.)

  • typing.get_type_hints() unterstützt nun das Auswerten von nackten, stringifizierten ClassVar-Annotationen. (Beigetragen von Gregory Beauregard in gh-90711.)

  • typing.no_type_check() modifiziert nun keine externen Klassen und Funktionen mehr. Es markiert auch nun korrekt Classmethods als nicht zu überprüfende Typen. (Beigetragen von Nikita Sobolev in gh-90729.)

unicodedata

  • Die Unicode-Datenbank wurde auf Version 14.0.0 aktualisiert. (Beigetragen von Benjamin Peterson in bpo-45190.)

unittest

venv

  • Wenn neue virtuelle Python-Umgebungen erstellt werden, wird das sysconfig-Installationsschema venv verwendet, um die Pfade innerhalb der Umgebung zu bestimmen. Wenn Python in einer virtuellen Umgebung ausgeführt wird, ist dasselbe Installationsschema der Standard. Das bedeutet, dass nachgelagerte Verteiler das Standard-Sysconfig-Installationsschema ändern können, ohne das Verhalten von virtuellen Umgebungen zu ändern. Drittanbieter-Code, der ebenfalls neue virtuelle Umgebungen erstellt, sollte dasselbe tun. (Beigetragen von Miro Hrončok in bpo-45413.)

warnings

zipfile

  • Unterstützung für die Angabe der Membernamen-Kodierung für das Lesen von Metadaten in Verzeichnis- und Dateikopfzeilen einer ZipFile wurde hinzugefügt. (Beigetragen von Stephen J. Turnbull und Serhiy Storchaka in bpo-28080.)

  • Die Methode ZipFile.mkdir() zum Erstellen neuer Verzeichnisse innerhalb von ZIP-Archiven wurde hinzugefügt. (Beigetragen von Sam Ezeh in gh-49083.)

  • Zu zipfile.Path wurden stem, suffix und suffixes hinzugefügt. (Beigetragen von Miguel Brito in gh-88261.)

Optimierungen

Dieser Abschnitt behandelt spezifische Optimierungen, die unabhängig vom Faster CPython-Projekt sind, das in seinem eigenen Abschnitt behandelt wird.

  • Der Compiler optimiert nun einfache printf-Style %-Formatierungen von String-Literalen, die nur die Formatcodes %s, %r und %a enthalten, und macht sie so schnell wie entsprechende f-String-Ausdrücke. (Beigetragen von Serhiy Storchaka in bpo-28307.)

  • Die Ganzzahldivision (//) ist für die Compiler-Optimierung besser abgestimmt. Sie ist nun etwa 20 % schneller auf x86-64 bei der Division einer int durch einen Wert kleiner als 2**30. (Beigetragen von Gregory P. Smith und Tim Peters in gh-90564.)

  • sum() ist nun fast 30 % schneller für Ganzzahlen kleiner als 2**30. (Beigetragen von Stefan Behnel in gh-68264.)

  • Das Ändern der Größe von Listen ist für den häufigsten Fall optimiert, was list.append() um ca. 15 % und einfache List Comprehensions um bis zu 20-30 % beschleunigt. (Beigetragen von Dennis Sweeney in gh-91165.)

  • Wörterbücher speichern beim Vorhandensein von ausschließlich Unicode-Objekten als Schlüssel keine Hashwerte, was die Größe von dict reduziert. Beispielsweise ist sys.getsizeof(dict.fromkeys("abcdefg")) auf 64-Bit-Plattformen von 352 Bytes auf 272 Bytes (23% kleiner) reduziert. (Beigetragen von Inada Naoki in bpo-46845.)

  • Die Verwendung von asyncio.DatagramProtocol ist beim Übertragen großer Dateien über UDP nun um Größenordnungen schneller, mit Geschwindigkeiten, die bei einer Datei von ca. 60 MiB mehr als 100-mal höher sind. (Beigetragen von msoxzw in gh-91487.)

  • math-Funktionen comb() und perm() sind nun für große Argumente ca. 10-mal schneller (mit einer größeren Beschleunigung für größere k). (Beigetragen von Serhiy Storchaka in bpo-37295.)

  • Die statistics-Funktionen mean(), variance() und stdev() verarbeiten nun Iteratoren in einem Durchgang, anstatt sie zuerst in eine list zu konvertieren. Dies ist doppelt so schnell und kann erheblichen Speicher sparen. (Beigetragen von Raymond Hettinger in gh-90415.)

  • unicodedata.normalize() normalisiert reine ASCII-Strings nun in konstanter Zeit. (Beigetragen von Donghee Na in bpo-44987.)

Schnelleres CPython

CPython 3.11 ist im Durchschnitt 25% schneller als CPython 3.10, gemessen mit der pyperformance Benchmark-Suite, wenn mit GCC unter Ubuntu Linux kompiliert. Abhängig von Ihrer Arbeitslast könnte die Gesamtbeschleunigung 10-60% betragen.

Dieses Projekt konzentriert sich auf zwei Hauptbereiche in Python: Schnellerer Start und Schnellere Laufzeit. Optimierungen, die nicht von diesem Projekt abgedeckt werden, sind separat unter Optimierungen aufgeführt.

Schnellerer Start

Frozen Imports / Statische Code-Objekte

Python speichert Bytecode im Verzeichnis __pycache__, um das Laden von Modulen zu beschleunigen.

Zuvor, in 3.10, sah die Ausführung von Python-Modulen so aus:

Read __pycache__ -> Unmarshal -> Heap allocated code object -> Evaluate

In Python 3.11 werden die für den Python-Start wesentlichen Kernmodule "eingefroren". Das bedeutet, dass ihre Code-Objekte (und Bytecode) vom Interpreter statisch alloziert werden. Dies reduziert die Schritte im Modulausführungsprozess auf:

Statically allocated code object -> Evaluate

Der Interpreterstart ist nun in Python 3.11 um 10-15% schneller. Dies hat große Auswirkungen auf kurzlaufende Programme, die Python verwenden.

(Beigetragen von Eric Snow, Guido van Rossum und Kumar Aditya in vielen Issues.)

Schnellere Laufzeit

Günstigere, verzögerte Python-Frames

Python-Frames, die Ausführungsinformationen enthalten, werden jedes Mal erstellt, wenn Python eine Python-Funktion aufruft. Folgende Frame-Optimierungen sind neu:

  • Optimierung des Frame-Erstellungsprozesses.

  • Vermeidung von Speicherallokationen durch großzügige Wiederverwendung von Frame-Speicher auf dem C-Stack.

  • Optimierung der internen Frame-Struktur, sodass sie nur wesentliche Informationen enthält. Frames enthielten zuvor zusätzliche Debugging- und Speicherverwaltungsinformationen.

Frames im alten Stil (Frame Objects) werden nun nur noch erstellt, wenn sie von Debuggern oder Python-Introspektionsfunktionen wie sys._getframe() und inspect.currentframe() angefordert werden. Für die meisten Benutzercodes werden überhaupt keine Frame-Objekte erstellt. Infolgedessen wurden fast alle Python-Funktionsaufrufe deutlich beschleunigt. Wir maßen eine Beschleunigung von 3-7% in pyperformance.

(Beigetragen von Mark Shannon in bpo-44590.)

Inlinede Python-Funktionsaufrufe

Während eines Python-Funktionsaufrufs ruft Python eine auswertende C-Funktion auf, um den Code dieser Funktion zu interpretieren. Dies begrenzt effektiv reine Python-Rekursion auf das, was für den C-Stack sicher ist.

In 3.11, wenn CPython erkennt, dass Python-Code eine andere Python-Funktion aufruft, richtet es einen neuen Frame ein und "springt" zum neuen Code innerhalb des neuen Frames. Dies vermeidet den Aufruf der C-Interpretationsfunktion vollständig.

Die meisten Python-Funktionsaufrufe verbrauchen nun keinen C-Stack-Speicher mehr, was sie beschleunigt. Bei einfachen rekursiven Funktionen wie Fibonacci oder Fakultät beobachteten wir eine Beschleunigung von 1,7x. Dies bedeutet auch, dass rekursive Funktionen deutlich tiefer rekursieren können (wenn der Benutzer das Rekursionslimit mit sys.setrecursionlimit() erhöht). Wir maßen eine Verbesserung von 1-3% in pyperformance.

(Beigetragen von Pablo Galindo und Mark Shannon in bpo-45256.)

PEP 659: Spezialisierender adaptiver Interpreter

PEP 659 ist einer der Schlüsselbestandteile des Projekts "Faster CPython". Die allgemeine Idee ist, dass Python zwar eine dynamische Sprache ist, die meiste Code aber Regionen hat, in denen Objekte und Typen sich selten ändern. Dieses Konzept nennt man Typstabilität.

Zur Laufzeit versucht Python, gängige Muster und Typstabilität im ausführenden Code zu erkennen. Python ersetzt dann die aktuelle Operation durch eine spezialisiertere. Diese spezialisierte Operation nutzt schnelle Pfade, die nur für diese Anwendungsfälle/Typen verfügbar sind und im Allgemeinen ihre generischen Gegenstücke übertreffen. Dies bringt auch ein weiteres Konzept namens Inline-Caching mit sich, bei dem Python die Ergebnisse teurer Operationen direkt im Bytecode zwischenspeichert.

Der Spezialisierer kombiniert auch bestimmte häufige Instruktionspaare zu einer Superinstruktion, was den Overhead während der Ausführung reduziert.

Python spezialisiert nur, wenn es Code sieht, der "heiß" ist (mehrmals ausgeführt wird). Dies verhindert, dass Python Zeit mit Code verschwendet, der nur einmal ausgeführt wird. Python kann auch de-spezialisieren, wenn Code zu dynamisch ist oder sich die Verwendung ändert. Spezialisierung wird periodisch versucht, und Spezialisierungsversuche sind nicht zu teuer, was es der Spezialisierung ermöglicht, sich an neue Umstände anzupassen.

(PEP geschrieben von Mark Shannon, mit Ideen inspiriert von Stefan Brunthaler. Weitere Informationen finden Sie in PEP 659. Implementierung von Mark Shannon und Brandt Bucher, mit zusätzlicher Hilfe von Irit Katriel und Dennis Sweeney.)

Operation

Form

Spezialisierung

Operation (bis zu)

Mitwirkende(r)

Binäre Operationen

x + x

x - x

x * x

Binäres Addieren, Multiplizieren und Subtrahieren für gängige Typen wie int, float und str nutzen kundenspezifische schnelle Pfade für ihre zugrundeliegenden Typen.

10%

Mark Shannon, Donghee Na, Brandt Bucher, Dennis Sweeney

Subskription

a[i]

Das Indizieren von Containertypen wie list, tuple und dict greift direkt auf die zugrundeliegenden Datenstrukturen zu.

Das Indizieren von benutzerdefinierten __getitem__() ist ähnlich wie bei Inlinede Python-Funktionsaufrufe inlined.

10-25%

Irit Katriel, Mark Shannon

Subskription zuweisen

a[i] = z

Ähnlich wie bei der Spezialisierung von Subskriptionen oben.

10-25%

Dennis Sweeney

Aufrufe

f(arg)

C(arg)

Aufrufe an gängige eingebaute (C-)Funktionen und -Typen wie len() und str rufen direkt ihre zugrundeliegende C-Version auf. Dies vermeidet die interne Aufrufkonvention.

20%

Mark Shannon, Ken Jin

Globale Variable laden

print

len

Der Index des Objekts im Globals/Builtins-Namensraum wird zwischengespeichert. Das Laden von Globals und Builtins erfordert keine Namensraum-Lookups.

[1]

Mark Shannon

Attribut laden

o.attr

Ähnlich wie beim Laden globaler Variablen. Der Index des Attributs im Namensraum der Klasse/des Objekts wird zwischengespeichert. In den meisten Fällen erfordert das Laden von Attributen keine Namensraum-Lookups.

[2]

Mark Shannon

Methoden für Aufrufe laden

o.meth()

Die tatsächliche Adresse der Methode wird zwischengespeichert. Das Laden von Methoden erfordert keine Namensraum-Lookups mehr – selbst für Klassen mit langen Vererbungsketten.

10-20%

Ken Jin, Mark Shannon

Attribut speichern

o.attr = z

Ähnlich wie die Optimierung beim Laden von Attributen.

2% in pyperformance

Mark Shannon

Sequenz entpacken

*seq

Spezialisiert für gängige Container wie list und tuple. Vermeidet die interne Aufrufkonvention.

8%

Brandt Bucher

Sonstiges

  • Objekte benötigen nun weniger Speicher durch verzögert erstellte Objekt-Namensräume. Ihre Namensraum-Dictionaries teilen nun auch Schlüssel freier. (Beigetragen von Mark Shannon in bpo-45340 und bpo-40116.)

  • "Nullkosten"-Ausnahmen werden implementiert, wodurch die Kosten von try-Anweisungen eliminiert werden, wenn keine Ausnahme ausgelöst wird. (Beigetragen von Mark Shannon in bpo-40222.)

  • Eine prägnantere Darstellung von Ausnahmen im Interpreter reduzierte die Zeit für das Abfangen einer Ausnahme um etwa 10%. (Beigetragen von Irit Katriel in bpo-45711.)

  • Die Engine für reguläre Ausdrücke von re wurde teilweise refaktoriert und verwendet nun Computed Gotos (oder "Threaded Code") auf unterstützten Plattformen. Infolgedessen führt Python 3.11 die pyperformance-Reguläre-Ausdruck-Benchmarks bis zu 10% schneller aus als Python 3.10. (Beigetragen von Brandt Bucher in gh-91404.)

FAQ

Wie sollte ich meinen Code schreiben, um diese Beschleunigungen zu nutzen?

Schreiben Sie pythonischen Code, der gängige Best Practices befolgt; Sie müssen Ihren Code nicht ändern. Das Projekt "Faster CPython" optimiert für übliche Code-Muster, die wir beobachten.

Wird CPython 3.11 mehr Speicher verbrauchen?

Vielleicht nicht; wir erwarten keinen Speichermehruverbrauch von mehr als 20% gegenüber 3.10. Dies wird durch Speicheroptimierungen für Frame-Objekte und Objekt-Dictionaries, wie oben erwähnt, ausgeglichen.

Ich sehe keine Beschleunigungen in meiner Arbeitslast. Warum?

Bestimmter Code wird keine spürbaren Vorteile haben. Wenn Ihr Code die meiste Zeit mit I/O-Operationen verbringt oder die meiste seiner Berechnung bereits in einer C-Erweiterungsbibliothek wie NumPy durchführt, wird es keine signifikanten Beschleunigungen geben. Dieses Projekt profitiert derzeit am meisten von reinen Python-Arbeitslasten.

Darüber hinaus sind die pyperformance-Zahlen ein geometrisches Mittel. Selbst innerhalb der pyperformance-Benchmarks haben sich bestimmte Benchmarks leicht verlangsamt, während andere sich um fast das 2-fache beschleunigt haben!

Gibt es einen JIT-Compiler?

Nein. Wir untersuchen noch weitere Optimierungen.

Über

Faster CPython erforscht Optimierungen für CPython. Das Hauptteam wird von Microsoft finanziert, um Vollzeit daran zu arbeiten. Pablo Galindo Salgado wird auch von Bloomberg LP finanziert, um Teilzeit an dem Projekt zu arbeiten. Schließlich sind viele Mitwirkende Freiwillige aus der Community.

CPython Bytecode-Änderungen

Der Bytecode enthält nun Inline-Cache-Einträge, die die Form der neu hinzugefügten CACHE-Instruktionen haben. Viele Opcodes erwarten, dass sie von einer exakten Anzahl von Caches gefolgt werden, und weisen den Interpreter an, diese zur Laufzeit zu überspringen. Ausgefüllte Caches können wie beliebige Instruktionen aussehen, daher ist Vorsicht geboten, wenn roher, adaptiver Bytecode mit beschleunigten Daten gelesen oder geändert wird.

Neue Opcodes

  • ASYNC_GEN_WRAP, RETURN_GENERATOR und SEND, verwendet in Generatoren und Coroutinen.

  • COPY_FREE_VARS, was die Notwendigkeit von speziellem Caller-Side-Code für Closures vermeidet.

  • JUMP_BACKWARD_NO_INTERRUPT, zur Verwendung in bestimmten Schleifen, bei denen die Behandlung von Interrupts unerwünscht ist.

  • MAKE_CELL, zur Erstellung von Cell Objects.

  • CHECK_EG_MATCH und PREP_RERAISE_STAR, zur Handhabung der neuen Ausnahme-Gruppen und except*, die in PEP 654 hinzugefügt wurden.

  • PUSH_EXC_INFO, zur Verwendung in Ausnahmebehandlern.

  • RESUME, ein No-Op, für interne Trace-, Debugging- und Optimierungsprüfungen.

Ersetzte Opcodes

Ersetzter Opcode(s)

Neuer Opcode(s)

Hinweise

BINARY_*
INPLACE_*

BINARY_OP

Ersetzte alle numerischen binären/inplace-Opcodes durch einen einzigen Opcode.

CALL_FUNCTION
CALL_FUNCTION_KW
CALL_METHOD
KW_NAMES
PRECALL

Entkoppelt Argument-Shifting für Methoden von der Handhabung von Schlüsselwortargumenten; ermöglicht bessere Spezialisierung von Aufrufen.

DUP_TOP
DUP_TOP_TWO
ROT_TWO
ROT_THREE
ROT_FOUR
ROT_N

Stack-Manipulationsanweisungen

JUMP_IF_NOT_EXC_MATCH

Führt nun eine Prüfung durch, springt aber nicht.

JUMP_ABSOLUTE
POP_JUMP_IF_FALSE
POP_JUMP_IF_TRUE
POP_JUMP_BACKWARD_IF_*
POP_JUMP_FORWARD_IF_*

Siehe [3]; TRUE, FALSE, NONE und NOT_NONE-Varianten für jede Richtung.

SETUP_WITH
SETUP_ASYNC_WITH

BEFORE_WITH

with-Block-Setup

Geänderte/entfernte Opcodes

  • Geänderte MATCH_CLASS und MATCH_KEYS, sodass kein zusätzlicher boolescher Wert mehr für Erfolg/Misserfolg gepusht wird. Stattdessen wird bei Misserfolg `None` anstelle des Tupels der extrahierten Werte gepusht.

  • Geänderte Opcodes, die mit Ausnahmen arbeiten, um widerzuspiegeln, dass sie nun als ein Element auf dem Stack statt als drei dargestellt werden (siehe gh-89874).

  • Entfernte COPY_DICT_WITHOUT_KEYS, GEN_START, POP_BLOCK, SETUP_FINALLY und YIELD_FROM.

Veraltet

Dieser Abschnitt listet Python-APIs auf, die in Python 3.11 als veraltet markiert wurden.

Als veraltet markierte C-APIs sind separat aufgeführt.

Sprache/Builtins

  • Das Verketten von classmethod-Deskriptoren (eingeführt in bpo-19072) ist nun veraltet. Es kann nicht mehr verwendet werden, um andere Deskriptoren wie property zu umschließen. Das Kern-Design dieser Funktion war fehlerhaft und verursachte eine Reihe von nachgelagerten Problemen. Um einen classmethod "durchzureichen", sollten Sie das Attribut `__wrapped__` in Betracht ziehen, das in Python 3.10 hinzugefügt wurde. (Beigetragen von Raymond Hettinger in gh-89519.)

  • Oktale Escape-Sequenzen in Zeichenketten- und Bytes-Literalen mit Werten größer als 0o377 (255 dezimal) erzeugen nun eine DeprecationWarning. In einer zukünftigen Python-Version wird dies eine SyntaxWarning und schließlich eine SyntaxError auslösen. (Beigetragen von Serhiy Storchaka in gh-81548.)

  • Die Delegation von int() an __trunc__() ist nun veraltet. Das Aufrufen von int(a), wenn `type(a)` `__trunc__()` implementiert, aber nicht __int__() oder __index__(), löst nun eine DeprecationWarning aus. (Beigetragen von Zackery Spytz in bpo-44977.)

Module

  • PEP 594 führte zur Veralterung der folgenden Module, die für die Entfernung in Python 3.13 vorgesehen sind:

    aifc

    chunk

    msilib

    pipes

    telnetlib

    audioop

    crypt

    nis

    sndhdr

    uu

    cgi

    imghdr

    nntplib

    spwd

    xdrlib

    cgitb

    mailcap

    ossaudiodev

    sunau

    (Beigetragen von Brett Cannon in bpo-47061 und Victor Stinner in gh-68966.)

  • Die Module asynchat, asyncore und smtpd sind seit mindestens Python 3.6 veraltet. Ihre Dokumentation und Veralterungswarnungen wurden nun aktualisiert, um darauf hinzuweisen, dass sie in Python 3.12 entfernt werden. (Beigetragen von Hugo van Kemenade in bpo-47022.)

  • Das Paket lib2to3 und das Tool 2to3 sind nun veraltet und können Python 3.10 oder neuer möglicherweise nicht parsen. Einzelheiten finden Sie in PEP 617, das den neuen PEG-Parser einführt. (Beigetragen von Victor Stinner in bpo-40360.)

  • Die undokumentierten Module sre_compile, sre_constants und sre_parse sind nun veraltet. (Beigetragen von Serhiy Storchaka in bpo-47152.)

Standardbibliothek

  • Die folgenden Elemente wurden in configparser seit Python 3.2 als veraltet markiert. Ihre Veralterungswarnungen wurden nun aktualisiert, um darauf hinzuweisen, dass sie in Python 3.12 entfernt werden:

    • die Klasse configparser.SafeConfigParser

    • die Eigenschaft configparser.ParsingError.filename

    • die Methode configparser.RawConfigParser.readfp()

    (Beigetragen von Hugo van Kemenade in bpo-45173.)

  • configparser.LegacyInterpolation ist seit Python 3.2 im Docstring als veraltet markiert und wird nicht in der Dokumentation von configparser aufgeführt. Es löst nun eine DeprecationWarning aus und wird in Python 3.13 entfernt. Verwenden Sie stattdessen configparser.BasicInterpolation oder configparser.ExtendedInterpolation. (Beigetragen von Hugo van Kemenade in bpo-46607.)

  • Der ältere Satz von importlib.resources-Funktionen wurde zugunsten der in Python 3.9 hinzugefügten Ersatzfunktionen als veraltet markiert und wird in einer zukünftigen Python-Version entfernt, da sie keine Ressourcen innerhalb von Paketunterverzeichnissen unterstützen.

    • importlib.resources.contents()

    • importlib.resources.is_resource()

    • importlib.resources.open_binary()

    • importlib.resources.open_text()

    • importlib.resources.read_binary()

    • importlib.resources.read_text()

    • importlib.resources.path()

  • Die Funktion locale.getdefaultlocale() ist veraltet und wird in Python 3.15 entfernt. Verwenden Sie stattdessen die Funktionen locale.setlocale(), locale.getpreferredencoding(False) und locale.getlocale(). (Beigetragen von Victor Stinner in gh-90817.)

  • Die Funktion locale.resetlocale() ist veraltet und wird in Python 3.13 entfernt. Verwenden Sie stattdessen locale.setlocale(locale.LC_ALL, ""). (Beigesteuert von Victor Stinner in gh-90817.)

  • Strengere Regeln werden nun für numerische Gruppenreferenzen und Gruppennamen in Regulären Ausdrücken angewendet. Nur Folgen von ASCII-Ziffern werden nun als numerische Referenz akzeptiert, und der Gruppenname in bytes-Mustern und Ersetzungsstrings kann nur ASCII-Buchstaben, Ziffern und Unterstriche enthalten. Vorerst wird eine Warnung zur Veralterung ausgegeben für Syntax, die diese Regeln verletzt. (Beigesteuert von Serhiy Storchaka in gh-91760.)

  • Im re-Modul sind die Funktion re.template() und die entsprechenden Flags re.TEMPLATE und re.T veraltet, da sie undokumentiert waren und keinen offensichtlichen Zweck hatten. Sie werden in Python 3.13 entfernt. (Beigesteuert von Serhiy Storchaka und Miro Hrončok in gh-92728.)

  • turtle.settiltangle() ist seit Python 3.1 veraltet; es gibt nun eine Warnung zur Veralterung aus und wird in Python 3.13 entfernt. Verwenden Sie stattdessen turtle.tiltangle() (es wurde zuvor fälschlicherweise als veraltet gekennzeichnet und seine Docstring wurde nun korrigiert). (Beigesteuert von Hugo van Kemenade in bpo-45837.)

  • typing.Text, das ausschließlich zur Kompatibilitätsunterstützung zwischen Python 2- und Python 3-Code existiert, ist nun veraltet. Seine Entfernung ist derzeit nicht geplant, aber Benutzer werden ermutigt, stattdessen str zu verwenden, wo immer dies möglich ist. (Beigesteuert von Alex Waygood in gh-92332.)

  • Die Schlüsselwortargument-Syntax zum Erstellen von typing.TypedDict-Typen ist nun veraltet. Die Unterstützung wird in Python 3.13 entfernt. (Beigesteuert von Jingchen Ye in gh-90224.)

  • webbrowser.MacOSX ist veraltet und wird in Python 3.13 entfernt. Es ist ungetestet, undokumentiert und wird von webbrowser selbst nicht verwendet. (Beigesteuert von Donghee Na in bpo-42255.)

  • Das Verhalten, einen Wert aus einer TestCase- und IsolatedAsyncioTestCase-Testmethode (außer dem Standardwert None) zurückzugeben, ist nun veraltet.

  • Die folgenden, nicht formell dokumentierten Funktionen von unittest, deren Entfernung für Python 3.13 geplant ist, wurden als veraltet markiert:

    • unittest.findTestCases()

    • unittest.makeSuite()

    • unittest.getTestCaseNames()

    Verwenden Sie stattdessen Methoden von TestLoader:

    (Beigesteuert von Erlend E. Aasland in bpo-5846.)

  • unittest.TestProgram.usageExit() ist als veraltet markiert und wird in 3.13 entfernt. (Beigesteuert von Carlos Damázio in gh-67048.)

Entfernung geplant für Python 3.12

Die folgenden Python-APIs wurden in früheren Python-Versionen als veraltet gekennzeichnet und werden in Python 3.12 entfernt.

Zu entfernende C-APIs sind separat aufgeführt.

  • Das asynchat-Modul

  • Das asyncore-Modul

  • Das gesamte distutils-Paket

  • Das imp-Modul

  • Der typing.io-Namensraum

  • Der typing.re-Namensraum

  • cgi.log()

  • importlib.find_loader()

  • importlib.abc.Loader.module_repr()

  • importlib.abc.MetaPathFinder.find_module()

  • importlib.abc.PathEntryFinder.find_loader()

  • importlib.abc.PathEntryFinder.find_module()

  • importlib.machinery.BuiltinImporter.find_module()

  • importlib.machinery.BuiltinLoader.module_repr()

  • importlib.machinery.FileFinder.find_loader()

  • importlib.machinery.FileFinder.find_module()

  • importlib.machinery.FrozenImporter.find_module()

  • importlib.machinery.FrozenLoader.module_repr()

  • importlib.machinery.PathFinder.find_module()

  • importlib.machinery.WindowsRegistryFinder.find_module()

  • importlib.util.module_for_loader()

  • importlib.util.set_loader_wrapper()

  • importlib.util.set_package_wrapper()

  • pkgutil.ImpImporter

  • pkgutil.ImpLoader

  • pathlib.Path.link_to()

  • sqlite3.enable_shared_cache()

  • sqlite3.OptimizedUnicode()

  • Umgebungsvariable PYTHONTHREADDEBUG

  • Die folgenden veralteten Aliase in unittest

    Veralteter Alias

    Methodenname

    Veraltet in

    failUnless

    assertTrue()

    3.1

    failIf

    assertFalse()

    3.1

    failUnlessEqual

    assertEqual()

    3.1

    failIfEqual

    assertNotEqual()

    3.1

    failUnlessAlmostEqual

    assertAlmostEqual()

    3.1

    failIfAlmostEqual

    assertNotAlmostEqual()

    3.1

    failUnlessRaises

    assertRaises()

    3.1

    assert_

    assertTrue()

    3.2

    assertEquals

    assertEqual()

    3.2

    assertNotEquals

    assertNotEqual()

    3.2

    assertAlmostEquals

    assertAlmostEqual()

    3.2

    assertNotAlmostEquals

    assertNotAlmostEqual()

    3.2

    assertRegexpMatches

    assertRegex()

    3.2

    assertRaisesRegexp

    assertRaisesRegex()

    3.2

    assertNotRegexpMatches

    assertNotRegex()

    3.5

Entfernt

Dieser Abschnitt listet Python-APIs auf, die in Python 3.11 entfernt wurden.

Entfernte C-APIs sind separat aufgeführt.

  • Entfernt wurde der @asyncio.coroutine() Decorator, der ältere generatorbasierte Coroutinen kompatibel mit async / await-Code machte. Die Funktion war seit Python 3.8 veraltet und die Entfernung war ursprünglich für Python 3.10 geplant. Verwenden Sie stattdessen async def. (Beigesteuert von Illia Volochii in bpo-43216.)

  • Entfernt wurde asyncio.coroutines.CoroWrapper, die zum Umwickeln älterer generatorbasierter Coroutinenobjekte im Debug-Modus verwendet wurde. (Beigesteuert von Illia Volochii in bpo-43216.)

  • Aufgrund erheblicher Sicherheitsbedenken ist der Parameter reuse_address von asyncio.loop.create_datagram_endpoint(), der in Python 3.9 deaktiviert wurde, nun vollständig entfernt. Dies liegt am Verhalten der Socket-Option SO_REUSEADDR bei UDP. (Beigesteuert von Hugo van Kemenade in bpo-45129.)

  • Entfernt wurde das binhex-Modul, das in Python 3.9 veraltet war. Ebenfalls entfernt wurden die zugehörigen, ähnlich veralteten binascii-Funktionen:

    • binascii.a2b_hqx()

    • binascii.b2a_hqx()

    • binascii.rlecode_hqx()

    • binascii.rldecode_hqx()

    Die Funktion binascii.crc_hqx() bleibt verfügbar.

    (Beigesteuert von Victor Stinner in bpo-45085.)

  • Entfernt wurde der distutils bdist_msi-Befehl, der in Python 3.9 veraltet war. Verwenden Sie stattdessen bdist_wheel (Wheel-Pakete). (Beigesteuert von Hugo van Kemenade in bpo-45124.)

  • Entfernt wurden die `__getitem__()`-Methoden von xml.dom.pulldom.DOMEventStream, wsgiref.util.FileWrapper und fileinput.FileInput, die seit Python 3.9 veraltet waren. (Beigesteuert von Hugo van Kemenade in bpo-45132.)

  • Entfernt wurden die veralteten gettext-Funktionen lgettext(), ldgettext(), lngettext() und ldngettext(). Ebenfalls entfernt wurden die Funktion bind_textdomain_codeset(), die Methoden NullTranslations.output_charset() und NullTranslations.set_output_charset() sowie der Parameter codeset von translation() und install(), da diese nur für die l*gettext()-Funktionen verwendet werden. (Beigesteuert von Donghee Na und Serhiy Storchaka in bpo-44235.)

  • Entfernt aus dem inspect-Modul:

    (Beigesteuert von Hugo van Kemenade in bpo-45320.)

  • Die Methode `__class_getitem__()` wurde aus pathlib.PurePath entfernt, da sie nicht verwendet wurde und versehentlich in früheren Versionen hinzugefügt wurde. (Beigesteuert von Nikita Sobolev in bpo-46483.)

  • Die Klasse MailmanProxy im smtpd-Modul wurde entfernt, da sie ohne das externe mailman-Paket unbrauchbar ist. (Beigesteuert von Donghee Na in bpo-35800.)

  • Die veraltete Methode split() von _tkinter.TkappType wurde entfernt. (Beigesteuert von Erlend E. Aasland in bpo-38371.)

  • Die Unterstützung für Namensraum-Pakete wurde aus der unittest-Erkennung entfernt. Sie wurde in Python 3.4 eingeführt, war aber seit Python 3.7 fehlerhaft. (Beigesteuert von Inada Naoki in bpo-23882.)

  • Die undokumentierte private Methode float.__set_format__(), die in Python 3.7 noch float.__setformat__() hieß, wurde entfernt. Ihre Docstring besagte: „Wahrscheinlich wollen Sie diese Funktion nicht verwenden. Sie existiert hauptsächlich, um in der Testsuite von Python verwendet zu werden.“ (Beigesteuert von Victor Stinner in bpo-46852.)

  • Das Konfigurationsflag --experimental-isolated-subinterpreters (und das entsprechende Makro EXPERIMENTAL_ISOLATED_SUBINTERPRETERS) wurde entfernt.

  • Pynche — Der Pythonisch-natürliche Farb- und Farbton-Editor — wurde aus Tools/scripts entfernt und wird unabhängig vom Python-Quellcodebaum entwickelt.

Portierung auf Python 3.11

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

Portierungsnotizen für die C-API sind separat aufgeführt.

  • open(), io.open(), codecs.open() und fileinput.FileInput akzeptieren den Modus 'U' („universeller Zeilenumbruch“) nicht mehr. In Python 3 wird der Modus „universeller Zeilenumbruch“ standardmäßig verwendet, wenn eine Datei im Textmodus geöffnet wird, und das Flag 'U' war seit Python 3.3 veraltet. Der Parameter newline zu diesen Funktionen steuert, wie universelle Zeilenumbrüche funktionieren. (Beigesteuert von Victor Stinner in bpo-37330.)

  • Die Positionsangaben von ast.AST-Knoten werden nun validiert, wenn sie an compile() und andere verwandte Funktionen übergeben werden. Wenn ungültige Positionen erkannt werden, wird ein ValueError ausgelöst. (Beigesteuert von Pablo Galindo in gh-93351.)

  • Das Übergeben von Nicht-concurrent.futures.ThreadPoolExecutor-Executors an asyncio.loop.set_default_executor() wurde nach einer Veralterung in Python 3.8 unterbunden. (Beigesteuert von Illia Volochii in bpo-43234.)

  • calendar: Die Klassen calendar.LocaleTextCalendar und calendar.LocaleHTMLCalendar verwenden nun locale.getlocale() anstelle von locale.getdefaultlocale(), wenn kein Locale angegeben ist. (Beigesteuert von Victor Stinner in bpo-46659.)

  • Das pdb-Modul liest nun die Konfigurationsdatei .pdbrc mit der Codierung 'UTF-8'. (Beigesteuert von Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి) in bpo-41137.)

  • Der Parameter population von random.sample() muss eine Sequenz sein, und die automatische Konvertierung von sets in lists wird nicht mehr unterstützt. Außerdem wird ein ValueError ausgelöst, wenn die Stichprobengröße größer ist als die Populationsgröße. (Beigesteuert von Raymond Hettinger in bpo-40465.)

  • Der optionale Parameter random von random.shuffle() wurde entfernt. Er war zuvor eine beliebige Zufallsfunktion, die zum Mischen verwendet wurde; jetzt wird immer random.random() (seine vorherige Standardeinstellung) verwendet.

  • In re Reguläre Ausdruckssyntax können globale Inline-Flags (z. B. (?i)) nun nur noch am Anfang regulärer Ausdrücke verwendet werden. Die Verwendung an anderen Stellen ist seit Python 3.6 veraltet. (Beigesteuert von Serhiy Storchaka in bpo-47066.)

  • Im Modul re wurden mehrere seit langem bestehende Fehler behoben, die in seltenen Fällen dazu führen konnten, dass Erfassungsgruppen falsche Ergebnisse lieferten. Daher könnte dies in diesen Fällen die erfasste Ausgabe ändern. (Beigesteuert von Ma Lin in bpo-35859.)

Build-Änderungen

  • CPython hat nun PEP 11 Tier 3 Unterstützung für Cross-Compilierung auf die WebAssembly-Plattformen Emscripten (wasm32-unknown-emscripten, d. h. Python im Browser) und WebAssembly System Interface (WASI) (wasm32-unknown-wasi). Die Bemühungen sind inspiriert von früheren Arbeiten wie Pyodide. Diese Plattformen bieten eine begrenzte Teilmenge von POSIX-APIs; Funktionen und Module der Python-Standardbibliothek im Zusammenhang mit Netzwerken, Prozessen, Threads, Signalen, mmap und Benutzern/Gruppen sind nicht verfügbar oder funktionieren nicht. (Emscripten beigesteuert von Christian Heimes und Ethan Smith in gh-84461 und WASI beigesteuert von Christian Heimes in gh-90473; Plattformen beworben in gh-95085.)

  • Das Erstellen von CPython erfordert nun:

  • Das Makro Py_NO_NAN wurde entfernt. Da CPython nun IEEE 754-Gleitkommazahlen erfordert, sind NaN-Werte immer verfügbar. (Beigesteuert von Victor Stinner in bpo-46656.)

  • Das tkinter-Paket erfordert nun Tcl/Tk Version 8.5.12 oder neuer. (Beigesteuert von Serhiy Storchaka in bpo-46996.)

  • Build-Abhängigkeiten, Compiler-Flags und Linker-Flags für die meisten Standardbibliotheks-Erweiterungsmodule werden nun von configure erkannt. libffi, libnsl, libsqlite3, zlib, bzip2, liblzma, libcrypt, Tcl/Tk und uuid-Flags werden von pkg-config (wenn verfügbar) erkannt. tkinter erfordert nun einen pkg-config-Befehl, um die Entwicklungseinstellungen für Tcl/Tk-Header und -Bibliotheken zu erkennen. (Beigesteuert von Christian Heimes und Erlend Egeberg Aasland in bpo-45847, bpo-45747 und bpo-45763.)

  • libpython wird nicht mehr gegen libcrypt gelinkt. (Beigesteuert von Mike Gilbert in bpo-45433.)

  • CPython kann nun mit der Option ThinLTO erstellt werden, indem thin an --with-lto übergeben wird, d. h. --with-lto=thin. (Beigesteuert von Donghee Na und Brett Holman in bpo-44340.)

  • Freelistings für Objektstrukturen können nun deaktiviert werden. Eine neue configure-Option --without-freelists kann verwendet werden, um alle Freelistings außer dem leeren Tupel-Singleton zu deaktivieren. (Beigesteuert von Christian Heimes in bpo-45522.)

  • Modules/Setup und Modules/makesetup wurden verbessert und aufgeräumt. Erweiterungsmodule können nun über makesetup erstellt werden. Alle außer einigen Testmodulen können statisch in eine Haupt-Binärdatei oder Bibliothek gelinkt werden. (Beigesteuert von Brett Cannon und Christian Heimes in bpo-45548, bpo-45570, bpo-45571 und bpo-43974.)

    Hinweis

    Verwenden Sie die Umgebungsvariablen TCLTK_CFLAGS und TCLTK_LIBS, um den Speicherort von Tcl/Tk-Headern und -Bibliotheken manuell anzugeben. Die configure-Optionen --with-tcltk-includes und --with-tcltk-libs wurden entfernt.

    Auf RHEL 7 und CentOS 7 stellen die Entwicklungspakete kein tcl.pc und tk.pc bereit; verwenden Sie TCLTK_LIBS="-ltk8.5 -ltkstub8.5 -ltcl8.5". Das Verzeichnis Misc/rhel7 enthält .pc-Dateien und Anweisungen zum Erstellen von Python mit Tcl/Tk und OpenSSL von RHEL 7 und CentOS 7.

  • CPython verwendet nun standardmäßig 30-Bit-Ziffern für die Python int-Implementierung. Zuvor wurde standardmäßig 30-Bit-Ziffern auf Plattformen mit SIZEOF_VOID_P >= 8 und ansonsten 15-Bit-Ziffern verwendet. Es ist immer noch möglich, die Verwendung von 15-Bit-Ziffern explizit über die Option --enable-big-digits für das Configure-Skript oder (für Windows) die Variable PYLONG_BITS_IN_DIGIT in PC/pyconfig.h anzufordern, aber diese Option könnte zu einem späteren Zeitpunkt entfernt werden. (Beigesteuert von Mark Dickinson in bpo-45569.)

C-API-Änderungen

Neue Funktionen

Portierung auf Python 3.11

  • Einige Makros wurden in statische Inline-Funktionen konvertiert, um Makro-Fallstricke zu vermeiden. Die Änderung sollte für Benutzer weitgehend transparent sein, da die Ersatzfunktionen ihre Argumente in die erwarteten Typen umwandeln, um Compilerwarnungen aufgrund statischer Typprüfungen zu vermeiden. Wenn jedoch die Limited C API auf >=3.11 gesetzt ist, werden diese Casts nicht durchgeführt, und Aufrufer müssen Argumente in ihre erwarteten Typen umwandeln. Weitere Einzelheiten finden Sie in PEP 670. (Beigetragen von Victor Stinner und Erlend E. Aasland in gh-89653.)

  • PyErr_SetExcInfo() verwendet nicht mehr die Argumente type und traceback. Der Interpreter leitet diese Werte nun von der Ausnahmeinstanz (dem Argument value) ab. Die Funktion übernimmt weiterhin Referenzen aller drei Argumente. (Beigetragen von Irit Katriel in bpo-45711.)

  • PyErr_GetExcInfo() leitet nun die Felder type und traceback des Ergebnisses von der Ausnahmeinstanz (dem Feld value) ab. (Beigetragen von Irit Katriel in bpo-45711.)

  • _frozen verfügt über ein neues Feld is_package, das angibt, ob das gefrorene Modul ein Paket ist oder nicht. Zuvor war ein negativer Wert im Feld size die Indikation. Jetzt werden nur noch nicht-negative Werte für size verwendet. (Beigetragen von Kumar Aditya in bpo-46608.)

  • _PyFrameEvalFunction() nimmt nun _PyInterpreterFrame* als zweiten Parameter entgegen, anstelle von PyFrameObject*. Weitere Einzelheiten zur Verwendung dieses Funktionszeigertyps finden Sie in PEP 523.

  • PyCode_New() und PyCode_NewWithPosOnlyArgs() nehmen nun ein zusätzliches Argument exception_table entgegen. Die Verwendung dieser Funktionen sollte nach Möglichkeit vermieden werden. Um ein benutzerdefiniertes Code-Objekt zu erhalten: Erstellen Sie ein Code-Objekt mit dem Compiler, und rufen Sie dann eine modifizierte Version mit der Methode replace ab.

  • PyCodeObject hat nicht mehr die Felder co_code, co_varnames, co_cellvars und co_freevars. Verwenden Sie stattdessen PyCode_GetCode(), PyCode_GetVarnames(), PyCode_GetCellvars() und PyCode_GetFreevars(), um darauf über die C-API zuzugreifen. (Beigetragen von Brandt Bucher in bpo-46841 und Ken Jin in gh-92154 und gh-94936.)

  • Die alten Trashcan-Makros (Py_TRASHCAN_SAFE_BEGIN/Py_TRASHCAN_SAFE_END) sind nun veraltet. 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 z. B.

    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 migriert 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 Deallokationsfunktion sein sollte, in der es sich befindet.

    Um ältere Python-Versionen in derselben Codebasis zu unterstützen, können Sie die folgenden Makros definieren und sie im gesamten Code verwenden (Quelle: diese wurden aus der mypy-Codebasis kopiert)

    #if PY_VERSION_HEX >= 0x03080000
    #  define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN(op, dealloc)
    #  define CPy_TRASHCAN_END(op) Py_TRASHCAN_END
    #else
    #  define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_SAFE_BEGIN(op)
    #  define CPy_TRASHCAN_END(op) Py_TRASHCAN_SAFE_END(op)
    #endif
    
  • Die Funktion PyType_Ready() löst nun einen Fehler aus, wenn ein Typ mit gesetztem Flag Py_TPFLAGS_HAVE_GC definiert wird, aber keine Traverse-Funktion (PyTypeObject.tp_traverse) hat. (Beigetragen von Victor Stinner in bpo-44263.)

  • Heap-Typen mit dem Flag Py_TPFLAGS_IMMUTABLETYPE können nun das PEP 590 vectorcall-Protokoll erben. Zuvor war dies nur für statische Typen möglich. (Beigetragen von Erlend E. Aasland in bpo-43908)

  • Da Py_TYPE() in eine statische Inline-Funktion geändert wurde, muss Py_TYPE(obj) = new_type durch Py_SET_TYPE(obj, new_type) ersetzt werden: siehe die Funktion Py_SET_TYPE() (verfügbar seit Python 3.9). Für Abwärtskompatibilität kann dieses Makro verwendet werden

    #if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_TYPE)
    static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type)
    { ob->ob_type = type; }
    #define Py_SET_TYPE(ob, type) _Py_SET_TYPE((PyObject*)(ob), type)
    #endif
    

    (Beigetragen von Victor Stinner in bpo-39573.)

  • Da Py_SIZE() in eine statische Inline-Funktion geändert wurde, muss Py_SIZE(obj) = new_size durch Py_SET_SIZE(obj, new_size) ersetzt werden: siehe die Funktion Py_SET_SIZE() (verfügbar seit Python 3.9). Für Abwärtskompatibilität kann dieses Makro verwendet werden

    #if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_SIZE)
    static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size)
    { ob->ob_size = size; }
    #define Py_SET_SIZE(ob, size) _Py_SET_SIZE((PyVarObject*)(ob), size)
    #endif
    

    (Beigetragen von Victor Stinner in bpo-39573.)

  • <Python.h> schließt die Header-Dateien <stdlib.h>, <stdio.h>, <errno.h> und <string.h> nicht mehr ein, wenn das Makro Py_LIMITED_API auf 0x030b0000 (Python 3.11) oder höher gesetzt ist. C-Erweiterungen sollten die Header-Dateien explizit nach #include <Python.h> einbinden. (Beigetragen von Victor Stinner in bpo-45434.)

  • Die Nicht-Limited-API-Dateien cellobject.h, classobject.h, code.h, context.h, funcobject.h, genobject.h und longintrepr.h wurden in das Verzeichnis Include/cpython verschoben. Außerdem wurde die Header-Datei eval.h entfernt. Diese Dateien dürfen nicht direkt eingebunden werden, da sie bereits in Python.h enthalten sind: Include-Dateien. Wenn sie direkt eingebunden wurden, sollten Sie stattdessen Python.h einbinden. (Beigetragen von Victor Stinner in bpo-35134.)

  • Das Makro PyUnicode_CHECK_INTERNED() wurde von der Limited C API ausgeschlossen. Es war dort nie verwendbar, da es interne Strukturen verwendete, die in der Limited C API nicht verfügbar sind. (Beigetragen von Victor Stinner in bpo-46007.)

  • Die folgenden Frame-Funktionen und Typen sind nun direkt mit #include <Python.h> verfügbar, es ist nicht mehr erforderlich, #include <frameobject.h> hinzuzufügen

    (Beigetragen von Victor Stinner in gh-93937.)

  • Die Strukturmitglieder von PyFrameObject wurden aus der öffentlichen C-API entfernt.

    Obwohl die Dokumentation besagt, dass die Felder von PyFrameObject sich jederzeit ändern können, waren sie lange Zeit stabil und wurden in mehreren beliebten Erweiterungen verwendet.

    In Python 3.11 wurde die Frame-Struktur zur Leistungsoptimierung neu organisiert. Einige Felder wurden ganz entfernt, da sie Details der alten Implementierung waren.

    PyFrameObject Felder

    • f_back: verwenden Sie PyFrame_GetBack().

    • f_blockstack: entfernt.

    • f_builtins: verwenden Sie PyFrame_GetBuiltins().

    • f_code: verwenden Sie PyFrame_GetCode().

    • f_gen: verwenden Sie PyFrame_GetGenerator().

    • f_globals: verwenden Sie PyFrame_GetGlobals().

    • f_iblock: entfernt.

    • f_lasti: verwenden Sie PyFrame_GetLasti(). Code, der f_lasti mit PyCode_Addr2Line() verwendet, sollte stattdessen PyFrame_GetLineNumber() verwenden; dies kann schneller sein.

    • f_lineno: verwenden Sie PyFrame_GetLineNumber()

    • f_locals: verwenden Sie PyFrame_GetLocals().

    • f_stackdepth: entfernt.

    • f_state: keine öffentliche API (umbenannt in f_frame.f_state).

    • f_trace: keine öffentliche API.

    • f_trace_lines: verwenden Sie PyObject_GetAttrString((PyObject*)frame, "f_trace_lines").

    • f_trace_opcodes: verwenden Sie PyObject_GetAttrString((PyObject*)frame, "f_trace_opcodes").

    • f_localsplus: keine öffentliche API (umbenannt in f_frame.localsplus).

    • f_valuestack: entfernt.

    Das Python-Frame-Objekt wird nun verzögert erstellt. Eine Nebenwirkung ist, dass das Mitglied f_back nicht direkt zugegriffen werden darf, da sein Wert ebenfalls verzögert berechnet wird. stattdessen muss die Funktion PyFrame_GetBack() aufgerufen werden.

    Debugger, die direkt auf f_locals zugegriffen haben, *müssen* stattdessen PyFrame_GetLocals() aufrufen. Sie müssen nicht mehr PyFrame_FastToLocalsWithError() oder PyFrame_LocalsToFast() aufrufen, tatsächlich sollten sie diese Funktionen nicht aufrufen. Die notwendige Aktualisierung des Frames wird nun von der virtuellen Maschine verwaltet.

    Code, der PyFrame_GetCode() in Python 3.8 und älter definiert

    #if PY_VERSION_HEX < 0x030900B1
    static inline PyCodeObject* PyFrame_GetCode(PyFrameObject *frame)
    {
        Py_INCREF(frame->f_code);
        return frame->f_code;
    }
    #endif
    

    Code, der PyFrame_GetBack() in Python 3.8 und älter definiert

    #if PY_VERSION_HEX < 0x030900B1
    static inline PyFrameObject* PyFrame_GetBack(PyFrameObject *frame)
    {
        Py_XINCREF(frame->f_back);
        return frame->f_back;
    }
    #endif
    

    Oder verwenden Sie das Projekt pythoncapi_compat, um diese beiden Funktionen für ältere Python-Versionen zu erhalten.

  • Änderungen der Mitglieder der Struktur PyThreadState

    Code, der PyThreadState_GetFrame() in Python 3.8 und älter definiert

    #if PY_VERSION_HEX < 0x030900B1
    static inline PyFrameObject* PyThreadState_GetFrame(PyThreadState *tstate)
    {
        Py_XINCREF(tstate->frame);
        return tstate->frame;
    }
    #endif
    

    Code, der PyThreadState_EnterTracing() und PyThreadState_LeaveTracing() in Python 3.10 und älter definiert

    #if PY_VERSION_HEX < 0x030B00A2
    static inline void PyThreadState_EnterTracing(PyThreadState *tstate)
    {
        tstate->tracing++;
    #if PY_VERSION_HEX >= 0x030A00A1
        tstate->cframe->use_tracing = 0;
    #else
        tstate->use_tracing = 0;
    #endif
    }
    
    static inline void PyThreadState_LeaveTracing(PyThreadState *tstate)
    {
        int use_tracing = (tstate->c_tracefunc != NULL || tstate->c_profilefunc != NULL);
        tstate->tracing--;
    #if PY_VERSION_HEX >= 0x030A00A1
        tstate->cframe->use_tracing = use_tracing;
    #else
        tstate->use_tracing = use_tracing;
    #endif
    }
    #endif
    

    Oder verwenden Sie das Projekt pythoncapi-compat, um diese Funktionen für alte Python-Funktionen zu erhalten.

  • Distributoren werden ermutigt, Python mit der optimierten Blake2-Bibliothek libb2 zu kompilieren.

  • Das Feld PyConfig.module_search_paths_set muss nun auf 1 gesetzt werden, damit die Initialisierung PyConfig.module_search_paths zum Initialisieren von sys.path verwendet. Andernfalls berechnet die Initialisierung den Pfad neu und überschreibt alle Werte, die zu module_search_paths hinzugefügt wurden.

  • PyConfig_Read() berechnet nicht mehr den initialen Suchpfad und füllt keine Werte in PyConfig.module_search_paths ein. Um Standardpfade zu berechnen und sie dann zu ändern, beenden Sie die Initialisierung und verwenden Sie PySys_GetObject(), um sys.path als Python-Listenobjekt abzurufen und es direkt zu ändern.

Veraltet

  • Die folgenden Funktionen zur Konfiguration der Python-Initialisierung sind veraltet

    • PySys_AddWarnOptionUnicode()

    • PySys_AddWarnOption()

    • PySys_AddXOption()

    • PySys_HasWarnOptions()

    • PySys_SetArgvEx()

    • PySys_SetArgv()

    • PySys_SetPath()

    • Py_SetPath()

    • Py_SetProgramName()

    • Py_SetPythonHome()

    • Py_SetStandardStreamEncoding()

    • _Py_SetProgramFullPath()

    Verwenden Sie stattdessen die neue PyConfig API der Python-Initialisierungskonfiguration (PEP 587). (Beigetragen von Victor Stinner in gh-88279.)

  • Das Mitglied ob_shash des PyBytesObject ist veraltet. Verwenden Sie stattdessen PyObject_Hash(). (Beigetragen von Inada Naoki in bpo-46864.)

Ausstehende Entfernung in Python 3.12

Die folgenden C-APIs wurden in früheren Python-Versionen als veraltet markiert und werden in Python 3.12 entfernt.

  • PyUnicode_AS_DATA()

  • PyUnicode_AS_UNICODE()

  • PyUnicode_AsUnicodeAndSize()

  • PyUnicode_AsUnicode()

  • PyUnicode_FromUnicode()

  • PyUnicode_GET_DATA_SIZE()

  • PyUnicode_GET_SIZE()

  • PyUnicode_GetSize()

  • PyUnicode_IS_COMPACT()

  • PyUnicode_IS_READY()

  • PyUnicode_READY()

  • PyUnicode_WSTR_LENGTH()

  • _PyUnicode_AsUnicode()

  • PyUnicode_WCHAR_KIND

  • PyUnicodeObject

  • PyUnicode_InternImmortal()

Entfernt

  • PyFrame_BlockSetup() und PyFrame_BlockPop() wurden entfernt. (Beigetragen von Mark Shannon in bpo-40222.)

  • Entfernen der folgenden Mathe-Makros, die die Variable errno verwenden

    • Py_ADJUST_ERANGE1()

    • Py_ADJUST_ERANGE2()

    • Py_OVERFLOWED()

    • Py_SET_ERRNO_ON_MATH_ERROR()

    • Py_SET_ERRNO_ON_MATH_ERROR()

    (Beigetragen von Victor Stinner in bpo-45412.)

  • Entfernen Sie die Makros Py_UNICODE_COPY() und Py_UNICODE_FILL(), die seit Python 3.3 veraltet sind. Verwenden Sie stattdessen die Funktionen PyUnicode_CopyCharacters() oder memcpy() (wchar_t* String) und PyUnicode_Fill(). (Beigetragen von Victor Stinner in bpo-41123.)

  • Entfernen Sie die Header-Datei pystrhex.h. Sie enthält nur private Funktionen. C-Erweiterungen sollten nur die Haupt-Header-Datei <Python.h> einbinden. (Beigetragen von Victor Stinner in bpo-45434.)

  • Entfernen Sie das Makro Py_FORCE_DOUBLE(). Es wurde vom Makro Py_IS_INFINITY() verwendet. (Beigetragen von Victor Stinner in bpo-45440.)

  • Die folgenden Elemente sind nicht mehr verfügbar, wenn Py_LIMITED_API definiert ist

    Diese sind kein Teil der begrenzten API.

    (Beigetragen von Victor Stinner in bpo-45474.)

  • Schließen Sie PyWeakref_GET_OBJECT() von der begrenzten C-API aus. Es hat seitdem nie funktioniert, dass die Struktur PyWeakReference in der begrenzten C-API opak ist. (Beigetragen von Victor Stinner in bpo-35134.)

  • Entfernen Sie das Makro PyHeapType_GET_MEMBERS(). Es wurde versehentlich in der öffentlichen C-API exponiert, es darf nur intern von Python verwendet werden. Verwenden Sie stattdessen das Mitglied PyTypeObject.tp_members. (Beigetragen von Victor Stinner in bpo-40170.)

  • Entfernen Sie das Makro HAVE_PY_SET_53BIT_PRECISION (verschoben zur internen C-API). (Beigetragen von Victor Stinner in bpo-45412.)

  • Entfernen Sie die Encoder-APIs Py_UNICODE, da sie seit Python 3.3 veraltet, wenig genutzt und im Vergleich zu den empfohlenen Alternativen ineffizient sind.

    Die entfernten Funktionen sind

    • PyUnicode_Encode()

    • PyUnicode_EncodeASCII()

    • PyUnicode_EncodeLatin1()

    • PyUnicode_EncodeUTF7()

    • PyUnicode_EncodeUTF8()

    • PyUnicode_EncodeUTF16()

    • PyUnicode_EncodeUTF32()

    • PyUnicode_EncodeUnicodeEscape()

    • PyUnicode_EncodeRawUnicodeEscape()

    • PyUnicode_EncodeCharmap()

    • PyUnicode_TranslateCharmap()

    • PyUnicode_EncodeDecimal()

    • PyUnicode_TransformDecimalToASCII()

    Siehe PEP 624 für Details und Migrationshinweise. (Beigetragen von Inada Naoki in bpo-44029.)

Bemerkenswerte Änderungen in 3.11.4

tarfile

  • Die Extraktionsmethoden in tarfile und shutil.unpack_archive() haben ein neues Argument filter, das es erlaubt, Tar-Funktionen einzuschränken, die überraschend oder gefährlich sein können, wie z. B. das Erstellen von Dateien außerhalb des Zielverzeichnisses. Details finden Sie unter Extraction filters. In Python 3.12 wird die Verwendung ohne das Argument filter eine DeprecationWarning anzeigen. In Python 3.14 wird der Standard auf 'data' umgestellt. (Beigetragen von Petr Viktorin in PEP 706.)

Bemerkenswerte Änderungen in 3.11.5

OpenSSL

  • Windows-Builds und macOS-Installer von python.org verwenden jetzt OpenSSL 3.0.