Was ist neu in Python 3.10

Editor:

Pablo Galindo Salgado

Dieser Artikel erklärt die neuen Funktionen in Python 3.10 im Vergleich zu 3.9. Python 3.10 wurde am 4. Oktober 2021 veröffentlicht. Für vollständige Details siehe die Änderungsprotokoll.

Zusammenfassung – Release-Highlights

Neue Syntaxfunktionen

  • PEP 634, Strukturelle Mustererkennung: Spezifikation

  • PEP 635, Strukturelle Mustererkennung: Motivation und Begründung

  • PEP 636, Strukturelle Mustererkennung: Tutorial

  • bpo-12782, Klammerausdrücke für Context Manager sind jetzt offiziell erlaubt.

Neue Funktionen in der Standardbibliothek

  • PEP 618, Hinzufügen einer optionalen Längenprüfung zu zip.

Interpreter-Verbesserungen

  • PEP 626, Präzise Zeilennummern für Debugging und andere Werkzeuge.

Neue Typ-Annotation-Funktionen

  • PEP 604, Erlaubt das Schreiben von Union-Typen als X | Y

  • PEP 612, Parameter-Spezifikationsvariablen

  • PEP 613, Explizite Typ-Aliase

  • PEP 647, Benutzerdefinierte Typ-Guards

Wichtige Deprecations, Entfernungen oder Einschränkungen

  • PEP 644, Erfordert OpenSSL 1.1.1 oder neuer

  • PEP 632, Deprecate des distutils-Moduls.

  • PEP 623, Deprecate und Vorbereitung auf die Entfernung des wstr-Members in PyUnicodeObject.

  • PEP 624, Entfernung der Py_UNICODE Encoder APIs

  • PEP 597, Hinzufügen der optionalen EncodingWarning

Neue Funktionen

Klammerausdrücke für Context Manager

Die Verwendung von einschließenden Klammern für die Fortsetzung über mehrere Zeilen in Context Managern wird nun unterstützt. Dies ermöglicht das Formatieren einer langen Sammlung von Context Managern auf mehreren Zeilen, ähnlich wie es zuvor bei Import-Anweisungen möglich war. Zum Beispiel sind alle diese Beispiele jetzt gültig

with (CtxManager() as example):
    ...

with (
    CtxManager1(),
    CtxManager2()
):
    ...

with (CtxManager1() as example,
      CtxManager2()):
    ...

with (CtxManager1(),
      CtxManager2() as example):
    ...

with (
    CtxManager1() as example1,
    CtxManager2() as example2
):
    ...

Es ist auch möglich, ein nachgestelltes Komma am Ende der eingeschlossenen Gruppe zu verwenden

with (
    CtxManager1() as example1,
    CtxManager2() as example2,
    CtxManager3() as example3,
):
    ...

Diese neue Syntax nutzt die nicht LL(1)-Fähigkeiten des neuen Parsers. Siehe PEP 617 für weitere Details.

(Beigetragen von Guido van Rossum, Pablo Galindo und Lysandros Nikolaou in bpo-12782 und bpo-40334.)

Bessere Fehlermeldungen

SyntaxErrors

Beim Parsen von Code, der ungeschlossene Klammern enthält, gibt der Interpreter nun den Speicherort der ungeschlossenen Klammer an, anstatt *SyntaxError: unexpected EOF while parsing* anzuzeigen oder auf eine falsche Position zu verweisen. Betrachten Sie zum Beispiel den folgenden Code (beachten Sie die ungeschlossene '{')

expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
            38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6,
some_other_code = foo()

Frühere Versionen des Interpreters meldeten verwirrende Stellen als Speicherort des Syntaxfehlers

File "example.py", line 3
    some_other_code = foo()
                    ^
SyntaxError: invalid syntax

aber in Python 3.10 wird eine informativere Fehlermeldung ausgegeben

File "example.py", line 1
    expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
               ^
SyntaxError: '{' was never closed

In ähnlicher Weise weisen Fehler mit ungeschlossenen String-Literalen (einfache und dreifache Anführungszeichen) nun auf den Beginn des Strings hin, anstatt EOF/EOL zu melden.

Diese Verbesserungen sind von früheren Arbeiten im PyPy-Interpreter inspiriert.

(Beigetragen von Pablo Galindo in bpo-42864 und Batuhan Taskaya in bpo-40176.)

SyntaxError Ausnahmen, die vom Interpreter ausgelöst werden, werden nun den gesamten Fehlerbereich des Ausdrucks hervorheben, der den Syntaxfehler selbst darstellt, anstatt nur dort, wo das Problem erkannt wird. Auf diese Weise, anstatt anzuzeigen (vor Python 3.10)

>>> foo(x, z for z in range(10), t, w)
  File "<stdin>", line 1
    foo(x, z for z in range(10), t, w)
           ^
SyntaxError: Generator expression must be parenthesized

wird die Ausnahme in Python 3.10 nun so angezeigt

>>> foo(x, z for z in range(10), t, w)
  File "<stdin>", line 1
    foo(x, z for z in range(10), t, w)
           ^^^^^^^^^^^^^^^^^^^^
SyntaxError: Generator expression must be parenthesized

Diese Verbesserung wurde von Pablo Galindo in bpo-43914 beigetragen.

