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
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.)
tryBlöcke ohneexceptoderfinallyBlö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
die Verwendung von Daten mit Typ und Form (dem
subject)die Auswertung des
subjectin dermatch-Anweisungden Vergleich des Subjects mit jedem Muster in einer
case-Anweisung von oben nach unten, bis ein Treffer bestätigt ist.die Ausführung der Aktion, die dem Muster des bestätigten Treffers zugeordnet ist
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**restwird ebenfalls unterstützt. (Aber**_wäre redundant und ist daher nicht erlaubt.)Submuster können mit dem Schlüsselwort
aserfasst werdencase (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,FalseundNonewerden 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
inthat eine neue Methodeint.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()unddict.items()zurückgegebenen Ansichten haben nun alle einmapping-Attribut, das eintypes.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 optionalesstrict-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__()NotImplementedzurückgibt, wird der Operator erwartungsgemäß korrekt aufobject.__pow__()undobject.__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()undanext()– wurden hinzugefügt, um asynchrone Gegenstücke zuiter()undnext()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 mitfrom __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,awaitoder benannten Ausdrücken bestehen, sind nun unterfrom __future__ import annotationswegen 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 unterfrom __future__ import annotationswirkungslos gemacht. (Beigetragen von Batuhan Taskaya in bpo-42725.)Hashes von NaN-Werten sowohl vom Typ
floatals auch vom Typdecimal.Decimalhängen jetzt von der Objektidentität ab. Zuvor wurden sie immer nach0gehasht, 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 einesNameError) wird ausgelöst, wenn die Konstante__debug__gelöscht wird. (Beigetragen von Donghee Na in bpo-45000.)SyntaxError-Ausnahmen haben jetzt Attributeend_linenoundend_offset. Sie sindNone, 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.
Literaldedupliziert jetzt Parameter.Gleichheitsvergleiche zwischen
Literal-Objekten sind nun unabhängig von der Reihenfolge.Vergleiche von
Literalberücksichtigen nun Typen. Zum Beispiel wurdeLiteral[0] == Literal[False]zuvor alsTrueausgewertet. Nun ist esFalse. Um diese Änderung zu unterstützen, unterstützt der intern verwendete Typ-Cache nun die Unterscheidung von Typen.Literal-Objekte lösen nun eineTypeError-Ausnahme während Gleichheitsvergleichen aus, wenn einer ihrer Parameter nicht hashbar ist. Beachten Sie, dass die Deklaration vonLiteralmit 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()undbytearray()sind nun schneller (etwa 30–40 % für kleine Objekte). (Beigetragen von Serhiy Storchaka in bpo-41334.)Das Modul
runpyimportiert nun weniger Module. Die Startzeit des Befehlspython3 -m modulnameist im Durchschnitt 1,4-mal schneller. Unter Linux importiertpython3 -I -m modulname69 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_ATTRverwendet 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-optimizationswird nun-fno-semantic-interpositionsowohl zur Compile- als auch zur Link-Zeile hinzugefügt. Dies beschleunigt Builds des Python-Interpreters, die mit--enable-sharederstellt wurden, mitgccum 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/zlibund fügen Sie die Funktion.readall()zur Klasse_compression.DecompressReaderhinzu. 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 str2undstr2.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()undfloat(). (Beigetragen von Donghee Na und Jeroen Demeyer in bpo-43575, bpo-43287, bpo-41922, bpo-41873 und bpo-41870.)Die Leistung von
BZ2Filewird durch die Entfernung des internenRLockverbessert. Dies machtBZ2Fileim Hinblick auf mehrere gleichzeitige Leser oder Schreiber nicht threadsicher, genau wie seine äquivalenten Klassen ingzipundlzmaschon 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örterand,else,for,if,in,isundorgefolgt 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 durchfind_spec()),load_module()(ersetzt durchexec_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 inimportlib).ImportWarningund/oderDeprecationWarningwerden entsprechend ausgegeben, um Code zu identifizieren, der während dieses Übergangs aktualisiert werden muss.Der gesamte Namespace
distutilsist 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. DieValueErrorist zugunsten einerTypeErrorveraltet. (Beigetragen von Serhiy Storchaka und Raymond Hettinger in bpo-37319.)Die verschiedenen
load_module()-Methoden vonimportlibwurden seit Python 3.6 als veraltet dokumentiert, lösen aber nun auch eineDeprecationWarningaus. Verwenden Sie stattdessenexec_module(). (Beigetragen von Brett Cannon in bpo-26131.)zimport.zipimporter.load_module()ist zugunsten vonexec_module()veraltet. (Beigetragen von Brett Cannon in bpo-26131.)Die Verwendung von
load_module()durch das Importsystem löst nun eineImportWarningaus, daexec_module()bevorzugt wird. (Beigetragen von Brett Cannon in bpo-26131.)Die Verwendung von
importlib.abc.MetaPathFinder.find_module()undimportlib.abc.PathEntryFinder.find_module()durch das Importsystem löst nun eineImportWarningaus, daimportlib.abc.MetaPathFinder.find_spec()undimportlib.abc.PathEntryFinder.find_spec()entsprechend bevorzugt werden. Sie könnenimportlib.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 eineImportWarningaus, daimportlib.abc.PathEntryFinder.find_spec()bevorzugt wird. Sie könnenimportlib.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()), undimportlib.abc.PathEntryFinder.find_loader()(importlib.machinery.FileFinder.find_loader()) lösen nunDeprecationWarningaus 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.Finderist veraltet (einschließlich seiner einzigen Methodefind_module()). Sowohlimportlib.abc.MetaPathFinderals auchimportlib.abc.PathEntryFindererben 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.ImpImporterundpkgutil.ImpLoaderwurde alle aktualisiert, um Python 3.12 als das geplante Entfernungsdatum aufzulisten (sie lösten seit früheren Versionen von PythonDeprecationWarningaus). (Beigetragen von Brett Cannon in bpo-43720.)Das Importsystem verwendet nun das Attribut
__spec__von Modulen, bevor es aufmodule_repr()für die__repr__()-Methode eines Moduls zurückgreift. Die Entfernung der Verwendung vonmodule_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()undimportlib.machinery.BuiltinLoader.module_repr()sind veraltet und für die Entfernung in Python 3.12 vorgesehen. (Beigetragen von Brett Cannon in bpo-42136.)sqlite3.OptimizedUnicodeist seit Python 3.3 undokumentiert und veraltet, als es zu einem Alias fürstrgemacht 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_cacheist 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 Abfrageparametercache=shared. (Beigetragen von Erlend E. Aasland in bpo-24464.)Die folgenden
threading-Methoden sind nun veraltetthreading.currentThread=>threading.current_thread()threading.activeCount=>threading.active_count()threading.Condition.notifyAll=>threading.Condition.notify_all()threading.Event.isSet=>threading.Event.is_set()threading.Thread.setName=>threading.Thread.namethreading.thread.getName=>threading.Thread.namethreading.Thread.isDaemon=>threading.Thread.daemonthreading.Thread.setDaemon=>threading.Thread.daemon
(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 stattdessenpathlib.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.OP_NO_SSLv2,OP_NO_SSLv3,OP_NO_TLSv1,OP_NO_TLSv1_1,OP_NO_TLSv1_2undOP_NO_TLSv1_3werden durchminimum_versionundmaximum_versionersetzt.PROTOCOL_SSLv2,PROTOCOL_SSLv3,PROTOCOL_SSLv23,PROTOCOL_TLSv1,PROTOCOL_TLSv1_1,PROTOCOL_TLSv1_2undPROTOCOL_TLSsind zugunsten vonPROTOCOL_TLS_CLIENTundPROTOCOL_TLS_SERVERveraltetwrap_socket()wird durchssl.SSLContext.wrap_socket()ersetztmatch_hostname()RAND_pseudo_bytes(),RAND_egd()NPN-Funktionen wie
ssl.SSLSocket.selected_npn_protocol()undssl.SSLContext.set_npn_protocols()werden durch ALPN ersetzt.
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.ioundtyping.regibt nun eineDeprecationWarningaus. Diese Untermodule werden in einer zukünftigen Version von Python entfernt. Alles, was zu diesen Untermodulen gehört, sollte stattdessen direkt austypingimportiert werden. (Beigetragen von Sebastian Rittau in bpo-38291.)
Entfernt¶
Entfernte spezielle Methoden
__int__,__float__,__floordiv__,__mod__,__divmod__,__rfloordiv__,__rmod__und__rdivmod__der Klassecomplex. Sie lösten immer eineTypeErroraus. (Beigetragen von Serhiy Storchaka in bpo-41974.)Die Methode
ParserBase.error()aus dem privaten und undokumentierten Modul_markupbasewurde entfernt.html.parser.HTMLParserist die einzige Unterklasse vonParserBaseund ihreerror()-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_CAPIwurde 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ßlichnode.h,parser.h,graminit.hundgrammar.h, wurden entfernt.Entfernte öffentliche C-API-Funktionen
PyParser_SimpleParseStringFlags,PyParser_SimpleParseStringFlagsFilename,PyParser_SimpleParseFileFlagsundPyNode_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_warningsbereits 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
loopwurde aus den meistenasyncios High-Level-APIs entfernt, nachdem er in Python 3.8 veraltet war. Die Motivation hinter dieser Änderung ist vielfältigDies vereinfacht die High-Level-API.
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.
Die Übergabe der Event-Loop ist fehleranfällig, insbesondere bei Schleifen, die in verschiedenen Threads laufen.
Beachten Sie, dass die Low-Level-API weiterhin
loopakzeptiert. 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()undprint_exception()im Modultracebackwurden 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 mitatexit.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.CallableGeneric flacht jetzt Typ-Parameter ab, ähnlich wietyping.Callabledies derzeit tut. Das bedeutet, dasscollections.abc.Callable[[int, str], str]die__args__von(int, str, str)hat; zuvor war dies([int, str], str). Code, der übertyping.get_args()oder__args__auf die Argumente zugreift, muss diese Änderung berücksichtigen. Darüber hinaus kannTypeErrorfür ungültige Formen der Parametrisierung voncollections.abc.Callableausgelöst werden, die in Python 3.9 möglicherweise stillschweigend durchgegangen sind. (Beigetragen von Ken Jin in bpo-42195.)socket.htons()undsocket.ntohs()lösen jetztOverflowErroranstelle vonDeprecationWarningaus, wenn der angegebene Parameter nicht in einen 16-Bit vorzeichenlosen Integer passt. (Beigetragen von Erlend E. Aasland in bpo-42393.)Der Parameter
loopwurde aus den meistenasyncioHigh-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 stattdessenasyncio.run_coroutine_threadsafe()verwenden.(Beigetragen von Yurii Karabas, Andrew Svetlov, Yury Selivanov und Kyle Stanley in bpo-42392.)
Der Konstruktor von
types.FunctionTypeerbt 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 Funktioneneval()undexec(). Das Definieren einer Funktion mitdef 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_Compileund der von diesen Funktionen verwendete Typstruct _nodewurden 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 mitPyEval_EvalCode().Insbesondere
Ein Aufruf von
PyParser_SimpleParseStringFlagsgefolgt vonPyNode_Compilekann durch den Aufruf vonPy_CompileString()ersetzt werden.Es gibt keine direkte Ersetzung für
PyParser_SimpleParseFileFlags. Um Code aus einemFILE *Argument zu kompilieren, müssen Sie die Datei in C lesen und den resultierenden Puffer anPy_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 desio-Moduls mitPyImport_ImportModule(),PyObject_CallMethod(),PyBytes_AsString()undPy_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 Mitgliedf_lastinun 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 dasf_lasti-Mitglied vonFrameObject-Objekten nicht stabil ist: verwenden Sie stattdessenPyFrame_GetLineNumber().
CPython Bytecode-Änderungen¶
Die Anweisung
MAKE_FUNCTIONakzeptiert 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()undvsnprintf()werden nun zum Erstellen von Python benötigt. (Beigetragen von Victor Stinner in bpo-36020.)sqlite3erfordert SQLite 3.7.15 oder höher. (Beigetragen von Sergey Fedoseev und Erlend E. Aasland in bpo-40744 und bpo-40810.)Das Modul
atexitmuss jetzt immer als integriertes Modul erstellt werden. (Beigetragen von Victor Stinner in bpo-42639.)Option
--disable-test-moduleszumconfigure-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 optionzum./configure-Skript hinzugefügt. Wenn angegeben, sucht das Modulensurepipnach den Wheel-Paketen vonsetuptoolsundpipin 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 Paketensurepip._bundled.(Beigetragen von Victor Stinner in bpo-42856.)
Neue Option
configure --without-static-libpython optionhinzugefügt, um die statische BibliotheklibpythonMAJOR.MINOR.anicht zu erstellen und die Objektdateipython.onicht zu installieren.(Beigetragen von Victor Stinner in bpo-43103.)
Das Skript
configureverwendet nun das Dienstprogrammpkg-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-includesund--with-tcltk-libsangegeben werden. (Beigetragen von Manolis Stamatogiannakis in bpo-42603.)Option
--with-openssl-rpathzumconfigure-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.
Neue Funktionen¶
Das Ergebnis von
PyNumber_Index()hat jetzt immer den exakten Typint. Zuvor konnte das Ergebnis eine Instanz einer Unterklasse vonintsein. (Beigetragen von Serhiy Storchaka in bpo-40792.)Neues Mitglied
orig_argvzur StrukturPyConfighinzugefü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()undPyDateTime_TIME_GET_TZINFO()wurden hinzugefügt, um auf dietzinfo-Attribute vondatetime.datetime- unddatetime.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 AusnahmeStopIterationauszulö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 wiePyModule_AddObject(), aber es wird keine Referenz auf den Wert im Erfolgsfall gestohlen. (Beigetragen von Victor Stinner in bpo-1635741.)Neue Funktionen
Py_NewRef()undPy_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()undPyType_FromModuleAndSpec()akzeptieren jetzt eine einzelne Klasse als Argument für bases. (Beigetragen von Serhiy Storchaka in bpo-42423.)Die Funktion
PyType_FromModuleAndSpec()akzeptiert nunNULLfür dentp_docSlot. (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 vonset, 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_DEBUGdefiniert ist). In der begrenzten C-API werden die FunktionenPy_INCREF()undPy_DECREF()nun als unverpackte Funktionsaufrufe implementiert, anstatt direkt auf das MitgliedPyObject.ob_refcntzuzugreifen, wenn Python im Debug-Modus kompiliert wird und das MakroPy_LIMITED_APIauf Python 3.10 oder neuer abzielt. Die Unterstützung der begrenzten C-API im Debug-Modus wurde möglich, da die StrukturPyObjectseit 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_REFSMakro) 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 mitx is yin Python. Ebenfalls hinzugefügt wurden die FunktionenPy_IsNone(),Py_IsTrue(),Py_IsFalse(), um zu testen, ob ein Objekt jeweils dasNone-Singleton, dasTrue-Singleton oder dasFalse-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 Modulgcimportieren zu müssen.Neues Typ-Flag
Py_TPFLAGS_DISALLOW_INSTANTIATIONhinzugefügt, um die Erstellung von Typinstanzen zu verhindern. (Beigetragen von Victor Stinner in bpo-43916.)Neues Typ-Flag
Py_TPFLAGS_IMMUTABLETYPEhinzugefü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_CLEANmuss nun definiert sein, umPyArg_ParseTuple()undPy_BuildValue()Formate zu verwenden, die#verwenden:es#,et#,s#,u#,y#,z#,U#undZ#. 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, mussPy_REFCNT(obj) = new_refcntdurchPy_SET_REFCNT(obj, new_refcnt)ersetzt werden: siehePy_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)undPyUnicode_FromStringAndSize(NULL, size)lösen nunDeprecationWarningaus. Verwenden SiePyUnicode_New(), um ein Unicode-Objekt ohne initiale Daten zuzuweisen. (Beigetragen von Inada Naoki in bpo-36346.)Die private Struktur
_PyUnicode_Name_CAPIder PyCapsule APIunicodedata.ucnhash_CAPIwurde 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()undPy_GetProgramName()geben nunNULLzurück, wenn sie vorPy_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()undPyCell_SET()Makros können nicht mehr als l-value oder r-value verwendet werden. Zum Beispiel schlagenx = PyList_SET_ITEM(a, b, c)undPyList_SET_ITEM(a, b, c) = xnun mit einem Compilerfehler fehl. Dies verhindert Fehler wie den Testif (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.hundpytime.hwurden in das VerzeichnisInclude/cpythonverschoben. Diese Dateien dürfen nicht direkt inkludiert werden, da sie bereits inPython.henthalten sind; siehe Include-Dateien. Wenn sie bisher direkt inkludiert wurden, sollten Sie stattdessenPython.hinkludieren. (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 aufPy_TPFLAGS_HEAPTYPE, um zu entscheiden, ob ein Typobjekt veränderlich ist oder nicht; prüfen Sie stattdessen, obPy_TPFLAGS_IMMUTABLETYPEgesetzt ist. (Beigetragen von Victor Stinner und Erlend E. Aasland in bpo-43908.)Die undokumentierte Funktion
Py_FrozenMainwurde 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 stattdessenPyUnicode_InternInPlace(). (Beigetragen von Victor Stinner in bpo-41692.)
Entfernt¶
Entfernte
Py_UNICODE_str*Funktionen, diePy_UNICODE*Strings manipulieren. (Beigetragen von Inada Naoki in bpo-41123.)Py_UNICODE_strlen: verwenden SiePyUnicode_GetLength()oderPyUnicode_GET_LENGTHPy_UNICODE_strcat: verwenden SiePyUnicode_CopyCharacters()oderPyUnicode_FromFormat()Py_UNICODE_strcpy,Py_UNICODE_strncpy: verwenden SiePyUnicode_CopyCharacters()oderPyUnicode_Substring()Py_UNICODE_strcmp: verwenden SiePyUnicode_Compare()Py_UNICODE_strncmp: verwenden SiePyUnicode_Tailmatch()Py_UNICODE_strchr,Py_UNICODE_strrchr: verwenden SiePyUnicode_FindChar()
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 zuPyLong_FromUnicodeObject(). (Beigetragen von Inada Naoki in bpo-41103.)Entfernte
PyUnicode_AsUnicodeCopy(). Bitte verwenden SiePyUnicode_AsUCS4Copy()oderPyUnicode_AsWideCharString()(Beigetragen von Inada Naoki in bpo-41103.)Entfernte Variable
_Py_CheckRecursionLimit: sie wurde durchceval.recursion_limitder StrukturPyInterpreterStateersetzt. (Beigetragen von Victor Stinner in bpo-41834.)Entfernte undokumentierte Makros
Py_ALLOW_RECURSIONundPy_END_ALLOW_RECURSIONsowie das Feldrecursion_criticalder StrukturPyInterpreterState. (Beigetragen von Serhiy Storchaka in bpo-41936.)Entfernte die undokumentierte Funktion
PyOS_InitInterrupts(). Die Initialisierung von Python installiert bereits implizit Signalhandler: siehePyConfig.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_tyTyp) 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.hund die undokumentierten FunktionenPyST_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 Headerdateisymtable.hvon 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 auspython3.dll, der Bibliothek, die die stabile ABI unter Windows bereitstellt. Da die Funktion einFILE*-Argument erwartet, kann ihre ABI-Stabilität nicht garantiert werden. (Beigetragen von Petr Viktorin in bpo-43868.)Entferne die Headerdateien
ast.h,asdl.hundPython-ast.h. Diese Funktionen waren undokumentiert und von der begrenzten C-API ausgeschlossen. Die meisten von diesen Headern definierten Namen waren nicht mitPypräfixiert und konnten so Namenskonflikte erzeugen. Zum Beispiel definiertePython-ast.heinYield-Makro, das mit demYield-Namen, der vom Windows-Header<winbase.h>verwendet wird, kollidierte. Verwenden Sie stattdessen das Python-Modulast. (Beigetragen von Victor Stinner in bpo-43244.)Entferne die Compiler- und Parserfunktionen, die den
struct _modTyp verwenden, da die öffentliche AST C-API entfernt wurdePyAST_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.hmit den FunktionenPyArena_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_tracingwurde 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
tarfileundshutil.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 eineDeprecationWarninganzeigen. In Python 3.14 wird die Standardeinstellung auf'data'umgestellt. (Beigetragen von Petr Viktorin in PEP 706.)