Python 3.10

Python 3.10.0 (final) wurde am 4. Oktober 2021 veröffentlicht. Die Funktionen für 3.10 sind in PEP 619 definiert, und eine ausführliche Beschreibung der Änderungen findet sich in What’s New in Python 3.10.

Neue Syntaxfunktionen

Status

PEP 634

Structural Pattern Matching: Spezifikation

[1]

PEP 635

Structural Pattern Matching: Motivation und Begründung

[1]

PEP 636

Structural Pattern Matching: Tutorial

[1]

bpo-12782

Geklammerte Kontextmanager sind nun offiziell erlaubt

Neue Funktionen in der Standardbibliothek

PEP 618

Optionale Längenprüfung zu zip hinzufügen

Verbesserungen am Interpreter

PEP 626

Präzise Zeilennummern für Debugging und andere Werkzeuge

Neue Typing-Funktionen

PEP 604

Union-Typen als X | Y schreiben erlauben

PEP 613

Explizite Typ-Aliasse

PEP 612

Parameter-Spezifikationsvariablen

Wichtige Veraltungen, Entfernungen oder Einschränkungen

PEP 644

OpenSSL 1.1.1 oder neuer erforderlich

PEP 632

Das distutils-Modul wird als veraltet markiert.

Nicht relevant

PEP 623

Das wstr-Mitglied in PyUnicodeObject wird als veraltet markiert und auf seine Entfernung vorbereitet.

Nicht relevant

PEP 624

Entfernen der Py_UNICODE-Encoder-APIs

Nicht relevant

PEP 597

Optionale EncodingWarning hinzufügen

Weitere Sprachänderungen:

Der Typ int verfügt über eine neue Methode int.bit_count(), die die Anzahl der Einsen in der Binärdarstellung einer gegebenen ganzen Zahl zurückgibt, auch bekannt als Population Count.

Die von dict.keys(), dict.values() und dict.items() zurückgegebenen Views besitzen nun alle ein mapping-Attribut, das ein types.MappingProxyType-Objekt liefert, welches das ursprüngliche Dictionary umschließt.

PEP 618: Die Funktion zip() verfügt nun über ein optionales strict-Flag, mit dem gefordert wird, dass alle iterierbaren Objekte die gleiche Länge haben.

Eingebaute und Erweiterungsfunktionen, die ganzzahlige Argumente entgegennehmen, akzeptieren keine Decimals, Fractions und andere Objekte mehr, die nur unter Verlust in ganze Zahlen umgewandelt werden können (z. B. solche, die die Methode __int__(), aber nicht die Methode __index__() besitzen).

Wenn object.__ipow__() NotImplemented zurückgibt, greift der Operator nun korrekt wie erwartet auf object.__pow__() und object.__rpow__() zurück.

Zuweisungsausdrücke können nun ohne Klammern innerhalb von Mengen-Literalen und Mengen-Comprehensions sowie in Sequenzindizes (aber nicht in Slices) verwendet werden.

Funktionen besitzen ein neues __builtins__-Attribut, das bei der Ausführung einer Funktion zum Nachschlagen eingebauter Symbole verwendet wird, anstatt in __globals__['__builtins__'] zu suchen. Das Attribut wird aus __globals__["__builtins__"] initialisiert, falls vorhanden, andernfalls aus den aktuellen Builtins.

Zwei neue eingebaute Funktionen – aiter() und anext() – wurden hinzugefügt, um asynchrone Gegenstücke zu iter() bzw. next() bereitzustellen.

Statische Methoden (@staticmethod) und Klassenmethoden (@classmethod) erben nun die Methodenattribute (__module__, __name__, __qualname__, __doc__, __annotations__) und besitzen ein neues __wrapped__-Attribut. Darüber hinaus sind statische Methoden nun wie reguläre Funktionen aufrufbar.

Annotationen für komplexe Ziele (alles außer den durch PEP 526 definierten simple name-Zielen) verursachen mit from __future__ import annotations keine Laufzeiteffekte mehr.

Klassen- und Modulobjekte erstellen nun leere Annotations-Dicts bei Bedarf träge. Die Annotations-Dicts werden aus Gründen der Abwärtskompatibilität im __dict__ des Objekts gespeichert. Dies verbessert die Best Practices für die Arbeit mit __annotations__.

Annotationen, die aus yield, yield from, await oder benannten Ausdrücken bestehen, sind unter from __future__ import annotations aufgrund ihrer Seiteneffekte nun verboten.

Die Verwendung ungebundener Variablen, von super() und anderer Ausdrücke, die die Verarbeitung der Symboltabelle verändern könnten, ist als Annotation unter from __future__ import annotations nun wirkungslos.