Eine beträchtliche Anzahl neuer spezialisierter Meldungen für SyntaxError Ausnahmen wurde aufgenommen. Einige der bemerkenswertesten sind wie folgt

  • Fehlendes : vor Blöcken

    >>> if rocket.position > event_horizon
      File "<stdin>", line 1
        if rocket.position > event_horizon
                                          ^
    SyntaxError: expected ':'
    

    (Beigetragen von Pablo Galindo in bpo-42997.)

  • Ungeschweifte Tupel in Comprehension-Zielen

    >>> {x,y for x,y in zip('abcd', '1234')}
      File "<stdin>", line 1
        {x,y for x,y in zip('abcd', '1234')}
         ^
    SyntaxError: did you forget parentheses around the comprehension target?
    

    (Beigetragen von Pablo Galindo in bpo-43017.)

  • Fehlende Kommas in Collections-Literalen und zwischen Ausdrücken

    >>> items = {
    ... x: 1,
    ... y: 2
    ... z: 3,
      File "<stdin>", line 3
        y: 2
           ^
    SyntaxError: invalid syntax. Perhaps you forgot a comma?
    

    (Beigetragen von Pablo Galindo in bpo-43822.)

  • Mehrere Ausnahmetypen ohne Klammern

    >>> try:
    ...     build_dyson_sphere()
    ... except NotEnoughScienceError, NotEnoughResourcesError:
      File "<stdin>", line 3
        except NotEnoughScienceError, NotEnoughResourcesError:
               ^
    SyntaxError: multiple exception types must be parenthesized
    

    (Beigetragen von Pablo Galindo in bpo-43149.)

  • Fehlendes : und Werte in Dictionary-Literalen

    >>> values = {
    ... x: 1,
    ... y: 2,
    ... z:
    ... }
      File "<stdin>", line 4
        z:
         ^
    SyntaxError: expression expected after dictionary key and ':'
    
    >>> values = {x:1, y:2, z w:3}
      File "<stdin>", line 1
        values = {x:1, y:2, z w:3}
                            ^
    SyntaxError: ':' expected after dictionary key
    

    (Beigetragen von Pablo Galindo in bpo-43823.)

  • try Blöcke ohne except oder finally Blöcke

    >>> try:
    ...     x = 2
    ... something = 3
      File "<stdin>", line 3
        something  = 3
        ^^^^^^^^^
    SyntaxError: expected 'except' or 'finally' block
    

    (Beigetragen von Pablo Galindo in bpo-44305.)

  • Verwendung von = anstelle von == in Vergleichen

    >>> if rocket.position = event_horizon:
      File "<stdin>", line 1
        if rocket.position = event_horizon:
                           ^
    SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='?
    

    (Beigetragen von Pablo Galindo in bpo-43797.)

  • Verwendung von * in f-Strings

    >>> f"Black holes {*all_black_holes} and revelations"
      File "<stdin>", line 1
        (*all_black_holes)
         ^
    SyntaxError: f-string: cannot use starred expression here
    

    (Beigetragen von Pablo Galindo in bpo-41064.)

IndentationErrors

Viele IndentationError Ausnahmen haben nun mehr Kontext bezüglich der Art des Blocks, der eine Einrückung erwartete, einschließlich des Speicherorts der Anweisung

>>> def foo():
...    if lel:
...    x = 2
  File "<stdin>", line 3
    x = 2
    ^
IndentationError: expected an indented block after 'if' statement in line 2

AttributeErrors

Beim Drucken von AttributeError bietet PyErr_Display() Vorschläge für ähnliche Attributnamen im Objekt, von dem die Ausnahme ausgelöst wurde

>>> collections.namedtoplo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'collections' has no attribute 'namedtoplo'. Did you mean: namedtuple?

(Beigetragen von Pablo Galindo in bpo-38530.)

Warnung

Beachten Sie, dass dies nicht funktioniert, wenn PyErr_Display() nicht zum Anzeigen des Fehlers aufgerufen wird, was passieren kann, wenn eine andere benutzerdefinierte Fehleranzeigefunktion verwendet wird. Dies ist ein häufiges Szenario in einigen REPLs wie IPython.

NameErrors

Beim Drucken von NameError, die vom Interpreter ausgelöst werden, bietet PyErr_Display() Vorschläge für ähnliche Variablennamen in der Funktion, von der die Ausnahme ausgelöst wurde

>>> schwarzschild_black_hole = None
>>> schwarschild_black_hole
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'schwarschild_black_hole' is not defined. Did you mean: schwarzschild_black_hole?

(Beigetragen von Pablo Galindo in bpo-38530.)

Warnung

Beachten Sie, dass dies nicht funktioniert, wenn PyErr_Display() nicht zum Anzeigen des Fehlers aufgerufen wird, was passieren kann, wenn eine andere benutzerdefinierte Fehleranzeigefunktion verwendet wird. Dies ist ein häufiges Szenario in einigen REPLs wie IPython.

PEP 626: Präzise Zeilennummern für Debugging und andere Werkzeuge

PEP 626 bringt präzisere und zuverlässigere Zeilennummern für Debugging-, Profiling- und Coverage-Tools. Trace-Events mit der korrekten Zeilennummer werden für alle ausgeführten Codezeilen und nur für Codezeilen generiert, die auch tatsächlich ausgeführt werden.

Das Attribut f_lineno von Frame-Objekten enthält immer die erwartete Zeilennummer.

Das Attribut co_lnotab von Code-Objekten wird deprecatiert und in 3.12 entfernt. Code, der von Offset zu Zeilennummer konvertieren muss, sollte stattdessen die neue Methode co_lines() verwenden.

PEP 634: Strukturelle Mustererkennung

Strukturelle Mustererkennung wurde in Form einer *match-Anweisung* und *case-Anweisungen* mit Mustern und zugehörigen Aktionen hinzugefügt. Muster bestehen aus Sequenzen, Abbildungen, primitiven Datentypen sowie Klasseninstanzen. Mustererkennung ermöglicht es Programmen, Informationen aus komplexen Datentypen zu extrahieren, basierend auf der Datenstruktur zu verzweigen und spezifische Aktionen basierend auf verschiedenen Datenformen anzuwenden.

Syntax und Operationen

Die allgemeine Syntax der Mustererkennung ist

match subject:
    case <pattern_1>:
        <action_1>
    case <pattern_2>:
        <action_2>
    case <pattern_3>:
        <action_3>
    case _:
        <action_wildcard>

Eine `match`-Anweisung nimmt einen Ausdruck und vergleicht dessen Wert mit aufeinanderfolgenden Mustern, die als ein oder mehrere `case`-Blöcke angegeben sind. Genauer gesagt, die Mustererkennung arbeitet durch

  1. die Verwendung von Daten mit Typ und Form (dem subject)

  2. die Auswertung des subject in der match-Anweisung

  3. den Vergleich des Subjects mit jedem Muster in einer case-Anweisung von oben nach unten, bis ein Treffer bestätigt ist.

  4. die Ausführung der Aktion, die dem Muster des bestätigten Treffers zugeordnet ist

  5. Wenn kein exakter Treffer bestätigt wird, wird der letzte Fall, eine Wildcard `_`, falls vorhanden, als übereinstimmender Fall verwendet. Wenn kein exakter Treffer bestätigt wird und kein Wildcard-Fall vorhanden ist, ist der gesamte `match`-Block eine No-Op.

Deklarativer Ansatz

Leser sind möglicherweise mit Mustererkennung durch das einfache Beispiel des Abgleichs eines Subjects (Datenobjekt) mit einem Literal (Muster) vertraut, wie es in der `switch`-Anweisung in C, Java oder JavaScript (und vielen anderen Sprachen) vorkommt. Oft wird die `switch`-Anweisung für den Vergleich eines Objekts/Ausdrucks mit `case`-Anweisungen verwendet, die Literale enthalten.

Leistungsfähigere Beispiele für Mustererkennung finden sich in Sprachen wie Scala und Elixir. Mit struktureller Mustererkennung ist der Ansatz „deklarativ“ und gibt explizit die Bedingungen (die Muster) für einen Datenabgleich an.

Während eine „imperative“ Abfolge von Anweisungen mit verschachtelten „if“-Anweisungen verwendet werden könnte, um etwas Ähnliches wie strukturelle Mustererkennung zu erreichen, ist dies weniger klar als der „deklarative“ Ansatz. Stattdessen gibt der „deklarative“ Ansatz die Bedingungen an, die für einen Treffer erfüllt sein müssen, und ist durch seine expliziten Muster besser lesbar. Während strukturelle Mustererkennung in ihrer einfachsten Form zum Vergleichen einer Variablen mit einem Literal in einer `case`-Anweisung verwendet werden kann, liegt ihr wahrer Wert für Python in der Behandlung von Typ und Form des Subjects.

Einfaches Muster: Abgleich mit einem Literal

Betrachten wir dieses Beispiel als Mustererkennung in ihrer einfachsten Form: ein Wert, das Subject, wird mit mehreren Literalen, den Mustern, abgeglichen. Im folgenden Beispiel ist status das Subject der `match`-Anweisung. Die Muster sind jeweils die `case`-Anweisungen, wobei Literale Anforderungsstatuscodes darstellen. Die zugehörige Aktion zum Fall wird nach einem Treffer ausgeführt

def http_error(status):
    match status:
        case 400:
            return "Bad request"
        case 404:
            return "Not found"
        case 418:
            return "I'm a teapot"
        case _:
            return "Something's wrong with the internet"

Wenn der obige Funktion ein status von 418 übergeben wird, wird „I’m a teapot“ zurückgegeben. Wenn der obigen Funktion ein status von 500 übergeben wird, trifft die `case`-Anweisung mit _ als Wildcard, und „Something’s wrong with the internet“ wird zurückgegeben. Beachten Sie den letzten Block: Der Variablenname, _, fungiert als Wildcard und stellt sicher, dass das Subject immer übereinstimmt. Die Verwendung von _ ist optional.

Sie können mehrere Literale in einem einzigen Muster mit | („oder“) kombinieren

case 401 | 403 | 404:
    return "Not allowed"
Verhalten ohne Wildcard

Wenn wir das obige Beispiel ändern, indem wir den letzten `case`-Block entfernen, wird das Beispiel

def http_error(status):
    match status:
        case 400:
            return "Bad request"
        case 404:
            return "Not found"
        case 418:
            return "I'm a teapot"

Ohne die Verwendung von _ in einer `case`-Anweisung kann es keinen Treffer geben. Wenn kein Treffer existiert, ist das Verhalten eine No-Op. Zum Beispiel, wenn ein status von 500 übergeben wird, tritt eine No-Op auf.

Muster mit einem Literal und einer Variablen

Muster können wie Entpackungszuweisungen aussehen, und ein Muster kann verwendet werden, um Variablen zu binden. In diesem Beispiel kann ein Datenpunkt in seine x-Koordinate und y-Koordinate entpackt werden

# point is an (x, y) tuple
match point:
    case (0, 0):
        print("Origin")
    case (0, y):
        print(f"Y={y}")
    case (x, 0):
        print(f"X={x}")
    case (x, y):
        print(f"X={x}, Y={y}")
    case _:
        raise ValueError("Not a point")

Das erste Muster hat zwei Literale, (0, 0), und kann als Erweiterung des oben gezeigten Literal-Musters betrachtet werden. Die nächsten beiden Muster kombinieren ein Literal und eine Variable, und die Variable bindet einen Wert aus dem Subject (point). Das vierte Muster erfasst zwei Werte, was es konzeptionell der Entpackungszuweisung (x, y) = point ähnlich macht.

Muster und Klassen

Wenn Sie Klassen zur Strukturierung Ihrer Daten verwenden, können Sie den Klassennamen gefolgt von einer Argumentliste, die einem Konstruktor ähnelt, als Muster verwenden. Dieses Muster hat die Fähigkeit, Instanzattribute in Variablen zu erfassen

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

def location(point):
    match point:
        case Point(x=0, y=0):
            print("Origin is the point's location.")
        case Point(x=0, y=y):
            print(f"Y={y} and the point is on the y-axis.")
        case Point(x=x, y=0):
            print(f"X={x} and the point is on the x-axis.")
        case Point():
            print("The point is located somewhere else on the plane.")
        case _:
            print("Not a point")
Muster mit positionsbezogenen Parametern

Sie können positionsbezogene Parameter mit einigen integrierten Klassen verwenden, die eine Reihenfolge für ihre Attribute bereitstellen (z. B. Dataclasses). Sie können auch eine bestimmte Position für Attribute in Mustern definieren, indem Sie das spezielle Attribut __match_args__ in Ihren Klassen festlegen. Wenn es auf ("x", "y") gesetzt ist, sind die folgenden Muster alle äquivalent (und alle binden das Attribut y an die Variable var)

Point(1, var)
Point(1, y=var)
Point(x=1, y=var)
Point(y=var, x=1)

Verschachtelte Muster

Muster können beliebig verschachtelt werden. Zum Beispiel, wenn unsere Daten eine kurze Liste von Punkten sind, könnten sie so abgeglichen werden

match points:
    case []:
        print("No points in the list.")
    case [Point(0, 0)]:
        print("The origin is the only point in the list.")
    case [Point(x, y)]:
        print(f"A single point {x}, {y} is in the list.")
    case [Point(0, y1), Point(0, y2)]:
        print(f"Two points on the Y axis at {y1}, {y2} are in the list.")
    case _:
        print("Something else is found in the list.")

Komplexe Muster und die Wildcard

Bis zu diesem Punkt wurden Beispiele verwendet, die _ allein im letzten `case`-Statement verwenden. Eine Wildcard kann in komplexeren Mustern verwendet werden, wie z. B. ('error', code, _). Zum Beispiel

match test_variable:
    case ('warning', code, 40):
        print("A warning has been received.")
    case ('error', code, _):
        print(f"An error {code} occurred.")

Im obigen Fall wird test_variable für ('error', code, 100) und ('error', code, 800) abgeglichen.

Guard

Wir können eine if-Klausel zu einem Muster hinzufügen, bekannt als „Guard“. Wenn der Guard falsch ist, versucht match weiterhin, den nächsten `case`-Block zu versuchen. Beachten Sie, dass die Wertaufnahme vor der Auswertung des Guards erfolgt

match point:
    case Point(x, y) if x == y:
        print(f"The point is located on the diagonal Y=X at {x}.")
    case Point(x, y):
        print(f"Point is not on the diagonal.")

Weitere wichtige Funktionen

Mehrere weitere wichtige Funktionen

  • Ähnlich wie Entpackungszuweisungen haben Tupel- und Listenmuster exakt die gleiche Bedeutung und gleichen tatsächlich beliebige Sequenzen ab. Technisch muss das Subject eine Sequenz sein. Daher ist eine wichtige Ausnahme, dass Muster keine Iteratoren abgleichen. Um einen häufigen Fehler zu vermeiden, gleichen Sequenzmuster auch keine Strings ab.

  • Sequenzmuster unterstützen Wildcards: [x, y, *rest] und (x, y, *rest) funktionieren ähnlich wie Wildcards bei Entpackungszuweisungen. Der Name nach * kann auch _ sein, sodass (x, y, *_) eine Sequenz von mindestens zwei Elementen abgleicht, ohne die verbleibenden Elemente zu binden.

  • Mapping-Muster: {"bandwidth": b, "latency": l} erfasst die Werte "bandwidth" und "latency" aus einem Dict. Im Gegensatz zu Sequenzmustern werden zusätzliche Schlüssel ignoriert. Eine Wildcard **rest wird ebenfalls unterstützt. (Aber **_ wäre redundant und ist daher nicht erlaubt.)

  • Submuster können mit dem Schlüsselwort as erfasst werden

    case (Point(x1, y1), Point(x2, y2) as p2): ...
    

    Dies bindet x1, y1, x2, y2 wie erwartet ohne die as-Klausel und p2 an das gesamte zweite Element des Subjects.

  • Die meisten Literale werden per Gleichheit verglichen. Die Singletons True, False und None werden jedoch per Identität verglichen.

  • Benannte Konstanten können in Mustern verwendet werden. Diese benannten Konstanten müssen Punktnamen sein, um zu verhindern, dass die Konstante als Erfassungsvariable interpretiert wird

    from enum import Enum
    class Color(Enum):
        RED = 0
        GREEN = 1
        BLUE = 2
    
    color = Color.GREEN
    match color:
        case Color.RED:
            print("I see red!")
        case Color.GREEN:
            print("Grass is green")
        case Color.BLUE:
            print("I'm feeling the blues :(")
    

Für die vollständige Spezifikation siehe PEP 634. Motivation und Begründung finden Sie in PEP 635, und ein längeres Tutorial finden Sie in PEP 636.

Optionale EncodingWarning und die Option encoding="locale"

Die Standardkodierung von TextIOWrapper und open() ist plattform- und localesabhängig. Da auf den meisten Unix-Plattformen UTF-8 verwendet wird, ist das Weglassen der encoding-Option beim Öffnen von UTF-8-Dateien (z. B. JSON, YAML, TOML, Markdown) ein sehr häufiger Fehler. Zum Beispiel

# BUG: "rb" mode or encoding="utf-8" should be used.
with open("data.json") as f:
    data = json.load(f)

Um diese Art von Fehler zu finden, wird eine optionale EncodingWarning hinzugefügt. Sie wird ausgegeben, wenn sys.flags.warn_default_encoding wahr ist und die localespezifische Standardkodierung verwendet wird.

Die Option -X warn_default_encoding und die Umgebungsvariable PYTHONWARNDEFAULTENCODING wurden hinzugefügt, um die Warnung zu aktivieren.

Siehe Textkodierung für weitere Informationen.

Andere Sprachänderungen

  • Der Typ int hat eine neue Methode int.bit_count(), die die Anzahl der Einsen in der binären Darstellung einer gegebenen Ganzzahl zurückgibt, auch bekannt als Populationszahl. (Beigetragen von Niklas Fiekas in bpo-29882.)

  • Die von dict.keys(), dict.values() und dict.items() zurückgegebenen Ansichten haben nun alle ein mapping-Attribut, das ein types.MappingProxyType-Objekt zurückgibt, das das ursprüngliche Dictionary umschließt. (Beigetragen von Dennis Sweeney in bpo-40890.)

  • PEP 618: Die Funktion zip() hat nun ein optionales strict-Flag, das verwendet wird, um zu verlangen, dass alle Iterables gleich lang sind.

  • Integrierte und Erweiterungsfunktionen, die Ganzzahlargumente entgegennehmen, akzeptieren keine Decimals, Fractions und andere Objekte mehr, die nur mit Verlust in Ganzzahlen umgewandelt werden können (z. B. die die Methode __int__() haben, aber nicht die Methode __index__() haben). (Beigetragen von Serhiy Storchaka in bpo-37999.)

  • Wenn object.__ipow__() NotImplemented zurückgibt, wird der Operator erwartungsgemäß korrekt auf object.__pow__() und object.__rpow__() zurückfallen. (Beigetragen von Alex Shkop in bpo-38302.)

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

  • Funktionen haben ein neues Attribut __builtins__, das zum Suchen nach Builtin-Symbolen verwendet wird, wenn eine Funktion ausgeführt wird, anstatt in __globals__['__builtins__'] zu suchen. Das Attribut wird von __globals__["__builtins__"] initialisiert, wenn es existiert, andernfalls von den aktuellen Builtins. (Beigetragen von Mark Shannon in bpo-42990.)

  • Zwei neue Builtin-Funktionen – aiter() und anext() – wurden hinzugefügt, um asynchrone Gegenstücke zu iter() und next() bereitzustellen. (Beigetragen von Joshua Bronson, Daniel Pope und Justin Wang in bpo-31861.)

  • Statische Methoden (@staticmethod) und Klassenmethoden (@classmethod) erben jetzt die Methodenattribute (__module__, __name__, __qualname__, __doc__, __annotations__) und haben ein neues Attribut __wrapped__. Außerdem sind statische Methoden jetzt wie normale Funktionen aufrufbar. (Beigetragen von Victor Stinner in bpo-43682.)

  • Annotationen für komplexe Ziele (alles außer einfachen Namen, die von PEP 526 definiert werden) haben keine Laufzeiteffekte mehr mit from __future__ import annotations. (Beigetragen von Batuhan Taskaya in bpo-42737.)

  • Klassen- und Objektmodule erstellen jetzt bei Bedarf lazy leere Annotations-Dicts. Die Annotations-Dicts werden aus Kompatibilitätsgründen im __dict__ des Objekts gespeichert. Dies verbessert die Best Practices für die Arbeit mit __annotations__; weitere Informationen finden Sie unter Best Practices für Annotationen. (Beigetragen von Larry Hastings in bpo-43901.)

  • Annotationen, die aus yield, yield from, await oder benannten Ausdrücken bestehen, sind nun unter from __future__ import annotations wegen ihrer Seiteneffekte verboten. (Beigetragen von Batuhan Taskaya in bpo-42725.)

  • Die Verwendung von ungebundenen Variablen, super() und anderen Ausdrücken, die die Verarbeitung der Symboltabelle als Annotationen beeinflussen könnten, werden nun unter from __future__ import annotations wirkungslos gemacht. (Beigetragen von Batuhan Taskaya in bpo-42725.)

  • Hashes von NaN-Werten sowohl vom Typ float als auch vom Typ decimal.Decimal hängen jetzt von der Objektidentität ab. Zuvor wurden sie immer nach 0 gehasht, obwohl NaN-Werte nicht gleich sind. Dies führte zu potenziell quadratischem Laufzeitverhalten aufgrund von übermäßigen Hash-Kollisionen beim Erstellen von Dictionaries und Sets, die mehrere NaNs enthielten. (Beigetragen von Raymond Hettinger in bpo-43475.)

  • Ein SyntaxError (anstatt eines NameError) wird ausgelöst, wenn die Konstante __debug__ gelöscht wird. (Beigetragen von Donghee Na in bpo-45000.)

  • SyntaxError-Ausnahmen haben jetzt Attribute end_lineno und end_offset. Sie sind None, wenn sie nicht bestimmt werden konnten. (Beigetragen von Pablo Galindo in bpo-43914.)

Neue Module

  • Keine.

Verbesserte Module

asyncio

Fehlende Methode connect_accepted_socket() hinzugefügt. (Beigetragen von Alex Grönholm in bpo-41332.)

argparse

Irreführende Phrase "optional arguments" wurde in argparse-Hilfe durch "options" ersetzt. Einige Tests erfordern möglicherweise Anpassungen, wenn sie von exakten Ausgabeübereinstimmungen abhängen. (Beigetragen von Raymond Hettinger in bpo-9694.)

array

Die Methode index() von array.array hat jetzt optionale Parameter start und stop. (Beigetragen von Anders Lorentsen und Zackery Spytz in bpo-31956.)

asynchat, asyncore, smtpd

Diese Module wurden seit Python 3.6 in ihrer Moduldokumentation als veraltet gekennzeichnet. Eine DeprecationWarning beim Import wurde nun zu allen drei Modulen hinzugefügt.

base64

base64.b32hexencode() und base64.b32hexdecode() hinzugefügt zur Unterstützung der Base32-Kodierung mit erweitertem Hex-Alphabet.

bdb

clearBreakpoints() hinzugefügt, um alle gesetzten Haltepunkte zurückzusetzen. (Beigetragen von Irit Katriel in bpo-24160.)

bisect

Möglichkeit hinzugefügt, eine key-Funktion an die APIs im Modul bisect zu übergeben. (Beigetragen von Raymond Hettinger in bpo-4356.)

codecs

Eine Funktion codecs.unregister() hinzugefügt, um eine Codec-Suchfunktion zu deregistrieren. (Beigetragen von Hai Shi in bpo-41842.)

collections.abc

Die __args__ des parametrisierten generischen Typs für collections.abc.Callable sind jetzt konsistent mit typing.Callable. Der collections.abc.Callable-Generik flacht jetzt Typenparameter ab, ähnlich wie es typing.Callable derzeit tut. Das bedeutet, dass collections.abc.Callable[[int, str], str] __args__ von (int, str, str) haben wird; zuvor war dies ([int, str], str). Um diese Änderung zu ermöglichen, kann types.GenericAlias jetzt Unterklassen bilden, und eine Unterklasse wird zurückgegeben, wenn der Typ collections.abc.Callable subscripted wird. Beachten Sie, dass ein TypeError für ungültige Formen der Parametrisierung von collections.abc.Callable ausgelöst werden kann, die in Python 3.9 möglicherweise stillschweigend bestanden haben. (Beigetragen von Ken Jin in bpo-42195.)

contextlib

Kontextmanager contextlib.aclosing() hinzugefügt, um asynchrone Generatoren und Objekte, die asynchron freigegebene Ressourcen darstellen, sicher zu schließen. (Beigetragen von Joongi Kim und John Belmonte in bpo-41229.)

Asynchrone Kontextmanager-Unterstützung zu contextlib.nullcontext() hinzugefügt. (Beigetragen von Tom Gringauz in bpo-41543.)

AsyncContextDecorator hinzugefügt, zur Unterstützung der Verwendung von asynchronen Kontextmanagern als Dekoratoren.

curses

Die erweiterten Farbfunktionen, die in ncurses 6.1 hinzugefügt wurden, werden transparent von curses.color_content(), curses.init_color(), curses.init_pair() und curses.pair_content() verwendet. Eine neue Funktion, curses.has_extended_color_support(), zeigt an, ob die zugrunde liegende ncurses-Bibliothek erweiterte Farbsupport bietet. (Beigetragen von Jeffrey Kintscher und Hans Petter Jansson in bpo-36982.)

Die Konstanten BUTTON5_* werden jetzt im Modul curses verfügbar gemacht, wenn sie von der zugrunde liegenden curses-Bibliothek bereitgestellt werden. (Beigetragen von Zackery Spytz in bpo-39273.)

dataclasses

__slots__

Parameter slots im Dekorator dataclasses.dataclass() hinzugefügt. (Beigetragen von Yurii Karabas in bpo-42269)

Keyword-only Felder

Dataclasses unterstützt jetzt Felder, die in der generierten `__init__`-Methode nur als Schlüsselwörter angegeben werden können. Es gibt eine Reihe von Möglichkeiten, nur-Schlüsselwort-Felder anzugeben.

Sie können angeben, dass jedes Feld nur-Schlüsselwort ist

from dataclasses import dataclass

@dataclass(kw_only=True)
class Birthday:
    name: str
    birthday: datetime.date

Sowohl name als auch birthday sind nur-Schlüsselwort-Parameter für die generierte `__init__`-Methode.

Sie können nur-Schlüsselwort pro Feld angeben

from dataclasses import dataclass, field

@dataclass
class Birthday:
    name: str
    birthday: datetime.date = field(kw_only=True)

Hier ist nur birthday nur-Schlüsselwort. Wenn Sie kw_only für einzelne Felder festlegen, beachten Sie, dass es Regeln für die Neuanordnung von Feldern gibt, da nur-Schlüsselwort-Felder auf nicht nur-Schlüsselwort-Felder folgen müssen. Weitere Details finden Sie in der vollständigen Dataclasses-Dokumentation.

Sie können auch angeben, dass alle Felder nach einem KW_ONLY-Marker nur-Schlüsselwort sind. Dies wird wahrscheinlich die häufigste Verwendung sein

from dataclasses import dataclass, KW_ONLY

@dataclass
class Point:
    x: float
    y: float
    _: KW_ONLY
    z: float = 0.0
    t: float = 0.0

Hier sind z und t nur-Schlüsselwort-Parameter, während x und y es nicht sind. (Beigetragen von Eric V. Smith in bpo-43532.)

distutils

Das gesamte Paket distutils ist veraltet und wird in Python 3.12 entfernt. Seine Funktionalität zur Spezifikation von Paketbuilds wurde bereits vollständig durch Drittanbieterpakete setuptools und packaging ersetzt, und die meisten anderen gängigen APIs sind an anderer Stelle in der Standardbibliothek verfügbar (wie platform, shutil, subprocess oder sysconfig). Es gibt keine Pläne, andere Funktionalitäten aus distutils zu migrieren, und Anwendungen, die andere Funktionen verwenden, sollten private Kopien des Codes planen. Weitere Diskussionen finden Sie in PEP 632.

Der Befehl bdist_wininst, der in Python 3.8 veraltet war, wurde entfernt. Der Befehl bdist_wheel wird nun für die Verteilung von Binärpaketen unter Windows empfohlen. (Beigetragen von Victor Stinner in bpo-42802.)

doctest

Wenn ein Modul __loader__ nicht definiert, wird auf __spec__.loader zurückgegriffen. (Beigetragen von Brett Cannon in bpo-42133.)

encodings

encodings.normalize_encoding() ignoriert jetzt Nicht-ASCII-Zeichen. (Beigetragen von Hai Shi in bpo-39337.)

enum

Enum __repr__() gibt jetzt enum_name.member_name zurück und __str__() gibt jetzt member_name zurück. Stdlib-Enums, die als Modulkonstanten verfügbar sind, haben einen repr() von module_name.member_name. (Beigetragen von Ethan Furman in bpo-40066.)

enum.StrEnum hinzugefügt für Enums, bei denen alle Mitglieder Strings sind. (Beigetragen von Ethan Furman in bpo-41816.)

fileinput

Parameter encoding und errors in fileinput.input() und fileinput.FileInput hinzugefügt. (Beigetragen von Inada Naoki in bpo-43712.)

fileinput.hook_compressed() gibt jetzt ein Objekt vom Typ TextIOWrapper zurück, wenn mode "r" ist und die Datei komprimiert ist, wie bei unkomprimierten Dateien. (Beigetragen von Inada Naoki in bpo-5758.)

faulthandler

Das Modul faulthandler erkennt jetzt, ob während einer Garbage-Collector-Sammlung ein schwerwiegender Fehler auftritt. (Beigetragen von Victor Stinner in bpo-44466.)

gc

Audit-Hooks für gc.get_objects(), gc.get_referrers() und gc.get_referents() hinzugefügt. (Beigetragen von Pablo Galindo in bpo-43439.)

glob

Parameter root_dir und dir_fd in glob() und iglob() hinzugefügt, die das Angeben des Stammverzeichnisses für die Suche ermöglichen. (Beigetragen von Serhiy Storchaka in bpo-38144.)

hashlib

Das hashlib-Modul erfordert OpenSSL 1.1.1 oder neuer. (Beigetragen von Christian Heimes in PEP 644 und bpo-43669.)

Das hashlib-Modul hat eine vorläufige Unterstützung für OpenSSL 3.0.0. (Beigetragen von Christian Heimes in bpo-38820 und anderen Problemen.)

Der reine Python-Fallback von pbkdf2_hmac() ist veraltet. Zukünftig wird PBKDF2-HMAC nur verfügbar sein, wenn Python mit OpenSSL-Unterstützung kompiliert wurde. (Beigetragen von Christian Heimes in bpo-43880.)

hmac

Das hmac-Modul verwendet intern jetzt die HMAC-Implementierung von OpenSSL. (Beigetragen von Christian Heimes in bpo-40645.)

IDLE und idlelib

IDLE ruft jetzt sys.excepthook() auf (wenn ohne '-n' gestartet). Benutzerspezifische Hooks wurden zuvor ignoriert. (Beigetragen von Ken Hilton in bpo-43008.)

Das Einstellungsdialogfeld wurde neu angeordnet. Der Tab "General" wurde in die Tabs "Windows" und "Shell/Ed" aufgeteilt. Hilfsquellen, die das Hilfemenü erweitern, wurden in den Tab "Extensions" verschoben. Es wurde Platz für neue Optionen geschaffen und der Dialog verkürzt. Letzteres lässt den Dialog besser auf kleine Bildschirme passen. (Beigetragen von Terry Jan Reedy in bpo-40468.) Die Einstellung für den Einzug mit Leerzeichen wurde vom Tab "Font" in den neuen Tab "Windows" verschoben. (Beigetragen von Mark Roseman und Terry Jan Reedy in bpo-33962.)

Die oben genannten Änderungen wurden in eine 3.9 Wartungsversion zurückportiert.

Eine Shell-Seitenleiste hinzugefügt. Der primäre Prompt ('>>>') wurde in die Seitenleiste verschoben. Sekundäre Prompts ('…') wurden in die Seitenleiste verschoben. Linksklick und optionales Ziehen wählt eine oder mehrere Textzeilen aus, wie bei der Zeilennummern-Seitenleiste des Editors. Ein Rechtsklick nach der Auswahl von Textzeilen zeigt ein Kontextmenü mit "copy with prompts". Dies kombiniert Prompts aus der Seitenleiste mit Zeilen aus dem ausgewählten Text. Diese Option erscheint auch im Kontextmenü des Textes. (Beigetragen von Tal Einat in bpo-37903.)

Leerzeichen anstelle von Tabs zum Einrücken von interaktivem Code verwendet. Dies lässt Einträge für interaktiven Code "richtig aussehen". Dies zu ermöglichen war eine Hauptmotivation für die Hinzufügung der Shell-Seitenleiste. (Beigetragen von Terry Jan Reedy in bpo-37892.)

Hervorhebung der neuen weichen Schlüsselwörter match, case und _ in Mustervergleichsanweisungen. Diese Hervorhebung ist jedoch nicht perfekt und wird in einigen seltenen Fällen, einschließlich einiger _-s in case-Mustern, falsch sein. (Beigetragen von Tal Einat in bpo-44010.)

Neu in 3.10 Wartungsversionen.

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

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

importlib.metadata

Funktionalitätsparität mit importlib_metadata 4.6 (Historie).

importlib.metadata Entry Points bieten jetzt eine bessere Erfahrung für die Auswahl von Entry Points nach Gruppe und Namen durch eine neue Klasse importlib.metadata.EntryPoints. Weitere Informationen zur Veralterung und Nutzung finden Sie im Kompatibilitätshinweis in der Dokumentation.

Hinzugefügt wurde importlib.metadata.packages_distributions() zum Auflösen von Python-Top-Level-Modulen und Paketen zu ihrer importlib.metadata.Distribution.

inspect

Wenn ein Modul __loader__ nicht definiert, wird auf __spec__.loader zurückgegriffen. (Beigetragen von Brett Cannon in bpo-42133.)

Hinzugefügt wurde inspect.get_annotations(), das sicher die auf einem Objekt definierten Annotationen berechnet. Es umgeht die Eigenheiten des Zugriffs auf die Annotationen verschiedener Objekttypen und stellt nur wenige Annahmen über das untersuchte Objekt auf. inspect.get_annotations() kann auch stringifizierte Annotationen korrekt wieder in Strings umwandeln. inspect.get_annotations() wird jetzt als Best Practice für den Zugriff auf das Annotationen-Dictionary angesehen, das auf jedem Python-Objekt definiert ist; weitere Informationen zu Best Practices für die Arbeit mit Annotationen finden Sie unter Best Practices für Annotationen. In diesem Zusammenhang rufen inspect.signature(), inspect.Signature.from_callable() und inspect.Signature.from_function() nun inspect.get_annotations() auf, um Annotationen abzurufen. Das bedeutet, dass inspect.signature() und inspect.Signature.from_callable() nun auch stringifizierte Annotationen wieder in Strings umwandeln können. (Beigetragen von Larry Hastings in bpo-43817.)

itertools

Hinzugefügt wurde itertools.pairwise(). (Beigetragen von Raymond Hettinger in bpo-38200.)

linecache

Wenn ein Modul __loader__ nicht definiert, wird auf __spec__.loader zurückgegriffen. (Beigetragen von Brett Cannon in bpo-42133.)

os

Unterstützung für os.cpu_count() für VxWorks RTOS hinzugefügt. (Beigetragen von Peixing Xin in bpo-41440.)

Eine neue Funktion os.eventfd() und zugehörige Helfer hinzugefügt, um den eventfd2 Systemaufruf unter Linux zu umschließen. (Beigetragen von Christian Heimes in bpo-41001.)

Hinzugefügt wurde os.splice(), das es ermöglicht, Daten zwischen zwei Dateideskriptoren zu verschieben, ohne zwischen dem Kernel-Adressraum und dem Benutzer-Adressraum zu kopieren, wobei einer der Dateideskriptoren auf eine Pipe verweisen muss. (Beigetragen von Pablo Galindo in bpo-41625.)

Konstanten O_EVTONLY, O_FSYNC, O_SYMLINK und O_NOFOLLOW_ANY für macOS hinzugefügt. (Beigetragen von Donghee Na in bpo-43106.)

os.path

os.path.realpath() akzeptiert nun ein strict Keyword-only Argument. Wenn es auf True gesetzt ist, wird OSError ausgelöst, wenn ein Pfad nicht existiert oder eine Symlink-Schleife aufgetreten ist. (Beigetragen von Barney Gale in bpo-43757.)

pathlib

Unterstützung für Slices zu PurePath.parents hinzugefügt. (Beigetragen von Joshua Cannon in bpo-35498.)

Unterstützung für negative Indizierung zu PurePath.parents hinzugefügt. (Beigetragen von Yaroslav Pankovych in bpo-21041.)

Methode Path.hardlink_to() hinzugefügt, die link_to() ersetzt. Die neue Methode hat dieselbe Argumentreihenfolge wie symlink_to(). (Beigetragen von Barney Gale in bpo-39950.)

pathlib.Path.stat() und chmod() akzeptieren nun ein follow_symlinks Keyword-only Argument zur Konsistenz mit den entsprechenden Funktionen im Modul os. (Beigetragen von Barney Gale in bpo-39906.)

platform

Hinzugefügt wurde platform.freedesktop_os_release(), um die Betriebssystemidentifikation aus der freedesktop.org os-release Standarddatei abzurufen. (Beigetragen von Christian Heimes in bpo-28468.)

pprint

pprint.pprint() akzeptiert nun ein neues Keyword-Argument underscore_numbers. (Beigetragen von sblondon in bpo-42914.)

pprint kann nun Instanzen von dataclasses.dataclass hübsch drucken. (Beigetragen von Lewis Gaul in bpo-43080.)

py_compile

Option --quiet zur Kommandozeilenschnittstelle von py_compile hinzugefügt. (Beigetragen von Gregory Schevchenko in bpo-38731.)

pyclbr

Attribut end_lineno zu den Objekten Function und Class im Baum hinzugefügt, der von pyclbr.readmodule() und pyclbr.readmodule_ex() zurückgegeben wird. Es entspricht der vorhandenen (Start-) lineno. (Beigetragen von Aviral Srivastava in bpo-38307.)

shelve

Das Modul shelve verwendet nun standardmäßig pickle.DEFAULT_PROTOCOL anstelle des pickle-Protokolls 3 beim Erstellen von Shelves. (Beigetragen von Zackery Spytz in bpo-34204.)

statistics

Hinzugefügt wurden die Funktionen covariance(), Pearson's correlation() und einfache linear_regression(). (Beigetragen von Tymoteusz Wołodźko in bpo-38490.)

site

Wenn ein Modul __loader__ nicht definiert, wird auf __spec__.loader zurückgegriffen. (Beigetragen von Brett Cannon in bpo-42133.)

socket

Die Ausnahme socket.timeout ist nun ein Alias von TimeoutError. (Beigetragen von Christian Heimes in bpo-42413.)

Option zum Erstellen von MPTCP-Sockets mit IPPROTO_MPTCP hinzugefügt. (Beigetragen von Rui Cunha in bpo-43571.)

Option IP_RECVTOS hinzugefügt, um die Type-of-Service (ToS) oder DSCP/ECN-Felder zu empfangen. (Beigetragen von Georg Sauthoff in bpo-44077.)

ssl

Das ssl-Modul erfordert OpenSSL 1.1.1 oder neuer. (Beigetragen von Christian Heimes in PEP 644 und bpo-43669.)

Das ssl-Modul hat vorläufige Unterstützung für OpenSSL 3.0.0 und die neue Option OP_IGNORE_UNEXPECTED_EOF. (Beigetragen von Christian Heimes in bpo-38820, bpo-43794, bpo-43788, bpo-43791, bpo-43799, bpo-43920, bpo-43789, und bpo-43811.)

Veraltete Funktionen und die Verwendung von veralteten Konstanten führen nun zu einer DeprecationWarning. ssl.SSLContext.options hat standardmäßig OP_NO_SSLv2 und OP_NO_SSLv3 gesetzt und kann daher nicht erneut vor dem Setzen des Flags warnen. Der Abschnitt Veraltungen enthält eine Liste veralteter Funktionen. (Beigetragen von Christian Heimes in bpo-43880.)

Das ssl-Modul hat nun sicherere Standardeinstellungen. Verschlüsselungen ohne Forward Secrecy oder 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 minimale Protokollversion TLS 1.2. Die Einstellungen basieren auf der Forschung von Hynek Schlawack. (Beigetragen von Christian Heimes in bpo-43998.)

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, Distributionseinstellungen, Hersteller-Patches und Cipher-Suiten einen erfolgreichen Handshake verhindern.

Timeout-Parameter für die Funktion ssl.get_server_certificate() hinzugefügt. (Beigetragen von Zackery Spytz in bpo-31870.)

Das ssl-Modul verwendet Heap-Typen und Multi-Phase-Initialisierung. (Beigetragen von Christian Heimes in bpo-42333.)

Eine neue Verifizierungsflagge VERIFY_X509_PARTIAL_CHAIN wurde hinzugefügt. (Beigetragen von l0x in bpo-40849.)

sqlite3

Audit-Ereignisse für connect(), enable_load_extension() und load_extension() hinzugefügt. (Beigetragen von Erlend E. Aasland in bpo-43762.)

sys

Attribut sys.orig_argv hinzugefügt: die Liste der ursprünglichen Kommandozeilenargumente, die an die Python-Ausführungsdatei übergeben wurden. (Beigetragen von Victor Stinner in bpo-23427.)

sys.stdlib_module_names hinzugefügt, das die Liste der Standardbibliotheksmodulnamen enthält. (Beigetragen von Victor Stinner in bpo-42955.)

_thread

_thread.interrupt_main() nimmt nun eine optionale Signalnummer zur Simulation entgegen (der Standard ist immer noch signal.SIGINT). (Beigetragen von Antoine Pitrou in bpo-43356.)

threading

Hinzugefügt wurden threading.gettrace() und threading.getprofile(), um die von threading.settrace() bzw. threading.setprofile() gesetzten Funktionen abzurufen. (Beigetragen von Mario Corchero in bpo-42251.)

Hinzugefügt wurde threading.__excepthook__, um den ursprünglichen Wert von threading.excepthook() abrufen zu können, falls er auf einen fehlerhaften oder einen anderen Wert gesetzt ist. (Beigetragen von Mario Corchero in bpo-42308.)

traceback

Die Funktionen format_exception(), format_exception_only() und print_exception() können nun ein Ausnahmeobjekt als positionsgebundenes Argument (positional-only) entgegennehmen. (Beigetragen von Zackery Spytz und Matthias Bussonnier in bpo-26389.)

types

Die Klassen types.EllipsisType, types.NoneType und types.NotImplementedType wieder eingeführt, die einen neuen Satz von Typen bereitstellen, die von Typ-Checkern leicht interpretiert werden können. (Beigetragen von Bas van Beek in bpo-41810.)

typing

Für wichtige Änderungen siehe Neue Funktionen im Zusammenhang mit Typ-Hinweisen.

Das Verhalten von typing.Literal wurde geändert, um PEP 586 zu entsprechen und das Verhalten von statischen Typ-Checkern, wie in der PEP spezifiziert, abzugleichen.

  1. Literal dedupliziert jetzt Parameter.

  2. Gleichheitsvergleiche zwischen Literal-Objekten sind nun unabhängig von der Reihenfolge.

  3. Vergleiche von Literal berücksichtigen nun Typen. Zum Beispiel wurde Literal[0] == Literal[False] zuvor als True ausgewertet. Nun ist es False. Um diese Änderung zu unterstützen, unterstützt der intern verwendete Typ-Cache nun die Unterscheidung von Typen.

  4. Literal-Objekte lösen nun eine TypeError-Ausnahme während Gleichheitsvergleichen aus, wenn einer ihrer Parameter nicht hashbar ist. Beachten Sie, dass die Deklaration von Literal mit nicht hashbaren Parametern keinen Fehler auslöst.

    >>> from typing import Literal
    >>> Literal[{0}]
    >>> Literal[{0}] == Literal[{False}]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'set'
    

(Beigetragen von Yurii Karabas in bpo-42345.)

Neue Funktion typing.is_typeddict() hinzugefügt, um zu prüfen, ob eine Annotation ein typing.TypedDict ist. (Beigetragen von Patrick Reader in bpo-41792.)

Unterklassen von typing.Protocol, die nur Datenvariablen deklariert haben, lösen nun eine TypeError aus, wenn sie mit isinstance geprüft werden, es sei denn, sie sind mit runtime_checkable() dekoriert. Zuvor waren diese Prüfungen stillschweigend erfolgreich. Benutzer sollten ihre Unterklassen mit dem Dekorator runtime_checkable() dekorieren, wenn sie Laufzeitprotokolle wünschen. (Beigetragen von Yurii Karabas in bpo-38908.)

Das Importieren aus den Untermodulen typing.io und typing.re löst nun eine DeprecationWarning aus. Diese Untermodule sind seit Python 3.8 veraltet und werden in einer zukünftigen Python-Version entfernt. Alles, was zu diesen Untermodulen gehört, sollte stattdessen direkt aus typing importiert werden. (Beigetragen von Sebastian Rittau in bpo-38291.)

unittest

Neue Methode assertNoLogs() hinzugefügt, um die vorhandene Methode assertLogs() zu ergänzen. (Beigetragen von Kit Yan Choi in bpo-39385.)

urllib.parse

Python-Versionen vor Python 3.10 erlaubten die Verwendung von sowohl ; als auch & als Trennzeichen für Query-Parameter in urllib.parse.parse_qs() und urllib.parse.parse_qsl(). Aus Sicherheitsgründen und zur Einhaltung neuerer W3C-Empfehlungen wurde dies dahingehend geändert, dass nur ein einziges Trennzeichen zulässig ist, wobei & der Standard ist. Diese Änderung betrifft auch cgi.parse() und cgi.parse_multipart(), da diese intern die betroffenen Funktionen verwenden. Weitere Details finden Sie in der jeweiligen Dokumentation. (Beigetragen von Adam Goldschmidt, Senthil Kumaran und Ken Jin in bpo-42967.)

Das Vorhandensein von Zeilenumbruch- oder Tabulatorzeichen in Teilen einer URL kann zu bestimmten Angriffsarten führen. Gemäß der WHATWG-Spezifikation, die RFC 3986 aktualisiert, werden ASCII-Zeilenumbruchszeichen \n, \r und Tabulatorzeichen \t vom Parser in urllib.parse aus der URL entfernt, um solche Angriffe zu verhindern. Die zu entfernenden Zeichen werden durch die neue Modulvariable urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE gesteuert. (Siehe gh-88048)

xml

Klasse LexicalHandler zum Modul xml.sax.handler hinzugefügt. (Beigetragen von Jonathan Gossage und Zackery Spytz in bpo-35018.)

zipimport

Methoden im Zusammenhang mit PEP 451 hinzugefügt: find_spec(), zipimport.zipimporter.create_module() und zipimport.zipimporter.exec_module(). (Beigetragen von Brett Cannon in bpo-42131.)

Methode invalidate_caches() hinzugefügt. (Beigetragen von Desmond Cheong in bpo-14678.)

Optimierungen

  • Konstruktoren str(), bytes() und bytearray() sind nun schneller (etwa 30–40 % für kleine Objekte). (Beigetragen von Serhiy Storchaka in bpo-41334.)

  • Das Modul runpy importiert nun weniger Module. Die Startzeit des Befehls python3 -m modulname ist im Durchschnitt 1,4-mal schneller. Unter Linux importiert python3 -I -m modulname 69 Module in Python 3.9, während es in Python 3.10 nur 51 Module (-18) importiert. (Beigetragen von Victor Stinner in bpo-41006 und bpo-41718.)

  • Die Anweisung LOAD_ATTR verwendet nun einen neuen Mechanismus für "Pro-Opcode-Cache". Sie ist nun etwa 36 % schneller für reguläre Attribute und 44 % schneller für Slots. (Beigetragen von Pablo Galindo und Yury Selivanov in bpo-42093 und Guido van Rossum in bpo-42927, basierend auf Ideen, die ursprünglich in PyPy und MicroPython implementiert wurden.)

  • Beim Erstellen von Python mit --enable-optimizations wird nun -fno-semantic-interposition sowohl zur Compile- als auch zur Link-Zeile hinzugefügt. Dies beschleunigt Builds des Python-Interpreters, die mit --enable-shared erstellt wurden, mit gcc um bis zu 30 %. Weitere Details finden Sie in diesem Artikel. (Beigetragen von Victor Stinner und Pablo Galindo in bpo-38980.)

  • Verwenden Sie einen neuen Pufferverwaltungs-Code für die Module bz2 / lzma / zlib und fügen Sie die Funktion .readall() zur Klasse _compression.DecompressReader hinzu. Die bz2-Dekompression ist nun 1,09x ~ 1,17x schneller, die lzma-Dekompression 1,20x ~ 1,32x schneller, GzipFile.read(-1) 1,11x ~ 1,18x schneller. (Beigetragen von Ma Lin, geprüft von Gregory P. Smith, in bpo-41486)

  • Bei Verwendung von stringisierten Annotationen werden Annotationswörterbücher für Funktionen nicht mehr bei der Erstellung der Funktion erstellt. Stattdessen werden sie als Tupel von Zeichenketten gespeichert, und das Funktionsobjekt wandelt dies bei Bedarf lazy in das Annotationswörterbuch um. Diese Optimierung halbiert die CPU-Zeit, die für die Definition einer annotierten Funktion benötigt wird. (Beigetragen von Yurii Karabas und Inada Naoki in bpo-42202.)

  • Zeichenketten-Suchfunktionen wie str1 in str2 und str2.find(str1) verwenden nun manchmal den "Two-Way"-Algorithmus von Crochemore & Perrin, um quadratisches Verhalten bei langen Zeichenketten zu vermeiden. (Beigetragen von Dennis Sweeney in bpo-41972)

  • Fügt Mikro-Optimierungen zu _PyType_Lookup() hinzu, um die Leistung des Lookups von Typattributen im üblichen Fall von Cache-Treffern zu verbessern. Dies macht den Interpreter im Durchschnitt 1,04-mal schneller. (Beigetragen von Dino Viehland in bpo-43452.)

  • Die folgenden eingebauten Funktionen unterstützen nun die schnellere PEP 590 Vektoranruf-Aufrufkonvention: map(), filter(), reversed(), bool() und float(). (Beigetragen von Donghee Na und Jeroen Demeyer in bpo-43575, bpo-43287, bpo-41922, bpo-41873 und bpo-41870.)

  • Die Leistung von BZ2File wird durch die Entfernung des internen RLock verbessert. Dies macht BZ2File im Hinblick auf mehrere gleichzeitige Leser oder Schreiber nicht threadsicher, genau wie seine äquivalenten Klassen in gzip und lzma schon immer waren. (Beigetragen von Inada Naoki in bpo-43785.)

Veraltet

  • Derzeit akzeptiert Python numerische Literale, denen unmittelbar Schlüsselwörter folgen, z. B. 0in x, 1or x, 0if 1else 2. Es erlaubt verwirrende und mehrdeutige Ausdrücke wie [0x1for x in y] (was interpretiert werden kann als [0x1 for x in y] oder [0x1f or x in y]). Ab dieser Version wird eine Deprecation-Warnung ausgegeben, wenn das numerische Literal unmittelbar von einem der Schlüsselwörter and, else, for, if, in, is und or gefolgt wird. In zukünftigen Versionen wird dies zu einer Syntaxwarnung und schließlich zu einem Syntaxfehler geändert. (Beigetragen von Serhiy Storchaka in bpo-43833.)

  • Ab dieser Version wird eine konzertierte Anstrengung unternommen, alte Importsemantiken aufzuräumen, die zur Kompatibilität mit Python 2.7 beibehalten wurden. Insbesondere werden find_loader()/find_module() (ersetzt durch find_spec()), load_module() (ersetzt durch exec_module()), module_repr() (um das sich das Importsystem für Sie kümmert), das Attribut __package__ (ersetzt durch __spec__.parent), das Attribut __loader__ (ersetzt durch __spec__.loader) und das Attribut __cached__ (ersetzt durch __spec__.cached) langsam entfernt (sowie andere Klassen und Methoden in importlib). ImportWarning und/oder DeprecationWarning werden entsprechend ausgegeben, um Code zu identifizieren, der während dieses Übergangs aktualisiert werden muss.

  • Der gesamte Namespace distutils ist veraltet und wird in Python 3.12 entfernt. Weitere Informationen finden Sie im Abschnitt Moduländerungen.

  • Nicht-Ganzzahl-Argumente für random.randrange() sind veraltet. Die ValueError ist zugunsten einer TypeError veraltet. (Beigetragen von Serhiy Storchaka und Raymond Hettinger in bpo-37319.)

  • Die verschiedenen load_module()-Methoden von importlib wurden seit Python 3.6 als veraltet dokumentiert, lösen aber nun auch eine DeprecationWarning aus. Verwenden Sie stattdessen exec_module(). (Beigetragen von Brett Cannon in bpo-26131.)

  • zimport.zipimporter.load_module() ist zugunsten von exec_module() veraltet. (Beigetragen von Brett Cannon in bpo-26131.)

  • Die Verwendung von load_module() durch das Importsystem löst nun eine ImportWarning aus, da exec_module() bevorzugt wird. (Beigetragen von Brett Cannon in bpo-26131.)

  • Die Verwendung von importlib.abc.MetaPathFinder.find_module() und importlib.abc.PathEntryFinder.find_module() durch das Importsystem löst nun eine ImportWarning aus, da importlib.abc.MetaPathFinder.find_spec() und importlib.abc.PathEntryFinder.find_spec() entsprechend bevorzugt werden. Sie können importlib.util.spec_from_loader() zur Unterstützung bei der Portierung verwenden. (Beigetragen von Brett Cannon in bpo-42134.)

  • Die Verwendung von importlib.abc.PathEntryFinder.find_loader() durch das Importsystem löst nun eine ImportWarning aus, da importlib.abc.PathEntryFinder.find_spec() bevorzugt wird. Sie können importlib.util.spec_from_loader() zur Unterstützung bei der Portierung verwenden. (Beigetragen von Brett Cannon in bpo-43672.)

  • Die verschiedenen Implementierungen von importlib.abc.MetaPathFinder.find_module() ( importlib.machinery.BuiltinImporter.find_module(), importlib.machinery.FrozenImporter.find_module(), importlib.machinery.WindowsRegistryFinder.find_module(), importlib.machinery.PathFinder.find_module(), importlib.abc.MetaPathFinder.find_module() ), importlib.abc.PathEntryFinder.find_module() ( importlib.machinery.FileFinder.find_module() ), und importlib.abc.PathEntryFinder.find_loader() ( importlib.machinery.FileFinder.find_loader() ) lösen nun DeprecationWarning aus und sind für die Entfernung in Python 3.12 vorgesehen (zuvor waren sie in Python 3.4 als veraltet dokumentiert). (Beigetragen von Brett Cannon in bpo-42135.)

  • importlib.abc.Finder ist veraltet (einschließlich seiner einzigen Methode find_module()). Sowohl importlib.abc.MetaPathFinder als auch importlib.abc.PathEntryFinder erben nicht mehr von der Klasse. Benutzer sollten stattdessen von einer dieser beiden Klassen erben, je nach Anwendungsfall. (Beigetragen von Brett Cannon in bpo-42135.)

  • Die Veralterung von imp, importlib.find_loader(), importlib.util.set_package_wrapper(), importlib.util.set_loader_wrapper(), importlib.util.module_for_loader(), pkgutil.ImpImporter und pkgutil.ImpLoader wurde alle aktualisiert, um Python 3.12 als das geplante Entfernungsdatum aufzulisten (sie lösten seit früheren Versionen von Python DeprecationWarning aus). (Beigetragen von Brett Cannon in bpo-43720.)

  • Das Importsystem verwendet nun das Attribut __spec__ von Modulen, bevor es auf module_repr() für die __repr__()-Methode eines Moduls zurückgreift. Die Entfernung der Verwendung von module_repr() ist für Python 3.12 geplant. (Beigetragen von Brett Cannon in bpo-42137.)

  • importlib.abc.Loader.module_repr(), importlib.machinery.FrozenLoader.module_repr() und importlib.machinery.BuiltinLoader.module_repr() sind veraltet und für die Entfernung in Python 3.12 vorgesehen. (Beigetragen von Brett Cannon in bpo-42136.)

  • sqlite3.OptimizedUnicode ist seit Python 3.3 undokumentiert und veraltet, als es zu einem Alias für str gemacht wurde. Es ist nun veraltet und für die Entfernung in Python 3.12 geplant. (Beigetragen von Erlend E. Aasland in bpo-42264.)

  • Die undokumentierte eingebaute Funktion sqlite3.enable_shared_cache ist nun veraltet und für die Entfernung in Python 3.12 geplant. Ihre Verwendung wird von der SQLite3-Dokumentation dringend abgeraten. Weitere Details finden Sie in der SQLite3-Dokumentation. Wenn ein freigegebener Cache verwendet werden muss, öffnen Sie die Datenbank im URI-Modus mit dem Abfrageparameter cache=shared. (Beigetragen von Erlend E. Aasland in bpo-24464.)

  • Die folgenden threading-Methoden sind nun veraltet

    (Beigetragen von Jelle Zijlstra in gh-87889.)

  • pathlib.Path.link_to() ist veraltet und für die Entfernung in Python 3.12 vorgesehen. Verwenden Sie stattdessen pathlib.Path.hardlink_to(). (Beigetragen von Barney Gale in bpo-39950.)

  • cgi.log() ist veraltet und für die Entfernung in Python 3.12 vorgesehen. (Beigetragen von Inada Naoki in bpo-41139.)

  • Die folgenden ssl-Funktionen sind seit Python 3.6, 3.7 oder OpenSSL 1.1.0 veraltet und werden in 3.11 entfernt.

  • Das Threading-Debugging (Umgebungsvariable PYTHONTHREADDEBUG) ist in Python 3.10 veraltet und wird in Python 3.12 entfernt. Diese Funktion erfordert eine Debug-Build von Python. (Beigetragen von Victor Stinner in bpo-44584.)

  • Der Import aus den Untermodulen typing.io und typing.re gibt nun eine DeprecationWarning aus. Diese Untermodule werden in einer zukünftigen Version von Python entfernt. Alles, was zu diesen Untermodulen gehört, sollte stattdessen direkt aus typing importiert werden. (Beigetragen von Sebastian Rittau in bpo-38291.)

Entfernt

  • Entfernte spezielle Methoden __int__, __float__, __floordiv__, __mod__, __divmod__, __rfloordiv__, __rmod__ und __rdivmod__ der Klasse complex. Sie lösten immer eine TypeError aus. (Beigetragen von Serhiy Storchaka in bpo-41974.)

  • Die Methode ParserBase.error() aus dem privaten und undokumentierten Modul _markupbase wurde entfernt. html.parser.HTMLParser ist die einzige Unterklasse von ParserBase und ihre error()-Implementierung wurde bereits in Python 3.5 entfernt. (Beigetragen von Berker Peksag in bpo-31844.)

  • Das Attribut unicodedata.ucnhash_CAPI, ein internes PyCapsule-Objekt, wurde entfernt. Die zugehörige private Struktur _PyUnicode_Name_CAPI wurde in die interne C-API verschoben. (Beigetragen von Victor Stinner in bpo-42157.)

  • Das Modul parser, das in 3.9 aufgrund des Wechsels zum neuen PEG-Parser veraltet war, sowie alle C-Quell- und Header-Dateien, die nur vom alten Parser verwendet wurden, einschließlich node.h, parser.h, graminit.h und grammar.h, wurden entfernt.

  • Entfernte öffentliche C-API-Funktionen PyParser_SimpleParseStringFlags, PyParser_SimpleParseStringFlagsFilename, PyParser_SimpleParseFileFlags und PyNode_Compile, die in 3.9 aufgrund des Wechsels zum neuen PEG-Parser veraltet waren.

  • Das Modul formatter, das in Python 3.4 veraltet war, wurde entfernt. Es ist etwas veraltet, wenig genutzt und nicht getestet. Ursprünglich sollte es in Python 3.6 entfernt werden, aber solche Entfernungen wurden bis nach dem EOL von Python 2.7 verschoben. Bestehende Benutzer sollten die von ihnen verwendeten Klassen in ihren Code kopieren. (Beigetragen von Donghee Na und Terry J. Reedy in bpo-42299.)

  • Entfernte die veraltete Funktion PyModule_GetWarningsModule(), die nun nutzlos war, da das Modul _warnings bereits in 2.6 in ein eingebautes Modul umgewandelt wurde. (Beigetragen von Hai Shi in bpo-42599.)

  • Entfernte veraltete Aliase für Abstrakte Basisklassen für Collections aus dem Modul collections. (Beigetragen von Victor Stinner in bpo-37324.)

  • Der Parameter loop wurde aus den meisten asyncios High-Level-APIs entfernt, nachdem er in Python 3.8 veraltet war. Die Motivation hinter dieser Änderung ist vielfältig

    1. Dies vereinfacht die High-Level-API.

    2. Die Funktionen in der High-Level-API holten seit Python 3.7 implizit die aktuelle Event-Loop des Threads. Es ist nicht mehr notwendig, die Event-Loop in den meisten normalen Anwendungsfällen an die API zu übergeben.

    3. Die Übergabe der Event-Loop ist fehleranfällig, insbesondere bei Schleifen, die in verschiedenen Threads laufen.

    Beachten Sie, dass die Low-Level-API weiterhin loop akzeptiert. Beispiele zur Ersetzung vorhandenen Codes finden Sie im Abschnitt Änderungen in der Python-API.

    (Beigetragen von Yurii Karabas, Andrew Svetlov, Yury Selivanov und Kyle Stanley in bpo-42392.)

Portierung auf Python 3.10

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

Änderungen in der Python-Syntax

  • Es wird nun eine Deprecation-Warnung ausgegeben, wenn zuvor gültige Syntax kompiliert wird und das numerische Literal unmittelbar von einem Schlüsselwort gefolgt wird (wie in 0in x). In zukünftigen Versionen wird dies zu einer Syntaxwarnung und schließlich zu einem Syntaxfehler geändert. Um die Warnung zu beseitigen und den Code mit zukünftigen Versionen kompatibel zu machen, fügen Sie einfach ein Leerzeichen zwischen dem numerischen Literal und dem folgenden Schlüsselwort ein. (Beigetragen von Serhiy Storchaka in bpo-43833.)

Änderungen in der Python-API

  • Die Parameter etype der Funktionen format_exception(), format_exception_only() und print_exception() im Modul traceback wurden in exc umbenannt. (Beigetragen von Zackery Spytz und Matthias Bussonnier in bpo-26389.)

  • atexit: Beim Beenden von Python wird jetzt jede Ausnahme, die bei einer mit atexit.register() registrierten Callback-Funktion auftritt, protokolliert. Zuvor wurden nur einige Ausnahmen protokolliert, und die letzte Ausnahme wurde immer stillschweigend ignoriert. (Beigetragen von Victor Stinner in bpo-42639.)

  • collections.abc.Callable Generic flacht jetzt Typ-Parameter ab, ähnlich wie typing.Callable dies derzeit tut. Das bedeutet, dass collections.abc.Callable[[int, str], str] die __args__ von (int, str, str) hat; zuvor war dies ([int, str], str). Code, der über typing.get_args() oder __args__ auf die Argumente zugreift, muss diese Änderung berücksichtigen. Darüber hinaus kann TypeError für ungültige Formen der Parametrisierung von collections.abc.Callable ausgelöst werden, die in Python 3.9 möglicherweise stillschweigend durchgegangen sind. (Beigetragen von Ken Jin in bpo-42195.)

  • socket.htons() und socket.ntohs() lösen jetzt OverflowError anstelle von DeprecationWarning aus, wenn der angegebene Parameter nicht in einen 16-Bit vorzeichenlosen Integer passt. (Beigetragen von Erlend E. Aasland in bpo-42393.)

  • Der Parameter loop wurde aus den meisten asyncio High-Level APIs entfernt, nachdem er in Python 3.8 als veraltet markiert wurde.

    Eine Coroutine, die derzeit so aussieht

    async def foo(loop):
        await asyncio.sleep(1, loop=loop)
    

    Sollte ersetzt werden durch diese

    async def foo():
        await asyncio.sleep(1)
    

    Wenn foo() speziell dafür entwickelt wurde, *nicht* in der laufenden Event-Schleife des aktuellen Threads ausgeführt zu werden (z. B. in der Event-Schleife eines anderen Threads), sollten Sie stattdessen asyncio.run_coroutine_threadsafe() verwenden.

    (Beigetragen von Yurii Karabas, Andrew Svetlov, Yury Selivanov und Kyle Stanley in bpo-42392.)

  • Der Konstruktor von types.FunctionType erbt nun die aktuellen Builtins, wenn das globals-Dictionary keinen Schlüssel "__builtins__" enthält, anstatt {"None": None} als Builtins zu verwenden: dasselbe Verhalten wie bei den Funktionen eval() und exec(). Das Definieren einer Funktion mit def function(...): ... in Python wird nicht beeinträchtigt, da Builtins mit dieser Syntax nicht überschrieben werden können: Sie erbt ebenfalls die aktuellen Builtins. (Beigetragen von Victor Stinner in bpo-42990.)

Änderungen in der C-API

  • Die C-API-Funktionen PyParser_SimpleParseStringFlags, PyParser_SimpleParseStringFlagsFilename, PyParser_SimpleParseFileFlags, PyNode_Compile und der von diesen Funktionen verwendete Typ struct _node wurden aufgrund des Umstiegs auf den neuen PEG-Parser entfernt.

    Quelle sollte jetzt direkt in ein Code-Objekt kompiliert werden, zum Beispiel mit Py_CompileString(). Das resultierende Code-Objekt kann dann ausgewertet werden, zum Beispiel mit PyEval_EvalCode().

    Insbesondere

    • Ein Aufruf von PyParser_SimpleParseStringFlags gefolgt von PyNode_Compile kann durch den Aufruf von Py_CompileString() ersetzt werden.

    • Es gibt keine direkte Ersetzung für PyParser_SimpleParseFileFlags. Um Code aus einem FILE * Argument zu kompilieren, müssen Sie die Datei in C lesen und den resultierenden Puffer an Py_CompileString() übergeben.

    • Um eine Datei anhand eines char * Dateinamens zu kompilieren, öffnen Sie explizit die Datei, lesen Sie sie und kompilieren Sie das Ergebnis. Eine Möglichkeit, dies zu tun, ist die Verwendung des io-Moduls mit PyImport_ImportModule(), PyObject_CallMethod(), PyBytes_AsString() und Py_CompileString(), wie unten skizziert. (Deklarationen und Fehlerbehandlung sind weggelassen.)

      io_module = Import_ImportModule("io");
      fileobject = PyObject_CallMethod(io_module, "open", "ss", filename, "rb");
      source_bytes_object = PyObject_CallMethod(fileobject, "read", "");
      result = PyObject_CallMethod(fileobject, "close", "");
      source_buf = PyBytes_AsString(source_bytes_object);
      code = Py_CompileString(source_buf, filename, Py_file_input);
      
    • Für FrameObject-Objekte stellt das Mitglied f_lasti nun einen Wortcode-Offset anstelle eines einfachen Offsets in den Bytecode-String dar. Das bedeutet, dass diese Zahl mit 2 multipliziert werden muss, um sie mit APIs zu verwenden, die stattdessen einen Byte-Offset erwarten (wie z. B. PyCode_Addr2Line()). Beachten Sie auch, dass das f_lasti-Mitglied von FrameObject-Objekten nicht stabil ist: verwenden Sie stattdessen PyFrame_GetLineNumber().

CPython Bytecode-Änderungen

  • Die Anweisung MAKE_FUNCTION akzeptiert jetzt entweder ein Wörterbuch oder ein Tupel von Zeichenketten als Annotationen der Funktion. (Beigetragen von Yurii Karabas und Inada Naoki in bpo-42202.)

Build-Änderungen

  • PEP 644: Python erfordert jetzt OpenSSL 1.1.1 oder neuer. OpenSSL 1.0.2 wird nicht mehr unterstützt. (Beigetragen von Christian Heimes in bpo-43669.)

  • Die C99-Funktionen snprintf() und vsnprintf() werden nun zum Erstellen von Python benötigt. (Beigetragen von Victor Stinner in bpo-36020.)

  • sqlite3 erfordert SQLite 3.7.15 oder höher. (Beigetragen von Sergey Fedoseev und Erlend E. Aasland in bpo-40744 und bpo-40810.)

  • Das Modul atexit muss jetzt immer als integriertes Modul erstellt werden. (Beigetragen von Victor Stinner in bpo-42639.)

  • Option --disable-test-modules zum configure-Skript hinzugefügt: Testmodule nicht erstellen oder installieren. (Beigetragen von Xavier de Gaye, Thomas Petazzoni und Peixing Xin in bpo-27640.)

  • Option --with-wheel-pkg-dir=PATH option zum ./configure-Skript hinzugefügt. Wenn angegeben, sucht das Modul ensurepip nach den Wheel-Paketen von setuptools und pip in diesem Verzeichnis: Wenn beide vorhanden sind, werden diese Wheel-Pakete anstelle der gebündelten Wheel-Pakete von ensurepip verwendet.

    Einige Linux-Distributionsverpackungsrichtlinien empfehlen, Abhängigkeiten nicht zu bündeln. Zum Beispiel installiert Fedora Wheel-Pakete im Verzeichnis /usr/share/python-wheels/ und installiert nicht das Paket ensurepip._bundled.

    (Beigetragen von Victor Stinner in bpo-42856.)

  • Neue Option configure --without-static-libpython option hinzugefügt, um die statische Bibliothek libpythonMAJOR.MINOR.a nicht zu erstellen und die Objektdatei python.o nicht zu installieren.

    (Beigetragen von Victor Stinner in bpo-43103.)

  • Das Skript configure verwendet nun das Dienstprogramm pkg-config, falls verfügbar, um den Speicherort von Tcl/Tk-Headern und -Bibliotheken zu erkennen. Wie zuvor können diese Speicherorte explizit mit den Konfigurationsoptionen --with-tcltk-includes und --with-tcltk-libs angegeben werden. (Beigetragen von Manolis Stamatogiannakis in bpo-42603.)

  • Option --with-openssl-rpath zum configure-Skript hinzugefügt. Die Option vereinfacht das Erstellen von Python mit einer benutzerdefinierten OpenSSL-Installation, z. B. ./configure --with-openssl=/path/to/openssl --with-openssl-rpath=auto. (Beigetragen von Christian Heimes in bpo-43466.)

C-API-Änderungen

PEP 652: Aufrechterhaltung der stabilen ABI

Die stabile ABI (Application Binary Interface) für Erweiterungsmodule oder das Einbetten von Python ist nun explizit definiert. C API-Stabilität beschreibt die Garantien für C-API- und ABI-Stabilität sowie Best Practices für die Verwendung der stabilen ABI.

(Beigetragen von Petr Viktorin in PEP 652 und bpo-43795.)

Neue Funktionen

  • Das Ergebnis von PyNumber_Index() hat jetzt immer den exakten Typ int. Zuvor konnte das Ergebnis eine Instanz einer Unterklasse von int sein. (Beigetragen von Serhiy Storchaka in bpo-40792.)

  • Neues Mitglied orig_argv zur Struktur PyConfig hinzugefügt: die Liste der ursprünglichen Kommandozeilenargumente, die an die Python-Executable übergeben wurden. (Beigetragen von Victor Stinner in bpo-23427.)

  • Die Makros PyDateTime_DATE_GET_TZINFO() und PyDateTime_TIME_GET_TZINFO() wurden hinzugefügt, um auf die tzinfo-Attribute von datetime.datetime- und datetime.time-Objekten zuzugreifen. (Beigetragen von Zackery Spytz in bpo-30155.)

  • Neue Funktion PyCodec_Unregister() zum Abmelden einer Codec-Suchfunktion hinzugefügt. (Beigetragen von Hai Shi in bpo-41842.)

  • Die Funktion PyIter_Send() wurde hinzugefügt, um das Senden von Werten in einen Iterator zu ermöglichen, ohne die Ausnahme StopIteration auszulösen. (Beigetragen von Vladimir Matveev in bpo-41756.)

  • Neue Funktion PyUnicode_AsUTF8AndSize() zur begrenzten C-API hinzugefügt. (Beigetragen von Alex Gaynor in bpo-41784.)

  • Neue Funktion PyModule_AddObjectRef() hinzugefügt: ähnlich wie PyModule_AddObject(), aber es wird keine Referenz auf den Wert im Erfolgsfall gestohlen. (Beigetragen von Victor Stinner in bpo-1635741.)

  • Neue Funktionen Py_NewRef() und Py_XNewRef() hinzugefügt, um die Referenzzählung eines Objekts zu erhöhen und das Objekt zurückzugeben. (Beigetragen von Victor Stinner in bpo-42262.)

  • Die Funktionen PyType_FromSpecWithBases() und PyType_FromModuleAndSpec() akzeptieren jetzt eine einzelne Klasse als Argument für bases. (Beigetragen von Serhiy Storchaka in bpo-42423.)

  • Die Funktion PyType_FromModuleAndSpec() akzeptiert nun NULL für den tp_doc Slot. (Beigetragen von Hai Shi in bpo-41832.)

  • Die Funktion PyType_GetSlot() kann statische Typen akzeptieren. (Beigetragen von Hai Shi und Petr Viktorin in bpo-41073.)

  • Neue Funktion PySet_CheckExact() zur C-API hinzugefügt, um zu prüfen, ob ein Objekt eine Instanz von set, aber keine Instanz eines Subtyps ist. (Beigetragen von Pablo Galindo in bpo-43277.)

  • Neue Funktion PyErr_SetInterruptEx() hinzugefügt, die die Übergabe einer Signalnummer zur Simulation ermöglicht. (Beigetragen von Antoine Pitrou in bpo-43356.)

  • Die begrenzte C-API wird nun unterstützt, wenn Python im Debug-Modus kompiliert wird (wenn das Makro Py_DEBUG definiert ist). In der begrenzten C-API werden die Funktionen Py_INCREF() und Py_DECREF() nun als unverpackte Funktionsaufrufe implementiert, anstatt direkt auf das Mitglied PyObject.ob_refcnt zuzugreifen, wenn Python im Debug-Modus kompiliert wird und das Makro Py_LIMITED_API auf Python 3.10 oder neuer abzielt. Die Unterstützung der begrenzten C-API im Debug-Modus wurde möglich, da die Struktur PyObject seit Python 3.8 in Release- und Debug-Modus identisch ist (siehe bpo-36465).

    Die begrenzte C-API wird in der speziellen Build-Konfiguration --with-trace-refs (Py_TRACE_REFS Makro) immer noch nicht unterstützt. (Beigetragen von Victor Stinner in bpo-43688.)

  • Die Funktion Py_Is(x, y) wurde hinzugefügt, um zu testen, ob das Objekt x das Objekt y ist, gleichbedeutend mit x is y in Python. Ebenfalls hinzugefügt wurden die Funktionen Py_IsNone(), Py_IsTrue(), Py_IsFalse(), um zu testen, ob ein Objekt jeweils das None-Singleton, das True-Singleton oder das False-Singleton ist. (Beigetragen von Victor Stinner in bpo-43753.)

  • Neue Funktionen zur Steuerung des Garbage Collectors aus C-Code hinzugefügt: PyGC_Enable(), PyGC_Disable(), PyGC_IsEnabled(). Diese Funktionen ermöglichen es, den Garbage Collector aus C-Code zu aktivieren, zu deaktivieren und seinen Zustand abzufragen, ohne das Modul gc importieren zu müssen.

  • Neues Typ-Flag Py_TPFLAGS_DISALLOW_INSTANTIATION hinzugefügt, um die Erstellung von Typinstanzen zu verhindern. (Beigetragen von Victor Stinner in bpo-43916.)

  • Neues Typ-Flag Py_TPFLAGS_IMMUTABLETYPE hinzugefügt, um unveränderliche Typ-Objekte zu erstellen: Typ-Attribute können nicht gesetzt oder gelöscht werden. (Beigetragen von Victor Stinner und Erlend E. Aasland in bpo-43908.)

Portierung auf Python 3.10

  • Das Makro PY_SSIZE_T_CLEAN muss nun definiert sein, um PyArg_ParseTuple() und Py_BuildValue() Formate zu verwenden, die # verwenden: es#, et#, s#, u#, y#, z#, U# und Z#. Siehe Argumente parsen und Werte erstellen und PEP 353. (Beigetragen von Victor Stinner in bpo-40943.)

  • Da Py_REFCNT() zu einer Inline-Static-Funktion geändert wurde, muss Py_REFCNT(obj) = new_refcnt durch Py_SET_REFCNT(obj, new_refcnt) ersetzt werden: siehe Py_SET_REFCNT() (verfügbar seit Python 3.9). Zur Rückwärtskompatibilität kann dieses Makro verwendet werden

    #if PY_VERSION_HEX < 0x030900A4
    #  define Py_SET_REFCNT(obj, refcnt) ((Py_REFCNT(obj) = (refcnt)), (void)0)
    #endif
    

    (Beigetragen von Victor Stinner in bpo-39573.)

  • Der Aufruf von PyDict_GetItem() ohne gehaltenen GIL war aus historischen Gründen erlaubt. Dies ist nicht mehr zulässig. (Beigetragen von Victor Stinner in bpo-40839.)

  • PyUnicode_FromUnicode(NULL, size) und PyUnicode_FromStringAndSize(NULL, size) lösen nun DeprecationWarning aus. Verwenden Sie PyUnicode_New(), um ein Unicode-Objekt ohne initiale Daten zuzuweisen. (Beigetragen von Inada Naoki in bpo-36346.)

  • Die private Struktur _PyUnicode_Name_CAPI der PyCapsule API unicodedata.ucnhash_CAPI wurde in die interne C-API verschoben. (Beigetragen von Victor Stinner in bpo-42157.)

  • Die Funktionen Py_GetPath(), Py_GetPrefix(), Py_GetExecPrefix(), Py_GetProgramFullPath(), Py_GetPythonHome() und Py_GetProgramName() geben nun NULL zurück, wenn sie vor Py_Initialize() (bevor Python initialisiert wurde) aufgerufen werden. Verwenden Sie die neue Python-Initialisierungskonfiguration-API, um die Python-Pfadkonfiguration zu erhalten. (Beigetragen von Victor Stinner in bpo-42260.)

  • PyList_SET_ITEM(), PyTuple_SET_ITEM() und PyCell_SET() Makros können nicht mehr als l-value oder r-value verwendet werden. Zum Beispiel schlagen x = PyList_SET_ITEM(a, b, c) und PyList_SET_ITEM(a, b, c) = x nun mit einem Compilerfehler fehl. Dies verhindert Fehler wie den Test if (PyList_SET_ITEM (a, b, c) < 0) .... (Beigetragen von Zackery Spytz und Victor Stinner in bpo-30459.)

  • Die nicht begrenzten API-Dateien odictobject.h, parser_interface.h, picklebufobject.h, pyarena.h, pyctype.h, pydebug.h, pyfpe.h und pytime.h wurden in das Verzeichnis Include/cpython verschoben. Diese Dateien dürfen nicht direkt inkludiert werden, da sie bereits in Python.h enthalten sind; siehe Include-Dateien. Wenn sie bisher direkt inkludiert wurden, sollten Sie stattdessen Python.h inkludieren. (Beigetragen von Nicholas Sim in bpo-35134.)

  • Verwenden Sie das Typ-Flag Py_TPFLAGS_IMMUTABLETYPE, um unveränderliche Typobjekte zu erstellen. Verlassen Sie sich nicht auf Py_TPFLAGS_HEAPTYPE, um zu entscheiden, ob ein Typobjekt veränderlich ist oder nicht; prüfen Sie stattdessen, ob Py_TPFLAGS_IMMUTABLETYPE gesetzt ist. (Beigetragen von Victor Stinner und Erlend E. Aasland in bpo-43908.)

  • Die undokumentierte Funktion Py_FrozenMain wurde aus der begrenzten API entfernt. Die Funktion ist hauptsächlich für benutzerdefinierte Python-Builds nützlich. (Beigetragen von Petr Viktorin in bpo-26241.)

Veraltet

  • Die Funktion PyUnicode_InternImmortal() ist nun veraltet und wird in Python 3.12 entfernt: verwenden Sie stattdessen PyUnicode_InternInPlace(). (Beigetragen von Victor Stinner in bpo-41692.)

Entfernt

  • Entfernte Py_UNICODE_str* Funktionen, die Py_UNICODE* Strings manipulieren. (Beigetragen von Inada Naoki in bpo-41123.)

  • Entfernte PyUnicode_GetMax(). Bitte migrieren Sie zu den neuen (PEP 393) APIs. (Beigetragen von Inada Naoki in bpo-41103.)

  • Entfernte PyLong_FromUnicode(). Bitte migrieren Sie zu PyLong_FromUnicodeObject(). (Beigetragen von Inada Naoki in bpo-41103.)

  • Entfernte PyUnicode_AsUnicodeCopy(). Bitte verwenden Sie PyUnicode_AsUCS4Copy() oder PyUnicode_AsWideCharString() (Beigetragen von Inada Naoki in bpo-41103.)

  • Entfernte Variable _Py_CheckRecursionLimit: sie wurde durch ceval.recursion_limit der Struktur PyInterpreterState ersetzt. (Beigetragen von Victor Stinner in bpo-41834.)

  • Entfernte undokumentierte Makros Py_ALLOW_RECURSION und Py_END_ALLOW_RECURSION sowie das Feld recursion_critical der Struktur PyInterpreterState. (Beigetragen von Serhiy Storchaka in bpo-41936.)

  • Entfernte die undokumentierte Funktion PyOS_InitInterrupts(). Die Initialisierung von Python installiert bereits implizit Signalhandler: siehe PyConfig.install_signal_handlers. (Beigetragen von Victor Stinner in bpo-41713.)

  • Entferne die Funktion PyAST_Validate(). Es ist nicht mehr möglich, ein AST-Objekt (mod_ty Typ) mit der öffentlichen C-API zu erstellen. Die Funktion war bereits aus der begrenzten C-API ausgeschlossen (PEP 384). (Beigetragen von Victor Stinner in bpo-43244.)

  • Entferne die Headerdatei symtable.h und die undokumentierten Funktionen

    • PyST_GetScope()

    • PySymtable_Build()

    • PySymtable_BuildObject()

    • PySymtable_Free()

    • Py_SymtableString()

    • Py_SymtableStringObject()

    Die Funktion Py_SymtableString() war versehentlich Teil der stabilen ABI, konnte aber nicht verwendet werden, da die Headerdatei symtable.h von der begrenzten C-API ausgeschlossen war.

    Verwenden Sie stattdessen das Python-Modul symtable. (Beigetragen von Victor Stinner in bpo-43244.)

  • Entferne PyOS_ReadlineFunctionPointer() aus den begrenzten C-API-Headern und aus python3.dll, der Bibliothek, die die stabile ABI unter Windows bereitstellt. Da die Funktion ein FILE*-Argument erwartet, kann ihre ABI-Stabilität nicht garantiert werden. (Beigetragen von Petr Viktorin in bpo-43868.)

  • Entferne die Headerdateien ast.h, asdl.h und Python-ast.h. Diese Funktionen waren undokumentiert und von der begrenzten C-API ausgeschlossen. Die meisten von diesen Headern definierten Namen waren nicht mit Py präfixiert und konnten so Namenskonflikte erzeugen. Zum Beispiel definierte Python-ast.h ein Yield-Makro, das mit dem Yield-Namen, der vom Windows-Header <winbase.h> verwendet wird, kollidierte. Verwenden Sie stattdessen das Python-Modul ast. (Beigetragen von Victor Stinner in bpo-43244.)

  • Entferne die Compiler- und Parserfunktionen, die den struct _mod Typ verwenden, da die öffentliche AST C-API entfernt wurde

    • PyAST_Compile()

    • PyAST_CompileEx()

    • PyAST_CompileObject()

    • PyFuture_FromAST()

    • PyFuture_FromASTObject()

    • PyParser_ASTFromFile()

    • PyParser_ASTFromFileObject()

    • PyParser_ASTFromFilename()

    • PyParser_ASTFromString()

    • PyParser_ASTFromStringObject()

    Diese Funktionen waren undokumentiert und von der begrenzten C-API ausgeschlossen. (Beigetragen von Victor Stinner in bpo-43244.)

  • Entferne die Headerdatei pyarena.h mit den Funktionen

    • PyArena_New()

    • PyArena_Free()

    • PyArena_Malloc()

    • PyArena_AddPyObject()

    Diese Funktionen waren undokumentiert, von der begrenzten C-API ausgeschlossen und wurden nur intern vom Compiler verwendet. (Beigetragen von Victor Stinner in bpo-43244.)

  • Das Mitglied PyThreadState.use_tracing wurde zur Optimierung von Python entfernt. (Beigetragen von Mark Shannon in bpo-43760.)

Beachtenswerte Sicherheitsfunktion in 3.10.7

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

Beachtenswerte Sicherheitsfunktion in 3.10.8

Das veraltete Modul mailcap weigert sich nun, unsicheren Text (Dateinamen, MIME-Typen, Parameter) in Shell-Befehle einzuschleusen. Anstatt solchen Text zu verwenden, wird eine Warnung ausgegeben und so verfahren, als wäre keine Übereinstimmung gefunden worden (oder für Testbefehle, als wäre der Test fehlgeschlagen). (Beigetragen von Petr Viktorin in gh-98966.)

Beachtenswerte Änderungen in 3.10.12

tarfile

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