Was gibt es Neues in Python 3.7¶
- Editor:
Elvis Pranskevichus <elvis@magic.io>
Dieser Artikel erklärt die neuen Funktionen in Python 3.7 im Vergleich zu 3.6. Python 3.7 wurde am 27. Juni 2018 veröffentlicht. Vollständige Details finden Sie im Changelog.
Zusammenfassung – Release-Highlights¶
Neue Syntaxfunktionen
PEP 563, aufgeschobene Auswertung von Typ-Annotationen.
Rückwärts inkompatible Syntaxänderungen
Neue Bibliotheksmodule
Neue eingebaute Funktionen
PEP 553, die neue Funktion
breakpoint().
Verbesserungen am Python-Datenmodell
PEP 562, Anpassung des Zugriffs auf Modulattribute.
PEP 560, Kernunterstützung für das
typingModul und generische Typen.Das Einfügungsreihenfolge-Behaltungsverhalten von dict-Objekten wurde zum offiziellen Bestandteil der Python-Sprachspezifikation erklärt.
Signifikante Verbesserungen in der Standardbibliothek
Das Modul
asynciohat neue Funktionen sowie signifikante Benutzbarkeits- und Leistungsverbesserungen erhalten.Das Modul
timehat Unterstützung für Funktionen mit Nanosekundenauflösung erhalten.
CPython-Implementierungsverbesserungen
Vermeidung der Verwendung von ASCII als Standard-Textkodierung
PEP 552, deterministische .pycs
PEP 565, verbesserte Behandlung von
DeprecationWarning
C-API-Verbesserungen
PEP 539, neue C-API für Thread-lokalen Speicher
Verbesserungen der Dokumentation
PEP 545, Übersetzungen der Python-Dokumentation
Neue Dokumentationsübersetzungen: Japanisch, Französisch und Koreanisch.
Diese Version bietet in vielen Bereichen bemerkenswerte Leistungsverbesserungen. Der Abschnitt Optimierungen listet diese im Detail auf.
Eine Liste der Änderungen, die die Kompatibilität mit früheren Python-Versionen beeinträchtigen könnten, finden Sie im Abschnitt Portierung auf Python 3.7.
Neue Funktionen¶
PEP 563: Aufgeschobene Auswertung von Annotationen¶
Die Einführung von Typ-Hints in Python deckte zwei offensichtliche Usability-Probleme mit der Funktionalität von Annotationen auf, die in PEP 3107 hinzugefügt und in PEP 526 weiter verfeinert wurden:
Annotationen konnten nur Namen verwenden, die bereits im aktuellen Geltungsbereich verfügbar waren, d. h. sie unterstützten keine Vorwärtsreferenzen jeglicher Art; und
die Annotation von Quellcode hatte nachteilige Auswirkungen auf die Startzeit von Python-Programmen.
Beide Probleme werden durch die aufgeschobene Auswertung von Annotationen behoben. Anstatt Code zu kompilieren, der Ausdrücke in Annotationen zum Zeitpunkt ihrer Definition ausführt, speichert der Compiler die Annotation in einer String-Form, die dem AST des betreffenden Ausdrucks entspricht. Bei Bedarf können Annotationen zur Laufzeit mit typing.get_type_hints() aufgelöst werden. Im üblichen Fall, in dem dies nicht erforderlich ist, sind die Annotationen günstiger zu speichern (da kurze Strings vom Interpreter interniert werden) und machen die Startzeit schneller.
Usability-seitig unterstützen Annotationen jetzt Vorwärtsreferenzen, was die folgende Syntax gültig macht
class C:
@classmethod
def from_string(cls, source: str) -> C:
...
def validate_b(self, obj: B) -> bool:
...
class B:
...
Da diese Änderung die Kompatibilität bricht, muss das neue Verhalten in Python 3.7 pro Modul über einen __future__-Import aktiviert werden.
from __future__ import annotations
Dies wird in Python 3.10 zum Standard.
Siehe auch
- PEP 563 – Aufgeschobene Auswertung von Annotationen
PEP verfasst und implementiert von Łukasz Langa.
PEP 538: Behandlung von Legacy-C-Locale-Kodierungen¶
Eine fortlaufende Herausforderung in der Python-3-Serie war die Bestimmung einer sinnvollen Standardstrategie für den Umgang mit der „7-Bit-ASCII“-Textkodierungsannahme, die derzeit durch die Verwendung der Standard-C- oder POSIX-Locale auf Nicht-Windows-Plattformen impliziert wird.
PEP 538 aktualisiert die standardmäßige Befehlszeilenschnittstelle des Interpreters, um diese Locale automatisch in eine verfügbare UTF-8-basierte Locale zu konvertieren, wie in der Dokumentation der neuen Umgebungsvariablen PYTHONCOERCECLOCALE beschrieben. Das automatische Setzen von LC_CTYPE auf diese Weise bedeutet, dass sowohl der Kerninterpreter als auch Locale-abhängige C-Erweiterungen (wie readline) die Verwendung von UTF-8 als Standard-Textkodierung annehmen, anstatt ASCII.
Die Plattform-Support-Definition in PEP 11 wurde ebenfalls aktualisiert, um die vollständige Textbehandlungsunterstützung auf entsprechend konfigurierte Nicht-ASCII-basierte Locales zu beschränken.
Als Teil dieser Änderung ist der Standard-Fehlerbehandler für stdin und stdout jetzt surrogateescape (anstelle von strict), wenn eine der definierten Ziel-Locales verwendet wird (derzeit C.UTF-8, C.utf8 und UTF-8). Der Standard-Fehlerbehandler für stderr bleibt unabhängig von der Locale backslashreplace.
Die Locale-Konvertierung ist standardmäßig still, aber um bei der Fehlersuche bei potenziellen Locale-bezogenen Integrationsproblemen zu helfen, können explizite Warnungen (direkt auf stderr ausgegeben) angefordert werden, indem PYTHONCOERCECLOCALE=warn gesetzt wird. Diese Einstellung veranlasst die Python-Laufzeitumgebung auch, eine Warnung auszugeben, wenn die Legacy-C-Locale beim Initialisieren des Kerninterpreters aktiv bleibt.
Während PEP 538s Locale-Konvertierung den Vorteil hat, dass sie auch Erweiterungsmodule (wie GNU readline) sowie Kindprozesse (einschließlich solcher, die Nicht-Python-Anwendungen und ältere Python-Versionen ausführen) beeinflusst, hat sie den Nachteil, dass ein geeignetes Ziel-Locale auf dem laufenden System vorhanden sein muss. Um den Fall, dass kein geeignetes Ziel-Locale verfügbar ist (wie z. B. unter RHEL/CentOS 7), besser zu handhaben, implementiert Python 3.7 auch PEP 540: Erzwingen des UTF-8-Laufzeitmodus.
Siehe auch
- PEP 538 – Konvertierung der Legacy-C-Locale in eine UTF-8-basierte Locale
PEP geschrieben und implementiert von Nick Coghlan.
PEP 540: Erzwingen des UTF-8-Laufzeitmodus¶
Die neue Befehlszeilenoption -X utf8 und die Umgebungsvariable PYTHONUTF8 können verwendet werden, um den Python UTF-8-Modus zu aktivieren.
Im UTF-8-Modus ignoriert CPython die Locale-Einstellungen und verwendet standardmäßig die UTF-8-Kodierung. Die Fehlerbehandler für die Streams sys.stdin und sys.stdout werden auf surrogateescape gesetzt.
Der erzwungene UTF-8-Modus kann verwendet werden, um das Textbehandlungsverhalten eines eingebetteten Python-Interpreters zu ändern, ohne die Locale-Einstellungen einer einbettenden Anwendung zu ändern.
Während PEP 540s UTF-8-Modus den Vorteil hat, dass er unabhängig davon funktioniert, welche Locales auf dem laufenden System verfügbar sind, hat er den Nachteil, dass er keine Auswirkungen auf Erweiterungsmodule (wie GNU readline), Kindprozesse, die Nicht-Python-Anwendungen ausführen, und Kindprozesse, die ältere Python-Versionen ausführen, hat. Um das Risiko der Beschädigung von Textdaten bei der Kommunikation mit solchen Komponenten zu verringern, implementiert Python 3.7 auch PEP 540: Erzwingen des UTF-8-Laufzeitmodus).
Der UTF-8-Modus ist standardmäßig aktiviert, wenn die Locale C oder POSIX ist und die PEP 538 Locale-Konvertierungsfunktion fehlschlägt, sie in eine UTF-8-basierte Alternative zu ändern (sei es aufgrund von PYTHONCOERCECLOCALE=0, LC_ALL oder dem Fehlen eines geeigneten Ziel-Locales).
Siehe auch
- PEP 540 – Hinzufügen eines neuen UTF-8-Modus
PEP verfasst und implementiert von Victor Stinner
PEP 553: Integrierte Funktion breakpoint()¶
Python 3.7 enthält die neue integrierte Funktion breakpoint() als einfache und konsistente Möglichkeit, den Python-Debugger aufzurufen.
Die integrierte Funktion breakpoint() ruft sys.breakpointhook() auf. Standardmäßig importiert letztere pdb und ruft dann pdb.set_trace() auf, aber durch Binden von sys.breakpointhook() an eine beliebige Funktion kann breakpoint() jeden Debugger aufrufen. Darüber hinaus kann die Umgebungsvariable PYTHONBREAKPOINT auf den aufrufbaren Debugger Ihrer Wahl gesetzt werden. Setzen Sie PYTHONBREAKPOINT=0, um die integrierte Funktion breakpoint() vollständig zu deaktivieren.
Siehe auch
- PEP 553 – Integrierte Funktion breakpoint()
PEP verfasst und implementiert von Barry Warsaw.
PEP 539: Neue C-API für Thread-lokalen Speicher¶
Obwohl Python eine C-API für die Unterstützung von Thread-lokalem Speicher bietet; hat die bestehende Thread Local Storage (TLS) API int verwendet, um TLS-Schlüssel auf allen Plattformen darzustellen. Dies war im Allgemeinen kein Problem für offiziell unterstützte Plattformen, aber dies ist weder POSIX-konform noch portabel im praktischen Sinne.
PEP 539 ändert dies, indem es eine neue Thread Specific Storage (TSS) API für CPython bereitstellt, die die Verwendung der bestehenden TLS-API innerhalb des CPython-Interpreters ersetzt und gleichzeitig die bestehende API als veraltet kennzeichnet. Die TSS-API verwendet einen neuen Typ Py_tss_t anstelle von int zur Darstellung von TSS-Schlüsseln – ein opaker Typ, dessen Definition von der zugrunde liegenden TLS-Implementierung abhängen kann. Daher wird dies die Erstellung von CPython auf Plattformen ermöglichen, auf denen der native TLS-Schlüssel so definiert ist, dass er sicher in int gecastet werden kann.
Beachten Sie, dass auf Plattformen, auf denen der native TLS-Schlüssel so definiert ist, dass er nicht sicher in int gecastet werden kann, alle Funktionen der bestehenden TLS-API No-Ops sind und sofort einen Fehler zurückgeben. Dies zeigt klar, dass die alte API auf Plattformen, auf denen sie nicht zuverlässig verwendet werden kann, nicht unterstützt wird und keine Anstrengungen unternommen werden, diese Unterstützung hinzuzufügen.
Siehe auch
- PEP 539 – Eine neue C-API für Thread-lokalen Speicher in CPython
PEP verfasst von Erik M. Bray; Implementierung von Masayuki Yamamoto.
PEP 562: Anpassung des Zugriffs auf Modulattribute¶
Python 3.7 erlaubt die Definition von __getattr__() für Module und ruft diese auf, wenn ein Modulattribut sonst nicht gefunden wird. Die Definition von __dir__() für Module ist ebenfalls erlaubt.
Ein typisches Beispiel für die Nützlichkeit wäre die Deprecation von Modulattributen und das Lazy Loading.
Siehe auch
- PEP 562 – Modul
__getattr__und__dir__ PEP verfasst und implementiert von Ivan Levkivskyi.
PEP 564: Neue Zeitfunktionen mit Nanosekundenauflösung¶
Die Auflösung von Uhren in modernen Systemen kann die begrenzte Präzision einer Gleitkommazahl, die von der Funktion time.time() und ihren Varianten zurückgegeben wird, überschreiten. Um Präzisionsverluste zu vermeiden, fügt PEP 564 sechs neue „Nanosekunden“-Varianten der bestehenden Timerfunktionen zum Modul time hinzu:
Die neuen Funktionen geben die Anzahl der Nanosekunden als Ganzzahl zurück.
Messungen zeigen, dass unter Linux und Windows die Auflösung von time.time_ns() etwa 3-mal besser ist als die von time.time().
Siehe auch
- PEP 564 – Hinzufügen neuer Zeitfunktionen mit Nanosekundenauflösung
PEP verfasst und implementiert von Victor Stinner
PEP 565: Anzeige von DeprecationWarning in __main__¶
Die Standardbehandlung von DeprecationWarning wurde so geändert, dass diese Warnungen wieder standardmäßig angezeigt werden, aber nur, wenn der Code, der sie auslöst, direkt im Modul __main__ ausgeführt wird. Infolgedessen sollten Entwickler von Ein-Datei-Skripten und diejenigen, die Python interaktiv verwenden, wieder Deprecation-Warnungen für die von ihnen verwendeten APIs sehen, während Deprecation-Warnungen, die von importierten Anwendungs-, Bibliotheks- und Framework-Modulen ausgelöst werden, standardmäßig weiterhin ausgeblendet bleiben.
Als Ergebnis dieser Änderung erlaubt die Standardbibliothek Entwicklern nun, zwischen drei verschiedenen Verhaltensweisen für Deprecation-Warnungen zu wählen:
FutureWarning: Immer standardmäßig angezeigt, empfohlen für Warnungen, die von Endbenutzern von Anwendungen gesehen werden sollen (z. B. für veraltete Anwendungskonfigurationseinstellungen).DeprecationWarning: Standardmäßig nur in__main__und beim Ausführen von Tests angezeigt, empfohlen für Warnungen, die anderen Python-Entwicklern angezeigt werden sollen, bei denen ein Versions-Upgrade zu geänderten Verhaltensweisen oder Fehlern führen kann.PendingDeprecationWarning: Standardmäßig nur beim Ausführen von Tests angezeigt, bestimmt für Fälle, in denen ein zukünftiges Versions-Upgrade die Warnungskategorie inDeprecationWarningoderFutureWarningändert.
Zuvor waren sowohl DeprecationWarning als auch PendingDeprecationWarning nur beim Ausführen von Tests sichtbar, was bedeutete, dass Entwickler, die hauptsächlich Ein-Datei-Skripte schrieben oder Python interaktiv nutzten, von unerwarteten Änderungen in den von ihnen verwendeten APIs überrascht werden konnten.
Siehe auch
- PEP 565 – Anzeige von DeprecationWarning in
__main__ PEP verfasst und implementiert von Nick Coghlan.
PEP 560: Kernunterstützung für das typing Modul und generische Typen¶
Ursprünglich war PEP 484 so konzipiert, dass er *keine* Änderungen am CPython-Kerninterpreter einführt. Jetzt werden Typ-Hints und das Modul typing von der Community extensiv genutzt, daher ist diese Einschränkung aufgehoben. Die PEP führt zwei spezielle Methoden ein: __class_getitem__() und __mro_entries__(). Diese Methoden werden nun von den meisten Klassen und speziellen Konstrukten in typing verwendet. Infolgedessen hat sich die Geschwindigkeit verschiedener Operationen mit Typen um bis zu das 7-fache erhöht, generische Typen können ohne Metaklassenkonflikte verwendet werden, und mehrere langjährige Fehler im Modul typing wurden behoben.
Siehe auch
- PEP 560 – Kernunterstützung für das typing-Modul und generische Typen
PEP verfasst und implementiert von Ivan Levkivskyi.
PEP 552: Hash-basierte .pyc Dateien¶
Python hat traditionell die Aktualität von Bytecode-Cache-Dateien (d. h. .pyc-Dateien) überprüft, indem es die Quellmetadaten (zuletzt geändertes Zeitstempel und Größe) mit den in der Cache-Datei gespeicherten Metadaten beim Erstellen vergleicht. Obwohl effektiv, hat diese Invalidierungsmethode Nachteile. Wenn Dateisystem-Zeitstempel zu grob sind, kann Python Quellcode-Aktualisierungen übersehen, was zu Verwirrung bei den Benutzern führt. Außerdem ist ein Zeitstempel in der Cache-Datei problematisch für reproduzierbare Builds und inhaltsbasierte Build-Systeme.
PEP 552 erweitert das pyc-Format, um den Hash der Quelldatei für die Invalidierung anstelle des Quell-Zeitstempels zu verwenden. Solche .pyc-Dateien werden als „hash-basiert“ bezeichnet. Standardmäßig verwendet Python weiterhin die Zeitstempel-basierte Invalidierung und generiert zur Laufzeit keine hash-basierten .pyc-Dateien. Hash-basierte .pyc-Dateien können mit py_compile oder compileall generiert werden.
Hash-basierte .pyc-Dateien gibt es in zwei Varianten: geprüft und ungeprüft. Python validiert geprüfte hash-basierte .pyc-Dateien zur Laufzeit gegen die entsprechenden Quelldateien, tut dies aber nicht für ungeprüfte hash-basierte pycs. Ungeprüfte hash-basierte .pyc-Dateien sind eine nützliche Leistungsoptimierung für Umgebungen, in denen ein externes System zu Python (z. B. das Build-System) für die Aktualisierung der .pyc-Dateien verantwortlich ist.
Weitere Informationen finden Sie unter Cached bytecode invalidation.
Siehe auch
- PEP 552 – Deterministische pycs
PEP verfasst und implementiert von Benjamin Peterson.
PEP 545: Übersetzungen der Python-Dokumentation¶
PEP 545 beschreibt den Prozess der Erstellung und Pflege von Übersetzungen der Python-Dokumentation.
Drei neue Übersetzungen wurden hinzugefügt:
Japanisch: https://docs.pythonlang.de/
Französisch: https://docs.pythonlang.de/
Koreanisch: https://docs.pythonlang.de/
Siehe auch
- PEP 545 – Übersetzungen der Python-Dokumentation
PEP verfasst und implementiert von Julien Palard, Inada Naoki und Victor Stinner.
Python-Entwicklungsmodus (-X dev)¶
Die neue Befehlszeilenoption -X dev oder die neue Umgebungsvariable PYTHONDEVMODE kann verwendet werden, um den Python-Entwicklungsmodus zu aktivieren. Im Entwicklungsmodus führt Python zusätzliche Laufzeitprüfungen durch, die zu teuer sind, um standardmäßig aktiviert zu werden. Eine vollständige Beschreibung finden Sie in der Dokumentation zum Python-Entwicklungsmodus.
Andere Sprachänderungen¶
Ein
await-Ausdruck und Comprehensions, die eineasync for-Klausel enthielten, waren in den Ausdrücken von formatierten Zeichenkettenliteralen aufgrund eines Implementierungsproblems illegal. In Python 3.7 wurde diese Einschränkung aufgehoben.Mehr als 255 Argumente können nun an eine Funktion übergeben werden, und eine Funktion kann nun mehr als 255 Parameter haben. (Beigetragen von Serhiy Storchaka in bpo-12844 und bpo-18896.)
bytes.fromhex()undbytearray.fromhex()ignorieren jetzt allen ASCII-Whitespace, nicht nur Leerzeichen. (Beigetragen von Robert Xiao in bpo-28927.)str,bytesundbytearrayerhielten Unterstützung für die neue Methodeisascii(), mit der geprüft werden kann, ob eine Zeichenkette oder Bytes nur ASCII-Zeichen enthalten. (Beigetragen von INADA Naoki in bpo-32677.)ImportErrorzeigt nun den Modulnamen und den Pfad__file__des Moduls an, wenn der Import fehlschlägt. (Beigetragen von Matthias Bussonnier in bpo-29546.)Zirkuläre Importe, die absolute Importe mit der Bindung eines Untermoduls an einen Namen beinhalten, werden nun unterstützt. (Beigetragen von Serhiy Storchaka in bpo-30024.)
object.__format__(x, '')ist nun äquivalent zustr(x)anstatt zuformat(str(self), ''). (Beigetragen von Serhiy Storchaka in bpo-28974.)Um die dynamische Erstellung von Stack-Traces besser zu unterstützen, kann
types.TracebackTypenun aus Python-Code instanziiert werden, und das Attributtb_nextvon Tracebacks ist nun beschreibbar. (Beigetragen von Nathaniel J. Smith in bpo-30579.)Bei Verwendung des Schalters
-mwirdsys.path[0]nun eifrig auf den vollständigen Pfad des Startverzeichnisses erweitert, anstatt das leere Verzeichnis zu belassen (was Importe aus dem *aktuellen* Arbeitsverzeichnis zur Zeit des Imports erlaubt). (Beigetragen von Nick Coghlan in bpo-33053.)Die neue Option
-Ximporttimeoder die UmgebungsvariablePYTHONPROFILEIMPORTTIMEkönnen verwendet werden, um die Dauer jedes Modulimports anzuzeigen. (Beigetragen von Inada Naoki in bpo-31415.)
Neue Module¶
contextvars¶
Das neue Modul contextvars und eine Reihe von neuen C-APIs führen Unterstützung für *Kontextvariablen* ein. Kontextvariablen sind konzeptionell ähnlich zu thread-lokalen Variablen. Im Gegensatz zu TLS unterstützen Kontextvariablen asynchronen Code korrekt.
Die Module asyncio und decimal wurden aktualisiert, um Kontextvariablen standardmäßig zu verwenden und zu unterstützen. Insbesondere der aktive Dezimalkontext wird jetzt in einer Kontextvariable gespeichert, was es Dezimaloperationen ermöglicht, mit dem korrekten Kontext in asynchronem Code zu arbeiten.
Siehe auch
- PEP 567 – Context Variables
PEP geschrieben und implementiert von Yury Selivanov
dataclasses¶
Der neue Dekorator dataclass() bietet eine Möglichkeit, *Datenklassen* zu deklarieren. Eine Datenklasse beschreibt ihre Attribute mithilfe von Klassenvariablen-Annotationen. Ihr Konstruktor und andere magische Methoden, wie __repr__(), __eq__() und __hash__() werden automatisch generiert.
Beispiel
@dataclass
class Point:
x: float
y: float
z: float = 0.0
p = Point(1.5, 2.5)
print(p) # produces "Point(x=1.5, y=2.5, z=0.0)"
Siehe auch
- PEP 557 – Data Classes
PEP geschrieben und implementiert von Eric V. Smith
importlib.resources¶
Das neue Modul importlib.resources bietet mehrere neue APIs und eine neue ABC für den Zugriff, das Öffnen und Lesen von *Ressourcen* innerhalb von Paketen. Ressourcen ähneln grob Dateien innerhalb von Paketen, müssen aber keine tatsächlichen Dateien im physischen Dateisystem sein. Modullader können eine Funktion get_resource_reader() bereitstellen, die eine Instanz von importlib.abc.ResourceReader zurückgibt, um diese neue API zu unterstützen. Eingebaute Dateipfad- und Zip-Dateilader unterstützen dies.
Beigetragen von Barry Warsaw und Brett Cannon in bpo-32248.
Siehe auch
importlib_resources – ein PyPI-Backport für frühere Python-Versionen.
Verbesserte Module¶
argparse¶
Die neue Methode ArgumentParser.parse_intermixed_args() erlaubt die Vermischung von Optionen und Positionsargumenten. (Beigetragen von paul.j3 in bpo-14191.)
asyncio¶
Das Modul asyncio hat viele neue Funktionen, Benutzerfreundlichkeits- und Leistungsverbesserungen erhalten. Bemerkenswerte Änderungen sind:
Die neue *provisorische* Funktion
asyncio.run()kann verwendet werden, um eine Koroutine aus synchronem Code auszuführen, indem die Ereignisschleife automatisch erstellt und zerstört wird. (Beigetragen von Yury Selivanov in bpo-32314.)asyncio hat Unterstützung für
contextvarserhalten.loop.call_soon(),loop.call_soon_threadsafe(),loop.call_later(),loop.call_at()undFuture.add_done_callback()haben einen neuen optionalen Schlüsselwort-Argument-Parameter *context*.Tasksverfolgen nun ihren Kontext automatisch. Siehe PEP 567 für weitere Details. (Beigetragen von Yury Selivanov in bpo-32436.)Die neue Funktion
asyncio.create_task()wurde als Abkürzung zuasyncio.get_event_loop().create_task()hinzugefügt. (Beigetragen von Andrew Svetlov in bpo-32311.)Die neue Methode
loop.start_tls()kann verwendet werden, um eine bestehende Verbindung auf TLS zu aktualisieren. (Beigetragen von Yury Selivanov in bpo-23749.)Die neue Methode
loop.sock_recv_into()ermöglicht das Lesen von Daten von einem Socket direkt in einen bereitgestellten Puffer, wodurch Datenkopien reduziert werden können. (Beigetragen von Antoine Pitrou in bpo-31819.)Die neue Funktion
asyncio.current_task()gibt die aktuell laufendeTask-Instanz zurück, und die neue Funktionasyncio.all_tasks()gibt eine Menge aller vorhandenenTask-Instanzen in einer gegebenen Schleife zurück. Die MethodenTask.current_task()undTask.all_tasks()wurden als veraltet markiert. (Beigetragen von Andrew Svetlov in bpo-32250.)Die neue *provisorische* Klasse
BufferedProtocolermöglicht die Implementierung von Streaming-Protokollen mit manueller Kontrolle über den Empfangspuffer. (Beigetragen von Yury Selivanov in bpo-32251.)Die neue Funktion
asyncio.get_running_loop()gibt die aktuell laufende Schleife zurück und löst einenRuntimeErroraus, wenn keine Schleife läuft. Dies steht im Gegensatz zuasyncio.get_event_loop(), das eine neue Ereignisschleife *erstellt*, wenn keine läuft. (Beigetragen von Yury Selivanov in bpo-32269.)Die neue Koroutinenmethode
StreamWriter.wait_closed()erlaubt das Warten, bis der Stream-Writer geschlossen ist. Die neue MethodeStreamWriter.is_closing()kann verwendet werden, um zu ermitteln, ob der Writer schließt. (Beigetragen von Andrew Svetlov in bpo-32391.)Die neue Koroutinenmethode
loop.sock_sendfile()erlaubt das Senden von Dateien unter Verwendung vonos.sendfile, wenn möglich. (Beigetragen von Andrew Svetlov in bpo-32410.)Die neuen Methoden
Future.get_loop()undTask.get_loop()geben die Instanz der Schleife zurück, auf der eine Aufgabe oder ein Future erstellt wurden.Server.get_loop()ermöglicht dasselbe fürasyncio.Server-Objekte. (Beigetragen von Yury Selivanov in bpo-32415 und Srinivas Reddy Thatiparthy in bpo-32418.)Es ist nun möglich zu steuern, wie Instanzen von
asyncio.Servermit dem Dienen beginnen. Zuvor begann der Server sofort mit dem Dienen, wenn er erstellt wurde. Das neue Schlüsselwortargument *start_serving* fürloop.create_server()undloop.create_unix_server(), sowieServer.start_serving()undServer.serve_forever()können verwendet werden, um die Serverinstanziierung und das Dienen zu entkoppeln. Die neue MethodeServer.is_serving()gibtTruezurück, wenn der Server bedient.Server-Objekte sind nun asynchrone Kontextmanager.srv = await loop.create_server(...) async with srv: # some code # At this point, srv is closed and no longer accepts new connections.
(Beigetragen von Yury Selivanov in bpo-32662.)
Callback-Objekte, die von
loop.call_later()zurückgegeben werden, haben die neue Methodewhen()erhalten, die einen absoluten Zeitstempel des geplanten Callbacks zurückgibt. (Beigetragen von Andrew Svetlov in bpo-32741.)Die Methode
loop.create_datagram_endpoint()hat Unterstützung für Unix-Sockets erhalten. (Beigetragen von Quentin Dawans in bpo-31245.)Die Funktionen
asyncio.open_connection(),asyncio.start_server(), die Methodenloop.create_connection(),loop.create_server(),loop.create_accepted_socket()und ihre entsprechenden UNIX-Socket-Varianten akzeptieren nun das Schlüsselwortargument *ssl_handshake_timeout*. (Beigetragen von Neil Aspinall in bpo-29970.)Die neue Methode
Handle.cancelled()gibtTruezurück, wenn der Callback abgebrochen wurde. (Beigetragen von Marat Sharafutdinov in bpo-31943.)Der asyncio-Quellcode wurde konvertiert, um die
async/await-Syntax zu verwenden. (Beigetragen von Andrew Svetlov in bpo-32193.)Die neue Methode
ReadTransport.is_reading()kann verwendet werden, um den Lesestatus des Transports zu ermitteln. Zusätzlich sind Aufrufe vonReadTransport.resume_reading()undReadTransport.pause_reading()nun idempotent. (Beigetragen von Yury Selivanov in bpo-32356.)Schleifenmethoden, die Socket-Pfade akzeptieren, unterstützen nun die Übergabe von pfadähnlichen Objekten. (Beigetragen von Yury Selivanov in bpo-32066.)
In
asynciowerden TCP-Sockets unter Linux nun standardmäßig mit gesetztemTCP_NODELAY-Flag erstellt. (Beigetragen von Yury Selivanov und Victor Stinner in bpo-27456.)In abgebrochenen Tasks auftretende Ausnahmen werden nicht mehr protokolliert. (Beigetragen von Yury Selivanov in bpo-30508.)
Neue Klassen
WindowsSelectorEventLoopPolicyundWindowsProactorEventLoopPolicy. (Beigetragen von Yury Selivanov in bpo-33792.)
Mehrere asyncio-APIs wurden als veraltet markiert.
binascii¶
Die Funktion b2a_uu() akzeptiert nun das optionale Schlüsselwortargument *backtick*. Wenn es auf True gesetzt ist, werden Nullen durch '`' anstelle von Leerzeichen dargestellt. (Beigetragen von Xiang Zhang in bpo-30103.)
calendar¶
Die Klasse HTMLCalendar hat neue Klassenattribute, die die Anpassung von CSS-Klassen im erzeugten HTML-Kalender erleichtern. (Beigetragen von Oz Tiram in bpo-30095.)
collections¶
collections.namedtuple() unterstützt nun Standardwerte. (Beigetragen von Raymond Hettinger in bpo-32320.)
compileall¶
compileall.compile_dir() hat den neuen Parameter *invalidation_mode* erhalten, der zur Aktivierung der hash-basierten .pyc-Invalidierung verwendet werden kann. Der Invalidierungsmodus kann auch über die Kommandozeile mit dem neuen Argument --invalidation-mode angegeben werden. (Beigetragen von Benjamin Peterson in bpo-31650.)
concurrent.futures¶
ProcessPoolExecutor und ThreadPoolExecutor unterstützen nun die neuen Konstruktorargumente *initializer* und *initargs*. (Beigetragen von Antoine Pitrou in bpo-21423.)
ProcessPoolExecutor kann nun den Multiprocessing-Kontext über das neue Argument *mp_context* übergeben. (Beigetragen von Thomas Moreau in bpo-31540.)
contextlib¶
Das neue nullcontext() ist ein einfacherer und schnellerer No-Op-Kontextmanager als ExitStack. (Beigetragen von Jesse-Bakker in bpo-10049.)
Die neuen asynccontextmanager(), AbstractAsyncContextManager und AsyncExitStack wurden hinzugefügt, um ihre synchronen Gegenstücke zu ergänzen. (Beigetragen von Jelle Zijlstra in bpo-29679 und bpo-30241, und von Alexander Mohr und Ilya Kulakov in bpo-29302.)
cProfile¶
Das Kommandozeilen-Tool cProfile akzeptiert nun -m module_name als Alternative zum Skriptpfad. (Beigetragen von Sanyam Khurana in bpo-21862.)
crypt¶
Das Modul crypt unterstützt nun die Blowfish-Hashing-Methode. (Beigetragen von Serhiy Storchaka in bpo-31664.)
Die Funktion mksalt() erlaubt nun die Angabe der Anzahl der Runden für das Hashing. (Beigetragen von Serhiy Storchaka in bpo-31702.)
datetime¶
Die neue Methode datetime.fromisoformat() erstellt ein datetime-Objekt aus einem String in einem der von datetime.isoformat() ausgegebenen Formate. (Beigetragen von Paul Ganssle in bpo-15873.)
Die Klasse tzinfo unterstützt nun Offset-Werte unterhalb einer Minute. (Beigetragen von Alexander Belopolsky in bpo-5288.)
dbm¶
dbm.dumb unterstützt nun das Lesen schreibgeschützter Dateien und schreibt die Indexdatei nicht mehr, wenn sie sich nicht geändert hat.
decimal¶
Das Modul decimal verwendet nun Kontextvariablen zum Speichern des Dezimalkontexts. (Beigetragen von Yury Selivanov in bpo-32630.)
dis¶
Die Funktion dis() kann nun verschachtelte Code-Objekte disassemblieren (den Code von Comprehensions, Generatorausdrücken und verschachtelten Funktionen sowie den Code, der zum Erstellen verschachtelter Klassen verwendet wird). Die maximale Tiefe der Disassemblierungsrekursion wird durch den neuen Parameter *depth* gesteuert. (Beigetragen von Serhiy Storchaka in bpo-11822.)
distutils¶
README.rst ist nun in der Liste der Standard-READMEs von distutils enthalten und somit in Quellcode-Distributionen. (Beigetragen von Ryan Gonzalez in bpo-11913.)
enum¶
Das Modul Enum hat die neue Klassen-Eigenschaft _ignore_ erhalten, die es erlaubt, die Namen von Eigenschaften aufzulisten, die keine Enum-Mitglieder werden sollen. (Beigetragen von Ethan Furman in bpo-31801.)
In Python 3.8 wird der Versuch, Nicht-Enum-Objekte in Enum-Klassen zu überprüfen, einen TypeError auslösen (z. B. 1 in Color); ebenso wird der Versuch, Nicht-Flag-Objekte in einem Flag-Mitglied zu überprüfen, einen TypeError auslösen (z. B. 1 in Perm.RW); derzeit geben beide Operationen stattdessen False zurück und sind veraltet. (Beigetragen von Ethan Furman in bpo-33217.)
functools¶
functools.singledispatch() unterstützt nun die Registrierung von Implementierungen mithilfe von Typ-Annotationen. (Beigetragen von Łukasz Langa in bpo-32227.)
gc¶
Die neue Funktion gc.freeze() ermöglicht das Einfrieren aller vom Garbage Collector verfolgten Objekte und deren Ausschluss von zukünftigen Sammlungen. Dies kann vor einem POSIX fork()-Aufruf verwendet werden, um den GC Copy-on-Write-freundlich zu machen oder die Sammlung zu beschleunigen. Die neuen Funktionen gc.unfreeze() kehren diese Operation um. Zusätzlich kann gc.get_freeze_count() verwendet werden, um die Anzahl der eingefrorenen Objekte zu ermitteln. (Beigetragen von Li Zekun in bpo-31558.)
hmac¶
Das Modul hmac verfügt nun über eine optimierte One-Shot-Funktion digest(), die bis zu dreimal schneller ist als HMAC(). (Beigetragen von Christian Heimes in bpo-32433.)
http.client¶
HTTPConnection und HTTPSConnection unterstützen nun das neue Argument *blocksize* für verbesserte Upload-Durchsätze. (Beigetragen von Nir Soffer in bpo-31945.)
http.server¶
SimpleHTTPRequestHandler unterstützt nun den HTTP-Header If-Modified-Since. Der Server gibt den Antwortstatus 304 zurück, wenn die Zieldatei nach dem im Header angegebenen Zeitpunkt nicht geändert wurde. (Beigetragen von Pierre Quentel in bpo-29654.)
SimpleHTTPRequestHandler akzeptiert zusätzlich zum neuen Kommandozeilenargument --directory das neue Argument *directory*. Mit diesem Parameter bedient der Server das angegebene Verzeichnis, standardmäßig wird das aktuelle Arbeitsverzeichnis verwendet. (Beigetragen von Stéphane Wirtel und Julien Palard in bpo-28707.)
Die neue Klasse ThreadingHTTPServer verwendet Threads zur Bearbeitung von Anfragen unter Verwendung von ThreadingMixIn. Sie wird verwendet, wenn http.server mit -m ausgeführt wird. (Beigetragen von Julien Palard in bpo-31639.)
idlelib und IDLE¶
Mehrere Korrekturen für die Autovervollständigung. (Beigetragen von Louie Lu in bpo-15786.)
Der Modulbrowser (im Menü Datei, früher Klassenbrowser genannt) zeigt nun verschachtelte Funktionen und Klassen zusätzlich zu Top-Level-Funktionen und -Klassen an. (Beigetragen von Guilherme Polo, Cheryl Sabella und Terry Jan Reedy in bpo-1612262.)
Der Dialog "Einstellungen" (Optionen, IDLE konfigurieren) wurde teilweise neu geschrieben, um sowohl das Aussehen als auch die Funktion zu verbessern. (Beigetragen von Cheryl Sabella und Terry Jan Reedy in mehreren Ausgaben.)
Die Schriftartprobe enthält jetzt eine Auswahl nicht-lateinischer Zeichen, damit Benutzer den Effekt der Auswahl einer bestimmten Schriftart besser erkennen können. (Beigetragen von Terry Jan Reedy in bpo-13802.) Die Probe kann bearbeitet werden, um andere Zeichen aufzunehmen. (Beigetragen von Serhiy Storchaka in bpo-31860.)
Die zuvor als Erweiterungen implementierten IDLE-Funktionen wurden als normale Funktionen neu implementiert. Ihre Einstellungen wurden vom Reiter "Erweiterungen" auf andere Dialogreiter verschoben. (Beigetragen von Charles Wohlganger und Terry Jan Reedy in bpo-27099.)
Option für den Codekontext des Editors überarbeitet. Die Box zeigt alle Kontextzeilen bis zu maxlines an. Das Klicken auf eine Kontextzeile springt zum Editor zu dieser Zeile. Kontextfarben für benutzerdefinierte Themen wurden dem Reiter "Hervorhebungen" des Einstellungsdialogs hinzugefügt. (Beigetragen von Cheryl Sabella und Terry Jan Reedy in bpo-33642, bpo-33768 und bpo-33679.)
Unter Windows teilt ein neuer API-Aufruf Windows mit, dass Tk für DPI skaliert. Unter Windows 8.1+ oder 10, mit unveränderten DPI-Kompatibilitätseigenschaften der Python-Binärdatei und einer Monitorauflösung größer als 96 DPI, sollten Text und Linien dadurch schärfer werden. Ansonsten sollte dies keine Auswirkungen haben. (Beigetragen von Terry Jan Reedy in bpo-33656.)
Neu in 3.7.1
Ausgaben über N Zeilen (standardmäßig 50) werden zu einem Button zusammengefasst. N kann im Abschnitt PyShell der Seite Allgemein im Einstellungsdialog geändert werden. Weniger, aber möglicherweise sehr lange Zeilen, können durch Rechtsklick auf die Ausgabe zusammengefasst werden. Zusammengefasste Ausgaben können durch Doppelklick auf den Button an Ort und Stelle oder in die Zwischenablage oder ein separates Fenster durch Rechtsklick auf den Button erweitert werden. (Beigetragen von Tal Einat in bpo-1529353.)
Die obigen Änderungen wurden in die Wartungs-Releases von 3.6 zurückportiert.
NEU in 3.7.4
Hinzugefügt: "Benutzerdefiniert ausführen" zum Menü "Ausführen", um ein Modul mit benutzerdefinierten Einstellungen auszuführen. Alle eingegebenen Kommandozeilenargumente werden zu sys.argv hinzugefügt. Sie erscheinen für die nächste benutzerdefinierte Ausführung wieder in der Box. Man kann auch den normalen Neustart des Shell-Hauptmoduls unterdrücken. (Beigetragen von Cheryl Sabella, Terry Jan Reedy und anderen in bpo-5680 und bpo-37627.)
Neu in 3.7.5
Hinzugefügt: Optionale Zeilennummern für IDLE-Editorfenster. Fenster öffnen ohne Zeilennummern, es sei denn, in der Registerkarte "Allgemein" des Konfigurationsdialogs ist etwas anderes eingestellt. Zeilennummern für ein bestehendes Fenster werden im Menü "Optionen" angezeigt und ausgeblendet. (Beigetragen von Tal Einat und Saimadhav Heblikar in bpo-17535.)
importlib¶
Die ABC importlib.abc.ResourceReader wurde eingeführt, um das Laden von Ressourcen aus Paketen zu unterstützen. Siehe auch importlib.resources. (Beigetragen von Barry Warsaw, Brett Cannon in bpo-32248.)
importlib.reload() löst jetzt ModuleNotFoundError aus, wenn dem Modul kein Spec fehlt. (Beigetragen von Garvit Khatri in bpo-29851.)
importlib.util.find_spec() löst jetzt ModuleNotFoundError anstelle von AttributeError aus, wenn das angegebene übergeordnete Modul kein Paket ist (d. h. kein Attribut __path__ hat). (Beigetragen von Milan Oberkirch in bpo-30436.)
Die neue Funktion importlib.util.source_hash() kann verwendet werden, um den Hash des übergebenen Quellcodes zu berechnen. Eine Hash-basierte .pyc-Datei bettet den von dieser Funktion zurückgegebenen Wert ein.
io¶
Die neue Methode TextIOWrapper.reconfigure() kann verwendet werden, um den Textstream mit den neuen Einstellungen neu zu konfigurieren. (Beigetragen von Antoine Pitrou in bpo-30526 und INADA Naoki in bpo-15216.)
ipaddress¶
Die neuen Methoden subnet_of() und supernet_of() von ipaddress.IPv6Network und ipaddress.IPv4Network können für Netzwerk-Containment-Tests verwendet werden. (Beigetragen von Michel Albert und Cheryl Sabella in bpo-20825.)
itertools¶
itertools.islice() akzeptiert nun integer-ähnliche Objekte als Start-, Stopp- und Slice-Argumente. (Beigetragen von Will Roberts in bpo-30537.)
locale¶
Das neue Argument monetary für locale.format_string() kann verwendet werden, um die Umwandlung mit geldbezogenen Tausendertrennzeichen und Gruppierungszeichen zu erzielen. (Beigetragen von Garvit in bpo-10379.)
Die Funktion locale.getpreferredencoding() gibt nun immer 'UTF-8' unter Android oder im Erzwungenen UTF-8-Modus zurück.
logging¶
Instanzen von Logger können nun ge-pickelt werden. (Beigetragen von Vinay Sajip in bpo-30520.)
Die neue Methode StreamHandler.setStream() kann verwendet werden, um den Logger-Stream nach der Handler-Erstellung zu ersetzen. (Beigetragen von Vinay Sajip in bpo-30522.)
Es ist nun möglich, Schlüsselwortargumente für Handler-Konstruktoren in der Konfiguration anzugeben, die an logging.config.fileConfig() übergeben wird. (Beigetragen von Preston Landers in bpo-31080.)
math¶
Die neue Funktion math.remainder() implementiert die IEEE 754-Restoperation. (Beigetragen von Mark Dickinson in bpo-29962.)
mimetypes¶
Der MIME-Typ von .bmp wurde von 'image/x-ms-bmp' zu 'image/bmp' geändert. (Beigetragen von Nitish Chandra in bpo-22589.)
msilib¶
Die neue Methode Database.Close() kann verwendet werden, um die MSI-Datenbank zu schließen. (Beigetragen von Berker Peksag in bpo-20486.)
multiprocessing¶
Die neue Methode Process.close() schließt das Prozessobjekt explizit und gibt alle damit verbundenen Ressourcen frei. ValueError wird ausgelöst, wenn der zugrunde liegende Prozess noch läuft. (Beigetragen von Antoine Pitrou in bpo-30596.)
Die neue Methode Process.kill() kann verwendet werden, um den Prozess mit dem Signal SIGKILL unter Unix zu beenden. (Beigetragen von Vitor Pereira in bpo-30794.)
Nicht-daemon-Threads, die von Process erstellt wurden, werden nun beim Prozessende mit `join()` verbunden. (Beigetragen von Antoine Pitrou in bpo-18966.)
os¶
os.fwalk() akzeptiert nun das Argument path als bytes. (Beigetragen von Serhiy Storchaka in bpo-28682.)
os.scandir() hat Unterstützung für Dateideskriptoren erhalten. (Beigetragen von Serhiy Storchaka in bpo-25996.)
Die neue Funktion register_at_fork() ermöglicht die Registrierung von Python-Callbacks, die bei einem Prozess-Fork ausgeführt werden sollen. (Beigetragen von Antoine Pitrou in bpo-16500.)
Hinzugefügt wurden die Funktionen os.preadv() (kombiniert die Funktionalität von os.readv() und os.pread()) und os.pwritev() (kombiniert die Funktionalität von os.writev() und os.pwrite()). (Beigetragen von Pablo Galindo in bpo-31368.)
Das Argument mode von os.makedirs() beeinflusst nicht mehr die Dateiberechtigungsbits von neu erstellten Zwischenverzeichnissen. (Beigetragen von Serhiy Storchaka in bpo-19930.)
os.dup2() gibt nun den neuen Dateideskriptor zurück. Zuvor wurde immer None zurückgegeben. (Beigetragen von Benjamin Peterson in bpo-32441.)
Die von os.stat() zurückgegebene Struktur enthält nun das Attribut st_fstype unter Solaris und seinen Derivaten. (Beigetragen von Jesús Cea Avión in bpo-32659.)
pathlib¶
Die neue Methode Path.is_mount() ist nun unter POSIX-Systemen verfügbar und kann verwendet werden, um zu bestimmen, ob ein Pfad ein Einhängepunkt ist. (Beigetragen von Cooper Ry Lees in bpo-30897.)
pdb¶
pdb.set_trace() nimmt nun ein optionales Schlüsselwortargument header entgegen. Wenn angegeben, wird es kurz vor Beginn des Debuggings auf der Konsole ausgegeben. (Beigetragen von Barry Warsaw in bpo-31389.)
Die Kommandozeile von pdb akzeptiert nun -m module_name als Alternative zur Skriptdatei. (Beigetragen von Mario Corchero in bpo-32206.)
py_compile¶
py_compile.compile() – und damit auch compileall – respektiert nun die Umgebungsvariable SOURCE_DATE_EPOCH, indem es bedingungslos .pyc-Dateien für Hash-basierte Validierung erstellt. Dies ermöglicht die Gewährleistung reproduzierbarer Builds von .pyc-Dateien, wenn diese frühzeitig erstellt werden. (Beigetragen von Bernhard M. Wiedemann in bpo-29708.)
pydoc¶
Der pydoc-Server kann nun an einen beliebigen Hostnamen gebunden werden, der durch das neue Kommandozeilenargument -n angegeben wird. (Beigetragen von Feanil Patel in bpo-31128.)
queue¶
Die neue Klasse SimpleQueue ist eine unbegrenzte FIFO-Warteschlange. (Beigetragen von Antoine Pitrou in bpo-14976.)
re¶
Die Flags re.ASCII, re.LOCALE und re.UNICODE können innerhalb des Geltungsbereichs einer Gruppe gesetzt werden. (Beigetragen von Serhiy Storchaka in bpo-31690.)
re.split() unterstützt nun das Aufteilen anhand von Mustern wie r'\b', '^$' oder (?=-), die eine leere Zeichenkette matchen. (Beigetragen von Serhiy Storchaka in bpo-25054.)
Reguläre Ausdrücke, die mit dem Flag re.LOCALE kompiliert wurden, hängen nicht mehr vom Locale zur Kompilierungszeit ab. Locale-Einstellungen werden nur angewendet, wenn der kompilierte reguläre Ausdruck verwendet wird. (Beigetragen von Serhiy Storchaka in bpo-30215.)
FutureWarning wird nun ausgegeben, wenn ein regulärer Ausdruck Zeichenmengenkonstrukte enthält, die sich in Zukunft semantisch ändern werden, wie z. B. verschachtelte Mengen und Mengenoperationen. (Beigetragen von Serhiy Storchaka in bpo-30349.)
Kompilierte reguläre Ausdrücke und Match-Objekte können nun mit copy.copy() und copy.deepcopy() kopiert werden. (Beigetragen von Serhiy Storchaka in bpo-10076.)
signal¶
Das neue Argument warn_on_full_buffer für die Funktion signal.set_wakeup_fd() ermöglicht es zu bestimmen, ob Python eine Warnung auf stderr ausgibt, wenn der Wakeup-Puffer überläuft. (Beigetragen von Nathaniel J. Smith in bpo-30050.)
socket¶
Die neue Methode socket.getblocking() gibt True zurück, wenn der Socket im Blockierungsmodus ist, und False andernfalls. (Beigetragen von Yury Selivanov in bpo-32373.)
Die neue Funktion socket.close() schließt den übergebenen Socket-Dateideskriptor. Diese Funktion sollte anstelle von os.close() verwendet werden, um die Kompatibilität zwischen den Plattformen zu verbessern. (Beigetragen von Christian Heimes in bpo-32454.)
Das Modul socket gibt nun die Konstanten socket.TCP_CONGESTION (Linux 2.6.13), socket.TCP_USER_TIMEOUT (Linux 2.6.37) und socket.TCP_NOTSENT_LOWAT (Linux 3.12) preis. (Beigetragen von Omar Sandoval in bpo-26273 und Nathaniel J. Smith in bpo-29728.)
Unterstützung für socket.AF_VSOCK-Sockets wurde hinzugefügt, um die Kommunikation zwischen virtuellen Maschinen und ihren Hosts zu ermöglichen. (Beigetragen von Cathy Avery in bpo-27584.)
Sockets erkennen nun standardmäßig Familie, Typ und Protokoll aus dem Dateideskriptor. (Beigetragen von Christian Heimes in bpo-28134.)
socketserver¶
socketserver.ThreadingMixIn.server_close wartet nun, bis alle nicht-Daemon-Threads abgeschlossen sind. socketserver.ForkingMixIn.server_close wartet nun, bis alle Kindprozesse abgeschlossen sind.
Hinzugefügt wurde ein neues Klassenattribut socketserver.ForkingMixIn.block_on_close zu den Klassen socketserver.ForkingMixIn und socketserver.ThreadingMixIn. Setzen Sie das Klassenattribut auf False, um das Verhalten vor 3.7 zu erhalten.
sqlite3¶
sqlite3.Connection gibt nun die Methode backup() preis, wenn die zugrunde liegende SQLite-Bibliothek die Version 3.6.11 oder höher hat. (Beigetragen von Lele Gaifax in bpo-27645.)
Das Argument database von sqlite3.connect() akzeptiert nun jedes pfadähnliche Objekt anstelle nur eines Strings. (Beigetragen von Anders Lorentsen in bpo-31843.)
ssl¶
Das Modul ssl verwendet nun die eingebaute API von OpenSSL anstelle von match_hostname(), um einen Hostnamen oder eine IP-Adresse zu überprüfen. Werte werden während des TLS-Handshakes validiert. Jeder Zertifikatvalidierungsfehler, einschließlich des Fehlschlagens der Hostnamenprüfung, löst nun SSLCertVerificationError aus und bricht den Handshake mit einer entsprechenden TLS-Alarmmeldung ab. Die neue Ausnahme enthält zusätzliche Informationen. Die Hostnamenvalidierung kann mit SSLContext.hostname_checks_common_name angepasst werden. (Beigetragen von Christian Heimes in bpo-31399.)
Hinweis
Die verbesserte Hostnamenprüfung erfordert eine libssl-Implementierung, die mit OpenSSL 1.0.2 oder 1.1 kompatibel ist. Folglich werden OpenSSL 0.9.8 und 1.0.1 nicht mehr unterstützt (siehe Plattformunterstützungsentfernungen für weitere Details). Das ssl-Modul ist weitgehend kompatibel mit LibreSSL 2.7.2 und neuer.
Das Modul ssl sendet keine IP-Adressen mehr in der SNI-TLS-Erweiterung. (Beigetragen von Christian Heimes in bpo-32185.)
match_hostname() unterstützt keine partiellen Wildcards wie www*.example.org mehr. (Beigetragen von Mandeep Singh in bpo-23033 und Christian Heimes in bpo-31399.)
Die Standard-Cipher-Suite-Auswahl des Moduls ssl verwendet nun einen Blacklist-Ansatz anstelle einer hartcodierten Whitelist. Python reaktiviert keine Cipher mehr, die von OpenSSL-Sicherheitsupdates blockiert wurden. Die Standard-Cipher-Suite-Auswahl kann zur Kompilierungszeit konfiguriert werden. (Beigetragen von Christian Heimes in bpo-31429.)
Die Validierung von Serverzertifikaten, die internationalisierte Domainnamen (IDNs) enthalten, wird nun unterstützt. Als Teil dieser Änderung speichert das Attribut SSLSocket.server_hostname den erwarteten Hostnamen nun im A-Label-Format ("xn--pythn-mua.org") anstelle des U-Label-Formats ("pythön.org"). (Beigetragen von Nathaniel J. Smith und Christian Heimes in bpo-28414.)
Das Modul ssl hat eine vorläufige und experimentelle Unterstützung für TLS 1.3 und OpenSSL 1.1.1. Zum Zeitpunkt der Veröffentlichung von Python 3.7.0 befand sich OpenSSL 1.1.1 noch in der Entwicklung und TLS 1.3 war noch nicht fertiggestellt. Der TLS 1.3-Handshake und das Protokoll verhalten sich geringfügig anders als TLS 1.2 und früher, siehe TLS 1.3. (Beigetragen von Christian Heimes in bpo-32947, bpo-20995, bpo-29136, bpo-30622 und bpo-33618)
SSLSocket und SSLObject haben keinen öffentlichen Konstruktor mehr. Direkte Instanziierung war nie eine dokumentierte und unterstützte Funktion. Instanzen müssen mit den Methoden SSLContext wrap_socket() und wrap_bio() erstellt werden. (Beigetragen von Christian Heimes in bpo-32951)
OpenSSL 1.1 APIs zum Setzen der minimalen und maximalen TLS-Protokollversion sind als SSLContext.minimum_version und SSLContext.maximum_version verfügbar. Unterstützte Protokolle werden durch mehrere neue Flags angezeigt, wie z.B. HAS_TLSv1_1. (Beigetragen von Christian Heimes in bpo-32609.)
Hinzugefügt: ssl.SSLContext.post_handshake_auth zum Aktivieren und ssl.SSLSocket.verify_client_post_handshake() zum Initiieren der TLS 1.3 Post-Handshake-Authentifizierung. (Beigetragen von Christian Heimes in gh-78851.)
string¶
string.Template erlaubt es nun, das reguläre Ausdrucksmuster für geschweifte Platzhalter und nicht geschweifte Platzhalter separat optional zu ändern. (Beigetragen von Barry Warsaw in bpo-1198569.)
subprocess¶
Die Funktion subprocess.run() akzeptiert das neue Schlüsselwortargument capture_output. Wenn es wahr ist, werden stdout und stderr erfasst. Dies ist äquivalent zur Übergabe von subprocess.PIPE als stdout- und stderr-Argumente. (Beigetragen von Bo Bayles in bpo-32102.)
Die Funktion subprocess.run und der Konstruktor subprocess.Popen akzeptieren jetzt das Schlüsselwortargument text als Alias für universal_newlines. (Beigetragen von Andrew Clegg in bpo-31756.)
Unter Windows wurde der Standardwert für close_fds von False auf True geändert, wenn die Standard-Handles umgeleitet wurden. Es ist jetzt möglich, close_fds auf true zu setzen, wenn die Standard-Handles umgeleitet werden. Siehe subprocess.Popen. Das bedeutet, dass close_fds auf allen unterstützten Plattformen jetzt standardmäßig True ist. (Beigetragen von Segev Finer in bpo-19764.)
Das Modul subprocess geht nun besser mit KeyboardInterrupt während subprocess.call(), subprocess.run() oder im Popen Kontext-Manager um. Es wartet nun eine kurze Zeit, bis das Kind beendet ist, bevor die Behandlung der KeyboardInterrupt Ausnahme fortgesetzt wird. (Beigetragen von Gregory P. Smith in bpo-25942.)
sys¶
Der neue Hook sys.breakpointhook() wird von der integrierten Funktion breakpoint() aufgerufen. (Beigetragen von Barry Warsaw in bpo-31353.)
Unter Android gibt sys.getandroidapilevel() die Android-API-Version zur Build-Zeit zurück. (Beigetragen von Victor Stinner in bpo-28740.)
Die neue Funktion sys.get_coroutine_origin_tracking_depth() gibt die aktuelle Tiefe des Koroutinen-Ursprungs-Trackings zurück, wie sie von der neuen Funktion sys.set_coroutine_origin_tracking_depth() gesetzt wird. asyncio wurde konvertiert, um diese neue API anstelle des veralteten sys.set_coroutine_wrapper() zu verwenden. (Beigetragen von Nathaniel J. Smith in bpo-32591.)
time¶
PEP 564 fügt dem Modul time sechs neue Funktionen mit Nanosekundenauflösung hinzu
Neue Täter-Identifikatoren wurden hinzugefügt
time.CLOCK_BOOTTIME(Linux): Identisch mittime.CLOCK_MONOTONIC, außer dass es auch die Zeit einschließt, in der das System ausgesetzt war.time.CLOCK_PROF(FreeBSD, NetBSD und OpenBSD): Hochauflösender CPU-Timer pro Prozess.time.CLOCK_UPTIME(FreeBSD, OpenBSD): Zeit, deren absoluter Wert die Laufzeit des Systems ohne Unterbrechung ist, was eine genaue Messung der Laufzeit ermöglicht.
Die neuen Funktionen time.thread_time() und time.thread_time_ns() können verwendet werden, um CPU-Zeitmessungen pro Thread zu erhalten. (Beigetragen von Antoine Pitrou in bpo-32025.)
Die neue Funktion time.pthread_getcpuclockid() gibt die Clock-ID der threadspezifischen CPU-Zeit-Clock zurück.
tkinter¶
Die neue Klasse tkinter.ttk.Spinbox ist jetzt verfügbar. (Beigetragen von Alan Moore in bpo-32585.)
tracemalloc¶
tracemalloc.Traceback verhält sich stärker wie normale Tracebacks und sortiert die Frames vom ältesten zum neuesten. Traceback.format() akzeptiert jetzt negative limit-Werte, wodurch das Ergebnis auf die abs(limit) ältesten Frames gekürzt wird. Um das alte Verhalten zu erhalten, verwenden Sie das neue Argument most_recent_first für Traceback.format(). (Beigetragen von Jesse Bakker in bpo-32121.)
types¶
Die neuen Klassen WrapperDescriptorType, MethodWrapperType, MethodDescriptorType und ClassMethodDescriptorType sind jetzt verfügbar. (Beigetragen von Manuel Krebber und Guido van Rossum in bpo-29377 und Serhiy Storchaka in bpo-32265.)
Die neue Funktion types.resolve_bases() löst MRO-Einträge dynamisch auf, wie in PEP 560 spezifiziert. (Beigetragen von Ivan Levkivskyi in bpo-32717.)
unicodedata¶
Die interne Datenbank unicodedata wurde auf Unicode 11 aktualisiert. (Beigetragen von Benjamin Peterson.)
unittest¶
Die neue Kommandozeilenoption -k ermöglicht das Filtern von Tests nach einem Namenssubstring oder einem Unix-Shell-ähnlichen Muster. Zum Beispiel führt python -m unittest -k foo foo_tests.SomeTest.test_something, bar_tests.SomeTest.test_foo aus, aber nicht bar_tests.FooTest.test_something. (Beigetragen von Jonas Haag in bpo-32071.)
unittest.mock¶
Die Attribute von sentinel behalten ihre Identität bei, wenn sie kopiert oder gepickelt werden. (Beigetragen von Serhiy Storchaka in bpo-20804.)
Die neue Funktion seal() erlaubt das Versiegeln von Mock-Instanzen, was die weitere Erstellung von Attribut-Mocks verhindert. Das Siegel wird rekursiv auf alle Attribute angewendet, die selbst Mocks sind. (Beigetragen von Mario Corchero in bpo-30541.)
urllib.parse¶
urllib.parse.quote() wurde von RFC 2396 auf RFC 3986 aktualisiert. Dabei wird ~ zur Menge der Zeichen hinzugefügt, die standardmäßig nie maskiert werden. (Beigetragen von Christian Theune und Ratnadeep Debnath in bpo-16285.)
uu¶
Die Funktion uu.encode() akzeptiert jetzt ein optionales Schlüsselwortargument backtick. Wenn es wahr ist, werden Nullen durch '`' anstelle von Leerzeichen dargestellt. (Beigetragen von Xiang Zhang in bpo-30103.)
uuid¶
Das neue Attribut UUID.is_safe gibt Informationen von der Plattform darüber weiter, ob generierte UUIDs mit einer Multiprocessing-sicheren Methode generiert werden. (Beigetragen von Barry Warsaw in bpo-22807.)
uuid.getnode() bevorzugt jetzt universell verwaltete MAC-Adressen gegenüber lokal verwalteten MAC-Adressen. Dies gibt eine bessere Garantie für die globale Einzigartigkeit von UUIDs, die von uuid.uuid1() zurückgegeben werden. Wenn nur lokal verwaltete MAC-Adressen verfügbar sind, wird die erste gefundene zurückgegeben. (Beigetragen von Barry Warsaw in bpo-32107.)
warnings¶
Die Initialisierung der Standard-Warnungsfilter wurde wie folgt geändert
Warnungen, die über Kommandozeilenoptionen aktiviert werden (einschließlich derer für
-bund der neuen CPython-spezifischen Option-Xdev), werden immer über das Attributsys.warnoptionsan die Warnungsmechanismen weitergegeben.Warnungsfilter, die über die Kommandozeile oder die Umgebung aktiviert werden, haben nun die folgende Reihenfolge der Vorrangigkeit
der
BytesWarning-Filter für-b(oder-bb)alle mit der Option
-Wangegebenen Filteralle mit der Umgebungsvariable
PYTHONWARNINGSangegebenen Filteralle anderen CPython-spezifischen Filter (z.B. der
default-Filter, der für den neuen Modus-X devhinzugefügt wurde)alle impliziten Filter, die direkt von den Warnungsmechanismen definiert werden
in CPython Debug-Builds werden standardmäßig alle Warnungen angezeigt (die implizite Filterliste ist leer)
(Beigetragen von Nick Coghlan und Victor Stinner in bpo-20361, bpo-32043 und bpo-32230.)
Deprecation-Warnungen werden in Single-File-Skripten und an der interaktiven Eingabeaufforderung wieder standardmäßig angezeigt. Weitere Details finden Sie in PEP 565: Show DeprecationWarning in __main__. (Beigetragen von Nick Coghlan in bpo-31975.)
xml¶
Als Abhilfemaßnahme gegen die Abfrage von DTDs und externen Entitäten verarbeiten die Module xml.dom.minidom und xml.sax standardmäßig keine externen Entitäten mehr. (Beigetragen von Christian Heimes in gh-61441.)
xml.etree¶
ElementPath-Prädikate in den find()-Methoden können nun den Text des aktuellen Knotens mit [. = "text"] vergleichen, nicht nur den Text in Kindern. Prädikate erlauben auch das Hinzufügen von Leerzeichen zur besseren Lesbarkeit. (Beigetragen von Stefan Behnel in bpo-31648.)
xmlrpc.server¶
SimpleXMLRPCDispatcher.register_function() kann jetzt als Dekorator verwendet werden. (Beigetragen von Xiang Zhang in bpo-7769.)
zipapp¶
Die Funktion create_archive() akzeptiert jetzt ein optionales filter-Argument, damit der Benutzer auswählen kann, welche Dateien in das Archiv aufgenommen werden sollen. (Beigetragen von Irmen de Jong in bpo-31072.)
Die Funktion create_archive() akzeptiert jetzt ein optionales compressed-Argument, um ein komprimiertes Archiv zu erstellen. Eine Kommandozeilenoption --compress wurde ebenfalls hinzugefügt, um die Komprimierung zu unterstützen. (Beigetragen von Zhiming Wang in bpo-31638.)
zipfile¶
ZipFile akzeptiert jetzt den neuen Parameter compresslevel zur Steuerung der Komprimierungsstufe. (Beigetragen von Bo Bayles in bpo-21417.)
Unterverzeichnisse in Archiven, die von ZipFile erstellt wurden, werden jetzt alphabetisch sortiert gespeichert. (Beigetragen von Bernhard M. Wiedemann in bpo-30693.)
C-API-Änderungen¶
Eine neue API für thread-lokalen Speicher wurde implementiert. Siehe PEP 539: New C API for Thread-Local Storage für einen Überblick und Thread Specific Storage (TSS) API für eine vollständige Referenz. (Beigetragen von Masayuki Yamamoto in bpo-25658.)
Die neue Funktionalität Kontextvariablen stellt eine Reihe von neuen C-APIs zur Verfügung.
Die neue Funktion PyImport_GetModule() gibt das zuvor importierte Modul mit dem angegebenen Namen zurück. (Beigetragen von Eric Snow in bpo-28411.)
Das Makro Py_RETURN_RICHCOMPARE erleichtert das Schreiben von Rich-Comparison-Funktionen. (Beigetragen von Petr Victorin in bpo-23699.)
Das Makro Py_UNREACHABLE kann verwendet werden, um unerreichbare Code-Pfade zu markieren. (Beigetragen von Barry Warsaw in bpo-31338.)
Das Modul tracemalloc stellt jetzt eine C-API über die neuen Funktionen PyTraceMalloc_Track() und PyTraceMalloc_Untrack() bereit. (Beigetragen von Victor Stinner in bpo-30054.)
Die neuen statischen Marker import__find__load__start und import__find__load__done können zur Nachverfolgung von Modulimporten verwendet werden. (Beigetragen von Christian Heimes in bpo-31574.)
Die Felder name und doc der Strukturen PyMemberDef, PyGetSetDef, PyStructSequence_Field, PyStructSequence_Desc und wrapperbase sind nun vom Typ const char * und nicht von char *. (Beigetragen von Serhiy Storchaka in bpo-28761.)
Das Ergebnis von PyUnicode_AsUTF8AndSize() und PyUnicode_AsUTF8() ist nun vom Typ const char * und nicht von char *. (Beigetragen von Serhiy Storchaka in bpo-28769.)
Das Ergebnis von PyMapping_Keys(), PyMapping_Values() und PyMapping_Items() ist nun immer eine Liste, anstatt einer Liste oder eines Tupels. (Beigetragen von Oren Milman in bpo-28280.)
Hinzugefügte Funktionen PySlice_Unpack() und PySlice_AdjustIndices(). (Beigetragen von Serhiy Storchaka in bpo-27867.)
PyOS_AfterFork() ist zugunsten der neuen Funktionen PyOS_BeforeFork(), PyOS_AfterFork_Parent() und PyOS_AfterFork_Child() veraltet. (Beigetragen von Antoine Pitrou in bpo-16500.)
Das Singleton PyExc_RecursionErrorInst, das Teil der öffentlichen API war, wurde entfernt, da seine Mitglieder nie gelöscht wurden und beim Abschalten des Interpreters zu einem Segfault führen können. Beigetragen von Xavier de Gaye in bpo-22898 und bpo-30697.
C-API-Unterstützung für Zeitzonen hinzugefügt mit Zeitzonenkonstruktoren PyTimeZone_FromOffset() und PyTimeZone_FromOffsetAndName() und Zugriff auf das UTC-Singleton mit PyDateTime_TimeZone_UTC. Beigetragen von Paul Ganssle in bpo-10381.
Der Typ der Ergebnisse von PyThread_start_new_thread() und PyThread_get_thread_ident() sowie der Parameter id von PyThreadState_SetAsyncExc() wurde von long auf unsigned long geändert. (Beigetragen von Serhiy Storchaka in bpo-6532.)
PyUnicode_AsWideCharString() löst nun einen ValueError aus, wenn das zweite Argument NULL ist und die wchar_t*-Zeichenkette Nullzeichen enthält. (Beigetragen von Serhiy Storchaka in bpo-30708.)
Änderungen an der Startsequenz und der Verwaltung von dynamischen Speicherallokatoren bedeuten, dass die lange dokumentierte Anforderung, Py_Initialize() vor dem Aufruf der meisten C-API-Funktionen aufzurufen, nun stärker in Anspruch genommen wird. Nichteinhaltung kann zu Segfaults in eingebetteten Anwendungen führen. Weitere Details finden Sie im Abschnitt Porting to Python 3.7 in diesem Dokument und im Abschnitt Before Python Initialization in der C-API-Dokumentation.
Die neue Funktion PyInterpreterState_GetID() gibt die eindeutige ID für einen gegebenen Interpreter zurück. (Beigetragen von Eric Snow in bpo-29102.)
Py_DecodeLocale() und Py_EncodeLocale() verwenden nun die UTF-8-Kodierung, wenn der UTF-8-Modus aktiviert ist. (Beigetragen von Victor Stinner in bpo-29240.)
PyUnicode_DecodeLocaleAndSize() und PyUnicode_EncodeLocale() verwenden nun die aktuelle Locale-Kodierung für den Fehlerbehandler surrogateescape. (Beigetragen von Victor Stinner in bpo-29240.)
Die Parameter start und end von PyUnicode_FindChar() werden nun angepasst, um wie String-Slices zu funktionieren. (Beigetragen von Xiang Zhang in bpo-28822.)
Build-Änderungen¶
Die Unterstützung für den Build --without-threads wurde entfernt. Das Modul threading ist nun immer verfügbar. (Beigetragen von Antoine Pitrou in bpo-31370.)
Eine vollständige Kopie von libffi wird nicht mehr für die Verwendung beim Erstellen des Moduls _ctypes auf Nicht-OSX-UNIX-Plattformen gebündelt. Eine installierte Kopie von libffi ist nun erforderlich, wenn _ctypes auf solchen Plattformen erstellt wird. (Beigetragen von Zachary Ware in bpo-27979.)
Der Windows-Buildprozess hängt nicht mehr von Subversion ab, um externe Quellen einzubinden. Ein Python-Skript wird verwendet, um stattdessen Zip-Dateien von GitHub herunterzuladen. Wenn Python 3.6 nicht im System gefunden wird (über py -3.6), wird NuGet verwendet, um eine Kopie von 32-Bit-Python für diesen Zweck herunterzuladen. (Beigetragen von Zachary Ware in bpo-30450.)
Das Modul ssl erfordert OpenSSL 1.0.2 oder 1.1 kompatibles libssl. OpenSSL 1.0.1 hat das Lebensende am 2016-12-31 erreicht und wird nicht mehr unterstützt. LibreSSL wird vorübergehend ebenfalls nicht unterstützt. LibreSSL-Releases bis Version 2.6.4 fehlen erforderliche OpenSSL 1.0.2 APIs.
Optimierungen¶
Der Overhead beim Aufruf vieler Methoden verschiedener Standardbibliotheksklassen, die in C implementiert sind, wurde durch die Portierung von mehr Code zur Verwendung der METH_FASTCALL Konvention erheblich reduziert. (Beigetragen von Victor Stinner in bpo-29300, bpo-29507, bpo-29452 und bpo-29286.)
Verschiedene Optimierungen haben die Startzeit von Python unter Linux um 10 % und unter macOS um bis zu 30 % reduziert. (Beigetragen von Victor Stinner, INADA Naoki in bpo-29585 und Ivan Levkivskyi in bpo-31333.)
Methodenaufrufe sind nun bis zu 20 % schneller, dank Änderungen im Bytecode, die die Erstellung von gebundenen Methodeninstanzen vermeiden. (Beigetragen von Yury Selivanov und INADA Naoki in bpo-26110.)
Das Modul asyncio hat eine Reihe von bemerkenswerten Optimierungen für häufig verwendete Funktionen erhalten.
Die Funktion
asyncio.get_event_loop()wurde in C neu implementiert, um sie bis zu 15-mal schneller zu machen. (Beigetragen von Yury Selivanov in bpo-32296.)Das Callback-Management von
asyncio.Futurewurde optimiert. (Beigetragen von Yury Selivanov in bpo-32348.)asyncio.gather()ist nun bis zu 15 % schneller. (Beigetragen von Yury Selivanov in bpo-32355.)asyncio.sleep()ist nun bis zu 2-mal schneller, wenn das Argument delay null oder negativ ist. (Beigetragen von Andrew Svetlov in bpo-32351.)Der Performance-Overhead des asyncio-Debug-Modus wurde reduziert. (Beigetragen von Antoine Pitrou in bpo-31970.)
Als Ergebnis der Arbeit an PEP 560 wurde die Importzeit von typing um den Faktor 7 reduziert, und viele Typoperationen sind nun schneller. (Beigetragen von Ivan Levkivskyi in bpo-32226.)
sorted() und list.sort() wurden für gängige Fälle optimiert und sind nun bis zu 40-75 % schneller. (Beigetragen von Elliot Gorokhovsky in bpo-28685.)
dict.copy() ist nun bis zu 5,5-mal schneller. (Beigetragen von Yury Selivanov in bpo-31179.)
hasattr() und getattr() sind nun etwa 4-mal schneller, wenn name nicht gefunden wird und obj object.__getattr__() oder object.__getattribute__() nicht überschreibt. (Beigetragen von INADA Naoki in bpo-32544.)
Die Suche nach bestimmten Unicode-Zeichen (wie dem ukrainischen Großbuchstaben „Є“) in einer Zeichenkette war bis zu 25-mal langsamer als die Suche nach anderen Zeichen. Sie ist nun im schlimmsten Fall nur noch 3-mal langsamer. (Beigetragen von Serhiy Storchaka in bpo-24821.)
Die Fabrik collections.namedtuple() wurde neu implementiert, um die Erstellung von benannten Tupeln 4- bis 6-mal schneller zu machen. (Beigetragen von Jelle Zijlstra mit weiteren Verbesserungen von INADA Naoki, Serhiy Storchaka und Raymond Hettinger in bpo-28638.)
datetime.date.fromordinal() und datetime.date.fromtimestamp() sind im gängigen Fall nun bis zu 30 % schneller. (Beigetragen von Paul Ganssle in bpo-32403.)
Die Funktion os.fwalk() ist nun dank der Verwendung von os.scandir() bis zu 2-mal schneller. (Beigetragen von Serhiy Storchaka in bpo-25996.)
Die Geschwindigkeit der Funktion shutil.rmtree() wurde dank der Verwendung der Funktion os.scandir() um 20–40 % verbessert. (Beigetragen von Serhiy Storchaka in bpo-28564.)
Optimierte case-insensitive Suche und Abgleich von regulären Ausdrücken. Die Suche nach bestimmten Mustern kann nun bis zu 20-mal schneller sein. (Beigetragen von Serhiy Storchaka in bpo-30285.)
re.compile() wandelt nun den Parameter flags in ein int-Objekt um, wenn es sich um RegexFlag handelt. Es ist nun so schnell wie Python 3.5 und etwa 10 % schneller als Python 3.6, abhängig vom Muster. (Beigetragen von INADA Naoki in bpo-31671.)
Die Methoden modify() der Klassen selectors.EpollSelector, selectors.PollSelector und selectors.DevpollSelector können unter starker Last etwa 10 % schneller sein. (Beigetragen von Giampaolo Rodola’ in bpo-30014)
Constant Folding wurde vom Peephole Optimizer zum neuen AST Optimizer verschoben, der Optimierungen konsistenter durchführen kann. (Beigetragen von Eugene Toder und INADA Naoki in bpo-29469 und bpo-11549.)
Die meisten Funktionen und Methoden in abc wurden in C neu geschrieben. Dies macht die Erstellung von abstrakten Basisklassen und das Aufrufen von isinstance() und issubclass() darauf 1,5-mal schneller. Dies reduziert auch die Python-Startzeit um bis zu 10 %. (Beigetragen von Ivan Levkivskyi und INADA Naoki in bpo-31333)
Erhebliche Geschwindigkeitsverbesserungen für alternative Konstruktoren für datetime.date und datetime.datetime durch die Verwendung von Fast-Path-Konstruktoren, wenn keine Unterklassen konstruiert werden. (Beigetragen von Paul Ganssle in bpo-32403)
Die Geschwindigkeit des Vergleichs von Instanzen von array.array wurde in bestimmten Fällen erheblich verbessert. Sie ist nun 10- bis 70-mal schneller beim Vergleich von Arrays, die Werte desselben Ganzzahltyps enthalten. (Beigetragen von Adrian Wielgosik in bpo-24700.)
Die Funktionen math.erf() und math.erfc() verwenden nun die (schnellere) C-Bibliotheksimplementierung auf den meisten Plattformen. (Beigetragen von Serhiy Storchaka in bpo-26121.)
Weitere Änderungen an der CPython-Implementierung¶
Trace-Hooks können nun den Empfang von
line-Ereignissen vom Interpreter ablehnen und stattdessenopcode-Ereignisse empfangen, indem die entsprechenden neuen Attributef_trace_linesundf_trace_opcodesim zu verfolgenden Frame gesetzt werden. (Beigetragen von Nick Coghlan in bpo-31344.)Einige Konsistenzprobleme mit Namespace-Paket-Modulattributen wurden behoben. Namespace-Modulobjekte haben nun eine
__file__, die aufNonegesetzt ist (zuvor nicht gesetzt), und ihr__spec__.originist ebenfalls aufNonegesetzt (zuvor der String"namespace"). Siehe bpo-32305. Außerdem ist der__spec__.loaderdes Namespace-Modulobjekts auf denselben Wert wie__loader__gesetzt (zuvor war ersteres aufNonegesetzt). Siehe bpo-32303.Das Wörterbuch
locals()zeigt nun die lexikalische Reihenfolge an, in der Variablen definiert wurden. Zuvor war die Reihenfolge undefiniert. (Beigetragen von Raymond Hettinger in bpo-32690.)Der
distutilsuploadBefehl versucht nicht mehr, CR-Zeilenenden in CRLF umzuwandeln. Dies behebt ein Korruptionsproblem bei sdists, die mit einem Byte endeten, das CR entspricht. (Beigetragen von Bo Bayles in bpo-32304.)
Veraltetes Python-Verhalten¶
Yield-Ausdrücke (sowohl yield als auch yield from Klauseln) sind nun in Comprehensions und Generatorausdrücken veraltet (außer dem iterierbaren Ausdruck in der äußersten for Klausel). Dies stellt sicher, dass Comprehensions immer sofort einen Container des entsprechenden Typs zurückgeben (anstatt potenziell ein Generator-Iterator-Objekt zurückzugeben), während Generatorausdrücke nicht versuchen, ihre implizite Ausgabe mit der Ausgabe von expliziten Yield-Ausdrücken zu vermischen. In Python 3.7 geben solche Ausdrücke eine DeprecationWarning aus, wenn sie kompiliert werden, in Python 3.8 wird dies ein SyntaxError sein. (Beigetragen von Serhiy Storchaka in bpo-10544.)
Die Rückgabe einer Unterklasse von complex aus object.__complex__() ist veraltet und wird in zukünftigen Python-Versionen ein Fehler sein. Dies macht __complex__() konsistent mit object.__int__() und object.__float__(). (Beigetragen von Serhiy Storchaka in bpo-28894.)
Veraltete Python-Module, Funktionen und Methoden¶
aifc¶
aifc.openfp() ist veraltet und wird in Python 3.9 entfernt. Verwenden Sie stattdessen aifc.open(). (Beigetragen von Brian Curtin in bpo-31985.)
asyncio¶
Die direkte await-Nutzung von Instanzen von asyncio.Lock und anderen asyncio-Synchronisationsprimitiven ist veraltet. Ein asynchroner Kontextmanager muss verwendet werden, um die Synchronisationsressource zu erwerben und freizugeben. (Beigetragen von Andrew Svetlov in bpo-32253.)
Die Methoden asyncio.Task.current_task() und asyncio.Task.all_tasks() sind veraltet. (Beigetragen von Andrew Svetlov in bpo-32250.)
collections¶
In Python 3.8 werden die abstrakten Basisklassen in collections.abc nicht mehr im regulären Modul collections verfügbar sein. Dies wird dazu beitragen, eine klarere Unterscheidung zwischen den konkreten Klassen und den abstrakten Basisklassen zu schaffen. (Beigetragen von Serhiy Storchaka in bpo-25988.)
dbm¶
dbm.dumb unterstützt nun das Lesen von schreibgeschützten Dateien und schreibt die Indexdatei nicht mehr, wenn sie nicht geändert wurde. Eine Verwarnung bezüglich der Veralterung wird nun ausgegeben, wenn die Indexdatei fehlt und im Modus 'r' und 'w' neu erstellt wird (dies wird in zukünftigen Python-Versionen ein Fehler sein). (Beigetragen von Serhiy Storchaka in bpo-28847.)
enum¶
In Python 3.8 löst der Versuch, Nicht-Enum-Objekte in Enum-Klassen zu überprüfen, einen TypeError aus (z. B. 1 in Color); ebenso löst der Versuch, Nicht-Flag-Objekte in einem Flag-Mitglied zu überprüfen, einen TypeError aus (z. B. 1 in Perm.RW); derzeit geben beide Operationen stattdessen False zurück. (Beigetragen von Ethan Furman in bpo-33217.)
gettext¶
Die Verwendung eines nicht-ganzzahligen Werts zur Auswahl einer Pluralform in gettext ist nun veraltet. Es hat nie korrekt funktioniert. (Beigetragen von Serhiy Storchaka in bpo-28692.)
importlib¶
Die Methoden MetaPathFinder.find_module() (ersetzt durch MetaPathFinder.find_spec()) und PathEntryFinder.find_loader() (ersetzt durch PathEntryFinder.find_spec()), die beide in Python 3.4 als veraltet gekennzeichnet wurden, geben nun eine DeprecationWarning aus. (Beigetragen von Matthias Bussonnier in bpo-29576.)
Die importlib.abc.ResourceLoader ABC ist zugunsten von importlib.abc.ResourceReader veraltet.
locale¶
locale.format() ist veraltet, verwenden Sie stattdessen locale.format_string(). (Beigetragen von Garvit in bpo-10379.)
macpath¶
Das Modul macpath ist nun veraltet und wird in Python 3.8 entfernt. (Beigetragen von Chi Hsuan Yen in bpo-9850.)
threading¶
Die Module dummy_threading und _dummy_thread sind veraltet. Es ist nicht mehr möglich, Python mit deaktiviertem Threading zu erstellen. Verwenden Sie stattdessen threading. (Beigetragen von Antoine Pitrou in bpo-31370.)
socket¶
Die stille Argumentwert-Abschneidung in socket.htons() und socket.ntohs() ist veraltet. In zukünftigen Versionen von Python wird eine Ausnahme ausgelöst, wenn das übergebene Argument größer als 16 Bits ist. (Beigetragen von Oren Milman in bpo-28332.)
ssl¶
ssl.wrap_socket() ist veraltet. Verwenden Sie stattdessen ssl.SSLContext.wrap_socket(). (Beigetragen von Christian Heimes in bpo-28124.)
sunau¶
sunau.openfp() ist veraltet und wird in Python 3.9 entfernt. Verwenden Sie stattdessen sunau.open(). (Beigetragen von Brian Curtin in bpo-31985.)
sys¶
Die Funktionen sys.set_coroutine_wrapper() und sys.get_coroutine_wrapper() sind veraltet.
Die undokumentierte Funktion sys.callstats() ist veraltet und wird in einer zukünftigen Python-Version entfernt. (Beigetragen von Victor Stinner in bpo-28799.)
wave¶
wave.openfp() ist veraltet und wird in Python 3.9 entfernt. Verwenden Sie stattdessen wave.open(). (Beigetragen von Brian Curtin in bpo-31985.)
Veraltete Funktionen und Typen der C-API¶
Die Funktion PySlice_GetIndicesEx() ist veraltet und wird durch ein Makro ersetzt, wenn Py_LIMITED_API nicht gesetzt ist oder einen Wert im Bereich zwischen 0x03050400 und 0x03060000 (nicht inklusive) hat, oder 0x03060100 oder höher ist. (Beigetragen von Serhiy Storchaka in bpo-27867.)
PyOS_AfterFork() ist veraltet. Verwenden Sie stattdessen PyOS_BeforeFork(), PyOS_AfterFork_Parent() oder PyOS_AfterFork_Child(). (Beigetragen von Antoine Pitrou in bpo-16500.)
Entfernung von Plattformunterstützung¶
FreeBSD 9 und älter werden nicht mehr offiziell unterstützt.
Für vollständige Unicode-Unterstützung, auch innerhalb von Erweiterungsmodulen, wird von *nix-Plattformen nun erwartet, dass sie mindestens eine der folgenden Optionen bereitstellen:
C.UTF-8(vollständige Locale),C.utf8(vollständige Locale) oderUTF-8(LC_CTYPE-only Locale) als Alternative zur Legacy-basiertenASCIIC-Locale.OpenSSL 0.9.8 und 1.0.1 werden nicht mehr unterstützt, was bedeutet, dass das Erstellen von CPython 3.7 mit SSL/TLS-Unterstützung auf älteren Plattformen, die diese Versionen immer noch verwenden, benutzerdefinierte Build-Optionen erfordert, die auf eine neuere Version von OpenSSL verlinkt sind.
Insbesondere betrifft dieses Problem die Debian 8 (aka „jessie“) und Ubuntu 14.04 (aka „Trusty“) LTS Linux-Distributionen, da diese standardmäßig immer noch OpenSSL 1.0.1 verwenden.
Debian 9 („stretch“) und Ubuntu 16.04 („xenial“) sowie neuere Versionen anderer LTS-Linux-Distributionen (z. B. RHEL/CentOS 7.5, SLES 12-SP3) verwenden OpenSSL 1.0.2 oder höher und bleiben in der Standard-Build-Konfiguration unterstützt.
Die CI-Konfigurationsdatei von CPython selbst bietet ein Beispiel für die Verwendung der SSL-Kompatibilitäts-Testinfrastruktur in der Testsuite von CPython, um gegen OpenSSL 1.1.0 anstelle eines veralteten, vom System bereitgestellten OpenSSL zu kompilieren und zu verknüpfen. Siehe die Konfigurationsdatei des Travis CI-Builds.
Entfernung von APIs und Features¶
Die folgenden Funktionen und APIs wurden aus Python 3.7 entfernt
Die Funktion
os.stat_float_times()wurde entfernt. Sie wurde in Python 2.3 zur Abwärtskompatibilität mit Python 2.2 eingeführt und war seit Python 3.1 veraltet.Unbekannte Escape-Sequenzen, die aus
'\'und einem ASCII-Buchstaben in Ersatzvorlagen fürre.sub()bestehen, wurden in Python 3.5 als veraltet markiert und führen nun zu einem Fehler.Die Unterstützung für das Argument exclude in
tarfile.TarFile.add()wurde entfernt. Es war in Python 2.7 und 3.2 veraltet. Verwenden Sie stattdessen das Argument filter.Die Funktion
ntpath.splitunc()wurde in Python 3.1 als veraltet markiert und nun entfernt. Verwenden Sie stattdessensplitdrive().collections.namedtuple()unterstützt nicht mehr den Parameter verbose oder das Attribut_source, das den generierten Quellcode für die benannte Tupelklasse anzeigte. Dies war Teil einer Optimierung zur Beschleunigung der Klassenerstellung. (Beigetragen von Jelle Zijlstra mit weiteren Verbesserungen von INADA Naoki, Serhiy Storchaka und Raymond Hettinger in bpo-28638.)Die Funktionen
bool(),float(),list()undtuple()akzeptieren keine Schlüsselwortargumente mehr. Das erste Argument vonint()kann nur noch als positionsgebundenes Argument übergeben werden.Die in Python 2.4 als veraltet markierten Klassen
Plist,Dictund_InternalDictim Modulplistlibwurden entfernt. Dictionary-Werte im Ergebnis der FunktionenreadPlist()undreadPlistFromBytes()sind nun normale Dictionaries. Sie können nicht mehr über den Attributzugriff auf diese Dictionaries zugreifen.Die Funktion
asyncio.windows_utils.socketpair()wurde entfernt. Verwenden Sie stattdessen die Funktionsocket.socketpair(), die seit Python 3.5 auf allen Plattformen verfügbar ist.asyncio.windows_utils.socketpairwar lediglich ein Alias fürsocket.socketpairab Python 3.5.asyncioexportiert die Moduleselectorsund_overlappednicht mehr alsasyncio.selectorsundasyncio._overlapped. Ersetzen Siefrom asyncio import selectorsdurchimport selectors.Die direkte Instanziierung von
ssl.SSLSocketundssl.SSLObjectObjekten ist nun verboten. Die Konstruktoren waren nie dokumentiert, getestet oder als öffentliche Konstruktoren konzipiert. Benutzer solltenssl.wrap_socket()oderssl.SSLContextverwenden. (Beigetragen von Christian Heimes in bpo-32951.)Der ungenutzte Befehl
install_miscvondistutilswurde entfernt. (Beigetragen von Eric N. Vander Weele in bpo-29218.)
Modulentfernungen¶
Das Modul fpectl wurde entfernt. Es wurde nie standardmäßig aktiviert, funktionierte auf x86-64 nie korrekt und änderte die Python-ABI auf eine Weise, die zu unerwarteten Brüchen bei C-Erweiterungen führte. (Beigetragen von Nathaniel J. Smith in bpo-29137.)
Änderungen nur für Windows¶
Der Python-Launcher (py.exe) kann 32- und 64-Bit-Spezifizierer akzeptieren, **ohne** auch eine Nebenversion angeben zu müssen. So werden py -3-32 und py -3-64 gültig, ebenso wie py -3.7-32. Auch die Formen -m-64 und -m.n-64 werden jetzt akzeptiert, um 64-Bit-Python zu erzwingen, auch wenn sonst 32-Bit verwendet worden wäre. Wenn die angegebene Version nicht verfügbar ist, wird py.exe mit einem Fehler beendet. (Beigetragen von Steve Barnes in bpo-30291.)
Der Launcher kann als py -0 ausgeführt werden, um eine Liste der installierten Pythons zu erzeugen, *wobei die Standardversion mit einem Sternchen gekennzeichnet ist*. Die Ausführung von py -0p schließt die Pfade ein. Wenn py mit einem Versionsspezifizierer ausgeführt wird, der nicht übereinstimmen kann, wird auch die *Kurzform*-Liste der verfügbaren Spezifizierer ausgegeben. (Beigetragen von Steve Barnes in bpo-30362.)
Portierung auf Python 3.7¶
Dieser Abschnitt listet zuvor beschriebene Änderungen und weitere Fehlerbehebungen auf, die möglicherweise Änderungen an Ihrem Code erfordern.
Änderungen im Python-Verhalten¶
asyncundawaitsind jetzt reservierte Schlüsselwörter. Code, der diese Namen als Bezeichner verwendet, löst nun einenSyntaxErroraus. (Beigetragen von Jelle Zijlstra in bpo-30406.)asyncundawaitsind nun reservierte Schlüsselwörter. Code, der diese Namen als Bezeichner verwendet, löst nun einenSyntaxErroraus. (PEP 479 ist für allen Code in Python 3.7 aktiviert, was bedeutet, dassStopIteration-Ausnahmen, die direkt oder indirekt in Coroutinen und Generatoren ausgelöst werden, inRuntimeError-Ausnahmen umgewandelt werden. (Beigetragen von Yury Selivanov in bpo-32670.)object.__aiter__()Methoden können nicht mehr als asynchron deklariert werden. (Beigetragen von Yury Selivanov in bpo-31709.)Aufgrund eines Versehen akzeptierten frühere Python-Versionen irrtümlich die folgende Syntax
f(1 for x in [1],) class C(1 for x in [1]): pass
Python 3.7 löst nun korrekt einen
SyntaxErroraus, da ein Generator-Ausdruck immer direkt in Klammern stehen muss und keine Kommas auf beiden Seiten haben kann, und die Duplizierung der Klammern nur bei Aufrufen weggelassen werden kann. (Beigetragen von Serhiy Storchaka in bpo-32012 und bpo-32023.)Bei Verwendung des Schalters
-mwird nun das anfängliche Arbeitsverzeichnis zusys.pathhinzugefügt, anstelle eines leeren Strings (der dynamisch das aktuelle Arbeitsverzeichnis zum Zeitpunkt jedes Imports bezeichnete). Programme, die nach dem leeren String suchen oder sich anderweitig auf das frühere Verhalten verlassen, müssen entsprechend aktualisiert werden (z. B. indem sie auch nachos.getcwd()oderos.path.dirname(__main__.__file__)suchen, je nachdem, warum der Code überhaupt nach dem leeren String gesucht hat).
Änderungen in der Python-API¶
socketserver.ThreadingMixIn.server_closewartet nun, bis alle Nicht-Daemon-Threads abgeschlossen sind. Setzen Sie das neue Klassenattributsocketserver.ThreadingMixIn.block_on_closeaufFalse, um das Verhalten vor Python 3.7 beizubehalten. (Beigetragen von Victor Stinner in bpo-31233 und bpo-33540.)socketserver.ForkingMixIn.server_closewartet nun, bis alle Kindprozesse abgeschlossen sind. Setzen Sie das neue Klassenattributsocketserver.ForkingMixIn.block_on_closeaufFalse, um das Verhalten vor Python 3.7 beizubehalten. (Beigetragen von Victor Stinner in bpo-31151 und bpo-33540.)Die Funktion
locale.localeconv()setzt in einigen Fällen temporär dieLC_CTYPE-Lokalisierung auf den Wert vonLC_NUMERIC. (Beigetragen von Victor Stinner in bpo-31900.)pkgutil.walk_packages()löst nun einenValueErroraus, wenn path ein String ist. Zuvor wurde eine leere Liste zurückgegeben. (Beigetragen von Sanyam Khurana in bpo-24744.)Ein Format-String-Argument für
string.Formatter.format()ist nun positionsgebunden. Die Übergabe als Schlüsselwortargument war seit Python 3.5 veraltet. (Beigetragen von Serhiy Storchaka in bpo-29193.)Die Attribute
key,valueundcoded_valueder Klassehttp.cookies.Morselsind nun schreibgeschützt. Die Zuweisung zu ihnen war seit Python 3.5 veraltet. Verwenden Sie die Methodeset()zum Setzen. (Beigetragen von Serhiy Storchaka in bpo-29192.)Das Argument mode von
os.makedirs()beeinflusst nicht mehr die Dateiberechtigungsbits neu erstellter Zwischenverzeichnisse. Um deren Dateiberechtigungsbits zu setzen, können Sie umask setzen, bevor Siemakedirs()aufrufen. (Beigetragen von Serhiy Storchaka in bpo-19930.)Der Typ von
struct.Struct.formatist nunstrstattbytes. (Beigetragen von Victor Stinner in bpo-21071.)cgi.parse_multipart()akzeptiert nun die Argumente encoding und errors und liefert dieselben Ergebnisse wieFieldStorage: für Nicht-Datei-Felder ist der einer Taste zugeordnete Wert eine Liste von Strings, nicht Bytes. (Beigetragen von Pierre Quentel in bpo-29979.)Aufgrund interner Änderungen in
socketist der Aufruf vonsocket.fromshare()auf einem Socket, der vonsocket.sharein älteren Python-Versionen erstellt wurde, nicht mehr unterstützt.reprfürBaseExceptionwurde geändert, um das nachgestellte Komma nicht mehr einzuschließen. Die meisten Ausnahmen sind von dieser Änderung betroffen. (Beigetragen von Serhiy Storchaka in bpo-30399.)reprfürdatetime.timedeltawurde geändert, um die Schlüsselwortargumente in der Ausgabe einzuschließen. (Beigetragen von Utkarsh Upadhyay in bpo-30302.)Da
shutil.rmtree()nun unter Verwendung der Funktionos.scandir()implementiert ist, wird der vom Benutzer angegebene Handler onerror nun mit dem ersten Argumentos.scandiranstelle vonos.listdiraufgerufen, wenn das Auflisten des Verzeichnisses fehlschlägt.Unterstützung für verschachtelte Mengen und Mengenoperationen in regulären Ausdrücken gemäß Unicode Technical Standard #18 könnte in Zukunft hinzugefügt werden. Dies würde die Syntax ändern. Um diese zukünftige Änderung zu erleichtern, wird vorübergehend eine
FutureWarningin mehrdeutigen Fällen ausgegeben. Dies umfasst Mengen, die mit einem literalen'['beginnen oder literale Zeichenfolgen wie'--','&&','~~'und'||'enthalten. Um eine Warnung zu vermeiden, escapen Sie diese mit einem Backslash. (Beigetragen von Serhiy Storchaka in bpo-30349.)Das Ergebnis des Teilens eines Strings anhand eines
regulären Ausdrucks, der mit einer leeren Zeichenkette übereinstimmen kann, wurde geändert. Zum Beispiel wird beim Teilen mitr'\s*'nun nicht nur wie zuvor bei Whitespaces, sondern auch bei leeren Strings vor allen Nicht-Whitespace-Zeichen und direkt vor dem Ende des Strings geteilt. Das frühere Verhalten kann durch Änderung des Musters zur'\s+'wiederhergestellt werden. Seit Python 3.5 wurde für solche Muster eineFutureWarningausgegeben.Für Muster, die sowohl leere als auch nicht-leere Zeichenketten abgleichen, kann das Ergebnis der Suche nach allen Übereinstimmungen auch in anderen Fällen geändert sein. Zum Beispiel in der Zeichenkette
'a\n\n'gleicht das Musterr'(?m)^\s*?$'nicht nur leere Zeichenketten an den Positionen 2 und 3 ab, sondern auch die Zeichenkette'\n'an den Positionen 2–3. Um nur leere Zeilen abzugleichen, sollte das Muster zur'(?m)^[^\S\n]*$'umgeschrieben werden.re.sub()ersetzt nun leere Übereinstimmungen, die an eine vorherige nicht-leere Übereinstimmung angrenzen. Zum Beispiel gibtre.sub('x*', '-', 'abxd')nun'-a-b--d-'anstelle von'-a-b-d-'zurück (der erste Bindestrich zwischen ‘b’ und ‘d’ ersetzt ‘x’, und der zweite Bindestrich ersetzt eine leere Zeichenkette zwischen ‘x’ und ‘d’).(Beigetragen von Serhiy Storchaka in bpo-25054 und bpo-32308.)
Änderung von
re.escape(), um nur Regex-Sonderzeichen zu escapen, anstatt aller Zeichen außer ASCII-Buchstaben, Zahlen und'_'zu escapen. (Beigetragen von Serhiy Storchaka in bpo-29995.)tracemalloc.TracebackFrames werden nun vom ältesten zum neuesten sortiert, um konsistenter mittracebackzu sein. (Beigetragen von Jesse Bakker in bpo-32121.)Auf Betriebssystemen, die
socket.SOCK_NONBLOCKodersocket.SOCK_CLOEXECBit-Flags unterstützen, werden diesocket.typediese nicht mehr angewendet. Daher funktionieren Prüfungen wieif sock.type == socket.SOCK_STREAMauf allen Plattformen wie erwartet. (Beigetragen von Yury Selivanov in bpo-32331.)Unter Windows wurde der Standardwert für das Argument close_fds von
subprocess.PopenvonFalseaufTruegeändert, wenn die Standard-Handles umgeleitet werden. Wenn Sie sich zuvor darauf verlassen haben, dass Handles bei Verwendung vonsubprocess.Popenmit Standard-I/O-Umleitung vererbt werden, müssen Sieclose_fds=Falseübergeben, um das frühere Verhalten beizubehalten, oderSTARTUPINFO.lpAttributeListverwenden.importlib.machinery.PathFinder.invalidate_caches()– was sich implizit aufimportlib.invalidate_caches()auswirkt – löscht nun Einträge insys.path_importer_cache, die aufNonegesetzt sind. (Beigetragen von Brett Cannon in bpo-33169.)In
asynciowurdenloop.sock_recv(),loop.sock_sendall(),loop.sock_accept(),loop.getaddrinfo(),loop.getnameinfo()geändert, um ordnungsgemäße Coroutine-Methoden zu sein, die ihrer Dokumentation entsprechen. Zuvor gaben diese Methodenasyncio.Future-Instanzen zurück. (Beigetragen von Yury Selivanov in bpo-32327.)asyncio.Server.socketsgibt nun eine Kopie der internen Liste der Server-Sockets zurück, anstatt sie direkt zurückzugeben. (Beigetragen von Yury Selivanov in bpo-32662.)Struct.formatist nun einestr-Instanz statt einerbytes-Instanz. (Beigetragen von Victor Stinner in bpo-21071.)In
argparsekönnen Unterparser nun als obligatorisch gekennzeichnet werden, indemrequired=TrueanArgumentParser.add_subparsers()übergeben wird. (Beigetragen von Anthony Sottile in bpo-26510.)ast.literal_eval()ist jetzt strenger. Addition und Subtraktion von beliebigen Zahlen sind nicht mehr erlaubt. (Beigetragen von Serhiy Storchaka in bpo-31778.)Calendar.itermonthdateswird nun konsistent eine Ausnahme auslösen, wenn ein Datum außerhalb des Bereichs0001-01-01bis9999-12-31liegt. Um Anwendungen zu unterstützen, die solche Ausnahmen nicht tolerieren können, können die neuen MethodenCalendar.itermonthdays3undCalendar.itermonthdays4verwendet werden. Die neuen Methoden geben Tupel zurück und sind nicht durch den vondatetime.dateunterstützten Bereich eingeschränkt. (Beigetragen von Alexander Belopolsky in bpo-28292.)collections.ChainMapbehält nun die Reihenfolge der zugrunde liegenden Abbildungen bei. (Beigetragen von Raymond Hettinger in bpo-32792.)Die Methode
submit()vonconcurrent.futures.ThreadPoolExecutorundconcurrent.futures.ProcessPoolExecutorlöst nun eineRuntimeErroraus, wenn sie während des Herunterfahrens des Interpreters aufgerufen wird. (Beigetragen von Mark Nemec in bpo-33097.)Der Konstruktor von
configparser.ConfigParserverwendet nunread_dict()zur Verarbeitung der Standardwerte, wodurch sein Verhalten mit dem Rest des Parsers konsistent wird. Nicht-Zeichenketten-Schlüssel und -Werte im Standardwörterbuch werden nun implizit in Zeichenketten konvertiert. (Beigetragen von James Tocknell in bpo-23835.)Mehrere undokumentierte interne Importe wurden entfernt. Ein Beispiel ist, dass
os.errnonicht mehr verfügbar ist; verwenden Sie stattdessen direktimport errno. Beachten Sie, dass solche undokumentierten internen Importe jederzeit und ohne Vorankündigung entfernt werden können, auch in Mikroversionen.
Änderungen in der C-API¶
Die Funktion PySlice_GetIndicesEx() gilt als unsicher für resizable Sequenzen. Wenn die Slice-Indizes keine Instanzen von int sind, sondern Objekte, die die Methode __index__() implementieren, kann die Sequenz nach der Übergabe ihrer Länge an PySlice_GetIndicesEx() resizet werden. Dies kann dazu führen, dass Indizes außerhalb der Länge der Sequenz zurückgegeben werden. Um mögliche Probleme zu vermeiden, verwenden Sie die neuen Funktionen PySlice_Unpack() und PySlice_AdjustIndices(). (Beigetragen von Serhiy Storchaka in bpo-27867.)
CPython Bytecode-Änderungen¶
Es gibt zwei neue Opcodes: LOAD_METHOD und CALL_METHOD. (Beigetragen von Yury Selivanov und INADA Naoki in bpo-26110.)
Der Opcode STORE_ANNOTATION wurde entfernt. (Beigetragen von Mark Shannon in bpo-32550.)
Änderungen nur für Windows¶
Die Datei, die zum Überschreiben von sys.path verwendet wird, heißt nun <python-executable>._pth anstelle von 'sys.path'. Weitere Informationen finden Sie unter Module finden. (Beigetragen von Steve Dower in bpo-28137.)
Weitere Änderungen an der CPython-Implementierung¶
In Vorbereitung auf mögliche zukünftige Änderungen an der öffentlichen CPython-Runtime-Initialisierungs-API (siehe PEP 432 für einen ersten, aber etwas veralteten Entwurf) wurde die interne Start- und Konfigurationsverwaltungslogik von CPython erheblich refaktoriert. Obwohl diese Aktualisierungen sowohl für eingebettete Anwendungen als auch für Benutzer der regulären CPython CLI vollständig transparent sein sollen, werden sie hier erwähnt, da die Refaktorisierung die interne Reihenfolge verschiedener Operationen während des Interpreterstarts ändert und daher zuvor latente Fehler aufdecken kann, sei es in eingebetteten Anwendungen oder in CPython selbst. (Ursprünglich von Nick Coghlan und Eric Snow als Teil von bpo-22257 beigetragen und von Nick, Eric und Victor Stinner in einer Reihe anderer Ausgaben weiter aktualisiert). Einige bekannte betroffene Details
PySys_AddWarnOptionUnicode()kann von eingebetteten Anwendungen derzeit nicht verwendet werden, da vor dem Aufruf vonPy_Initializeein Unicode-Objekt erstellt werden muss. Verwenden Sie stattdessenPySys_AddWarnOption().Warnungsfilter, die von einer eingebetteten Anwendung mit
PySys_AddWarnOption()hinzugefügt werden, sollten nun konsistenter Vorrang vor den Standardfiltern des Interpreters haben.
Aufgrund von Änderungen an der Art und Weise, wie die Standard-Warnungsfilter konfiguriert werden, reicht es nicht mehr aus, Py_BytesWarningFlag auf einen Wert größer als eins zu setzen, um sowohl BytesWarning-Nachrichten auszugeben als auch sie in Ausnahmen umzuwandeln. Stattdessen muss das Flag gesetzt werden (damit die Warnungen überhaupt ausgegeben werden) und ein expliziter error::BytesWarning-Warnungsfilter hinzugefügt werden, um sie in Ausnahmen umzuwandeln.
Aufgrund einer Änderung in der Art und Weise, wie Docstrings vom Compiler behandelt werden, wird das implizite return None in einem Funktionskörper, der nur aus einem Docstring besteht, nun auf derselben Zeile wie der Docstring markiert, nicht auf der Header-Zeile der Funktion.
Der aktuelle Ausnahmezustand wurde vom Frame-Objekt zum Koroutinen verschoben. Dies vereinfachte den Interpreter und behob einige obskure Fehler, die durch das Vertauschen von Ausnahmezuständen beim Ein- oder Austritt aus einem Generator verursacht wurden. (Beigetragen von Mark Shannon in bpo-25612.)
Bemerkenswerte Änderungen in Python 3.7.1¶
Ab 3.7.1 liest und respektiert Py_Initialize() nun konsistent alle gleichen Umgebungseinstellungen wie Py_Main() (in früheren Python-Versionen respektierte es eine schlecht definierte Teilmenge dieser Umgebungsvariablen, während es in Python 3.7.0 aufgrund von bpo-34247 keine von ihnen las). Wenn dieses Verhalten unerwünscht ist, setzen Sie Py_IgnoreEnvironmentFlag vor dem Aufruf von Py_Initialize() auf 1.
In 3.7.1 wurde die C-API für Kontextvariablen aktualisiert, um PyObject-Zeiger zu verwenden. Siehe auch bpo-34762.
In 3.7.1 gibt das Modul tokenize nun implizit ein NEWLINE-Token aus, wenn es mit Eingaben versorgt wird, die keine abschließende neue Zeile haben. Dieses Verhalten entspricht nun dem, was der C-Tokenizer intern tut. (Beigetragen von Ammar Askar in bpo-33899.)
Bemerkenswerte Änderungen in Python 3.7.2¶
venv unter Windows kopiert ab 3.7.2 nicht mehr die ursprünglichen Binärdateien, sondern erstellt stattdessen Redirector-Skripte namens python.exe und pythonw.exe. Dies löst ein langjähriges Problem, bei dem alle virtuellen Umgebungen mit jeder Python-Aktualisierung aktualisiert oder neu erstellt werden mussten. Beachten Sie jedoch, dass diese Version immer noch die Neuerstellung von virtuellen Umgebungen erfordert, um die neuen Skripte zu erhalten.
Bemerkenswerte Änderungen in Python 3.7.6¶
Aufgrund erheblicher Sicherheitsbedenken wird der Parameter reuse_address von asyncio.loop.create_datagram_endpoint() nicht mehr unterstützt. Dies liegt am Verhalten der Socket-Option SO_REUSEADDR in UDP. Weitere Details finden Sie in der Dokumentation für loop.create_datagram_endpoint(). (Beigetragen von Kyle Stanley, Antoine Pitrou und Yury Selivanov in bpo-37228.)
Bemerkenswerte Änderungen in Python 3.7.10¶
Frühere Python-Versionen erlaubten sowohl ; als auch & als Trennzeichen für Abfrageparameter in urllib.parse.parse_qs() und urllib.parse.parse_qsl(). Aus Sicherheitsgründen und zur Einhaltung neuerer W3C-Empfehlungen wurde dies geändert, um nur ein einziges Trennzeichen zuzulassen, wobei & der Standard ist. Diese Änderung betrifft auch cgi.parse() und cgi.parse_multipart(), da sie 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.)
Bemerkenswerte Änderungen in Python 3.7.11¶
Ein Sicherheitsupdate ändert das Verhalten von ftplib.FTP, so dass die IPv4-Adresse, die vom Remote-Server beim Einrichten eines passiven Datenkanals gesendet wird, nicht mehr vertraut wird. Stattdessen wird die IP-Adresse des FTP-Servers wiederverwendet. Für ungewöhnlichen Code, der das alte Verhalten erfordert, setzen Sie ein Attribut trust_server_pasv_ipv4_address auf Ihrer FTP-Instanz auf True. (Siehe gh-87451)
Das Vorhandensein von Zeilenumbruch- oder Tabulatorzeichen in Teilen einer URL ermöglicht bestimmte Arten von Angriffen. Gemäß der WHATWG-Spezifikation, die RFC 3986 aktualisiert, werden ASCII-Zeilenumbruchszeichen \n, \r und Tabulatorzeichen \t von der Parser urllib.parse() aus der URL entfernt, wodurch solche Angriffe verhindert werden. Die zu entfernenden Zeichen werden durch eine neue Modulvariable urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE gesteuert. (Siehe gh-88048)
Bemerkenswerte Sicherheitsfunktion in 3.7.14¶
Die Konvertierung zwischen int und str in anderen Basen als 2 (binär), 4, 8 (oktal), 16 (hexadezimal) oder 32, wie z. B. Basis 10 (dezimal), löst nun einen ValueError aus, wenn die Anzahl der Ziffern in Zeichenkettenform über einem Limit liegt, um potenzielle Denial-of-Service-Angriffe aufgrund der algorithmischen Komplexität zu vermeiden. Dies ist eine Abhilfemaßnahme für CVE 2020-10735. Dieses Limit kann durch Umgebungsvariablen, Kommandozeilenargumente oder sys-APIs konfiguriert oder deaktiviert werden. Siehe die Dokumentation integer string conversion length limitation. Das Standardlimit beträgt 4300 Ziffern in Zeichenkettenform.