Hashes von NaN-Werten sowohl des Typs float als auch des Typs decimal.Decimal hängen nun von der Objektidentität ab. Früher wurden sie stets zu 0 gehasht, obwohl NaN-Werte nicht miteinander gleich sind. Dies führte beim Erstellen von Dictionaries und Mengen, die mehrere NaNs enthalten, aufgrund übermäßiger Hash-Kollisionen zu potenziell quadratischem Laufzeitverhalten.

Beim Löschen der Konstante __debug__ wird nun ein SyntaxError (statt eines NameError) ausgelöst.

SyntaxError-Ausnahmen besitzen nun die Attribute end_lineno und end_offset. Sie sind None, falls sie nicht bestimmt werden konnten.

Änderungen an eingebauten Modulen:

asyncio

Die fehlende Methode connect_accepted_socket() wurde hinzugefügt.

array

Die Methode index() von array.array besitzt nun optionale Parameter start und stop.

gc

Audit-Hooks für gc.get_objects(), gc.get_referrers() und gc.get_referents() wurden hinzugefügt.

hashlib

Das hashlib-Modul erfordert OpenSSL 1.1.1 oder neuer.

Das hashlib-Modul unterstützt vorläufig OpenSSL 3.0.0.

Der reine Python-Fallback von pbkdf2_hmac() ist veraltet. Künftig wird PBKDF2-HMAC nur verfügbar sein, wenn Python mit OpenSSL-Unterstützung gebaut wurde.

os

Unterstützung von os.cpu_count() für VxWorks RTOS hinzugefügt.

Eine neue Funktion os.eventfd() und zugehörige Hilfsfunktionen wurden hinzugefügt, um den eventfd2-Syscall unter Linux zu umschließen.

Hinzugefügt wurde os.splice(), das es ermöglicht, Daten zwischen zwei Dateideskriptoren zu verschieben, ohne zwischen Kernel- und Benutzeradressraum zu kopieren, wobei einer der Dateideskriptoren auf eine Pipe verweisen muss.

O_EVTONLY, O_FSYNC, O_SYMLINK und O_NOFOLLOW_ANY für macOS hinzugefügt.

platform

platform.freedesktop_os_release() wurde hinzugefügt, um die Betriebssystemkennung aus der freedesktop.org os-release-Standarddatei abzurufen.

socket

Die Ausnahme socket.timeout ist nun ein Alias von TimeoutError.

Option zum Erstellen von MPTCP-Sockets mit IPPROTO_MPTCP hinzugefügt.

Die Option IP_RECVTOS wurde hinzugefügt, um die Felder Type of Service (ToS) oder DSCP/ECN zu empfangen.

ssl

Das ssl-Modul erfordert OpenSSL 1.1.1 oder neuer.

Das ssl-Modul unterstützt vorläufig OpenSSL 3.0.0 und die neue Option OP_IGNORE_UNEXPECTED_EOF.

Veraltete Funktionen und die Verwendung veralteter Konstanten führen nun zu einer DeprecationWarning. Bei ssl.SSLContext.options sind OP_NO_SSLv2 und OP_NO_SSLv3 standardmäßig gesetzt und können daher nicht vor dem erneuten Setzen des Flags warnen.

Das ssl-Modul hat nun sicherere Standardeinstellungen. Cipher ohne Forward Secrecy oder mit SHA-1-MAC sind standardmäßig deaktiviert. Sicherheitsstufe 2 verbietet schwache RSA-, DH- und ECC-Schlüssel mit weniger als 112 Bit Sicherheit. SSLContext verwendet standardmäßig die Mindestprotokollversion TLS 1.2. Die Einstellungen basieren auf den Untersuchungen von Hynek Schlawack.

Die veralteten Protokolle SSL 3.0, TLS 1.0 und TLS 1.1 werden nicht mehr offiziell unterstützt. Python blockiert sie nicht aktiv. Allerdings können OpenSSL-Build-Optionen, Distributionskonfigurationen, Hersteller-Patches und Cipher-Suites einen erfolgreichen Handshake verhindern.

Ein Parameter timeout wurde zur Funktion ssl.get_server_certificate() hinzugefügt.

Das ssl-Modul verwendet Heap-Typen und mehrphasige Initialisierung.

Ein neues Verify-Flag VERIFY_X509_PARTIAL_CHAIN wurde hinzugefügt.

sys

Das Attribut sys.orig_argv wurde hinzugefügt: die Liste der ursprünglichen Befehlszeilenargumente, die an die Python-Executable übergeben wurden.

Hinzugefügt wurde sys.stdlib_module_names, das die Liste der Modulnamen der Standardbibliothek enthält.

_thread

_thread.interrupt_main() nimmt nun eine optionale Signalnummer entgegen, die simuliert werden soll (der Standardwert ist weiterhin signal.SIGINT).

Hinweise