Neues in Python 3.6

Herausgeber:

Elvis Pranskevichus <elvis@magic.io>, Yury Selivanov <yury@magic.io>

Dieser Artikel erklärt die neuen Funktionen in Python 3.6 im Vergleich zu 3.5. Python 3.6 wurde am 23. Dezember 2016 veröffentlicht. Eine vollständige Liste der Änderungen finden Sie im Changelog.

Siehe auch

PEP 494 - Python 3.6 Release Schedule

Zusammenfassung – Release-Highlights

Neue Syntaxfunktionen

  • PEP 498, formatierte String-Literale.

  • PEP 515, Unterstriche in numerischen Literalen.

  • PEP 526, Syntax für Variablenannotationen.

  • PEP 525, asynchrone Generatoren.

  • PEP 530: asynchrone Comprehensions.

Neue Bibliotheksmodule

CPython-Implementierungsverbesserungen

Signifikante Verbesserungen in der Standardbibliothek

  • Das Modul asyncio hat neue Funktionen, erhebliche Usability- und Performance-Verbesserungen sowie eine beträchtliche Anzahl von Fehlerbehebungen erhalten. Ab Python 3.6 ist das Modul asyncio nicht mehr provisorisch und seine API gilt als stabil.

  • Ein neues Dateisystempfad-Protokoll wurde implementiert, um pfadähnliche Objekte zu unterstützen. Alle Standardbibliotheksfunktionen, die auf Pfade angewendet werden, wurden aktualisiert, um mit dem neuen Protokoll zu arbeiten.

  • Das Modul datetime hat Unterstützung für die Mehrdeutigkeit von Ortszeit erhalten.

  • Das Modul typing hat eine Reihe von Verbesserungen erhalten.

  • Das Modul tracemalloc wurde erheblich überarbeitet und wird nun verwendet, um eine bessere Ausgabe für ResourceWarning zu liefern und bessere Diagnosen für Speicherallokationsfehler bereitzustellen. Weitere Informationen finden Sie im Abschnitt PYTHONMALLOC.

Sicherheitsverbesserungen

  • Das neue Modul secrets wurde hinzugefügt, um die Erzeugung kryptographisch starker Pseudozufallszahlen für die Verwaltung von Geheimnissen wie Kontoauthentifizierung, Token und ähnlichem zu vereinfachen.

  • Unter Linux blockiert os.urandom() nun, bis der System-Urandom-Entropiepool initialisiert ist, um die Sicherheit zu erhöhen. Weitere Informationen zur Begründung finden Sie in PEP 524.

  • Die Module hashlib und ssl unterstützen nun OpenSSL 1.1.0.

  • Die Standardeinstellungen und der Funktionsumfang des Moduls ssl wurden verbessert.

  • Das Modul hashlib erhielt Unterstützung für die Hash-Algorithmen BLAKE2, SHA-3 und SHAKE sowie die Key-Derivation-Funktion scrypt().

Windows-Verbesserungen

  • PEP 528 und PEP 529, Windows-Dateisystem- und Konsolenkodierung auf UTF-8 geändert.

  • Der py.exe Launcher bevorzugt bei interaktiver Nutzung nicht mehr Python 2 gegenüber Python 3, wenn der Benutzer keine Version angibt (über Kommandozeilenargumente oder eine Konfigurationsdatei). Die Behandlung von Shebang-Zeilen bleibt unverändert – „python“ bezieht sich in diesem Fall auf Python 2.

  • python.exe und pythonw.exe wurden als "long-path aware" markiert, was bedeutet, dass das Pfadlimit von 260 Zeichen möglicherweise nicht mehr gilt. Weitere Details finden Sie unter Entfernen der MAX_PATH-Beschränkung.

  • Eine Datei ._pth kann hinzugefügt werden, um den isolierten Modus zu erzwingen und alle Suchpfade vollständig anzugeben, um Registry- und Umgebungsabfragen zu vermeiden. Weitere Informationen finden Sie in der Dokumentation.

  • Die Datei python36.zip funktioniert nun als Landmarke, um PYTHONHOME abzuleiten. Weitere Informationen finden Sie in der Dokumentation.

Neue Funktionen

PEP 498: Formatierte String-Literale

PEP 498 führt eine neue Art von String-Literalen ein: *f-Strings* oder formatierte String-Literale.

Formatierte String-Literale werden mit 'f' eingeleitet und ähneln den Format-Strings, die von str.format() akzeptiert werden. Sie enthalten Ersetzungsfelder, die von geschweiften Klammern umschlossen sind. Die Ersetzungsfelder sind Ausdrücke, die zur Laufzeit ausgewertet und dann mit dem format()-Protokoll formatiert werden.

>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}"  # nested fields
'result:      12.35'

Siehe auch

PEP 498 – Literal String Interpolation.

PEP geschrieben und implementiert von Eric V. Smith.

Dokumentation der Funktion.

PEP 526: Syntax für Variablenannotationen

PEP 484 führte den Standard für Typannotationen von Funktionsparametern, auch Typ-Hints genannt, ein. Diese PEP fügt Python eine Syntax hinzu, um die Typen von Variablen, einschließlich Klassenvariablen und Instanzvariablen, zu annotieren.

primes: List[int] = []

captain: str  # Note: no initial value!

class Starship:
    stats: Dict[str, int] = {}

Genau wie bei Funktionsannotationen weist der Python-Interpreter Variablenannotationen keine besondere Bedeutung zu und speichert sie nur im Attribut __annotations__ einer Klasse oder eines Moduls.

Im Gegensatz zu Variablendeklarationen in statisch typisierten Sprachen ist das Ziel der Annotationssyntax, Drittanbieterwerkzeugen und Bibliotheken über den abstrakten Syntaxbaum und das Attribut __annotations__ eine einfache Möglichkeit zu bieten, strukturierte Typmetadaten anzugeben.

Siehe auch

PEP 526 – Syntax für Variablenannotationen.

PEP geschrieben von Ryan Gonzalez, Philip House, Ivan Levkivskyi, Lisa Roach und Guido van Rossum. Implementiert von Ivan Levkivskyi.

Werkzeuge, die die neue Syntax verwenden oder verwenden werden: mypy, pytype, PyCharm usw.

PEP 515: Unterstriche in numerischen Literalen

PEP 515 fügt die Möglichkeit hinzu, Unterstriche in numerischen Literalen zur Verbesserung der Lesbarkeit zu verwenden. Zum Beispiel:

>>> 1_000_000_000_000_000
1000000000000000
>>> 0x_FF_FF_FF_FF
4294967295

Einzelne Unterstriche sind zwischen Ziffern und nach jedem Basisspezifizierer erlaubt. Führende, nachgestellte oder mehrere Unterstriche hintereinander sind nicht erlaubt.

Die String-Formatierungssprache unterstützt nun auch die Option '_', um die Verwendung eines Unterstrichs als Tausendertrennzeichen für Gleitkomma-Präsentationstypen und für den ganzzahligen Präsentationstyp 'd' zu signalisieren. Für ganzzahlige Präsentationstypen 'b', 'o', 'x' und 'X' werden Unterstriche alle 4 Ziffern eingefügt.

>>> '{:_}'.format(1000000)
'1_000_000'
>>> '{:_x}'.format(0xFFFFFFFF)
'ffff_ffff'

Siehe auch

PEP 515 – Unterstriche in numerischen Literalen

PEP geschrieben von Georg Brandl und Serhiy Storchaka.

PEP 525: Asynchrone Generatoren

PEP 492 führte native Coroutinen und die async / await-Syntax in Python 3.5 ein. Eine bemerkenswerte Einschränkung der Python 3.5-Implementierung war, dass es nicht möglich war, await und yield im selben Funktionskörper zu verwenden. In Python 3.6 wurde diese Einschränkung aufgehoben, was die Definition von *asynchronen Generatoren* ermöglicht.

async def ticker(delay, to):
    """Yield numbers from 0 to *to* every *delay* seconds."""
    for i in range(to):
        yield i
        await asyncio.sleep(delay)

Die neue Syntax ermöglicht schnellere und prägnantere Codes.

Siehe auch

PEP 525 – Asynchrone Generatoren

PEP geschrieben und implementiert von Yury Selivanov.

PEP 530: Asynchrone Comprehensions

PEP 530 fügt die Unterstützung für die Verwendung von async for in Listen-, Mengen-, Dictionary-Comprehensions und Generatorausdrücken hinzu.

result = [i async for i in aiter() if i % 2]

Zusätzlich sind await-Ausdrücke in allen Arten von Comprehensions unterstützt.

result = [await fun() for fun in funcs if await condition()]

Siehe auch

PEP 530 – Asynchrone Comprehensions

PEP geschrieben und implementiert von Yury Selivanov.

PEP 487: Vereinfachte Anpassung der Klassenerstellung

Es ist nun möglich, die Erstellung von Unterklassen zu personalisieren, ohne eine Metaklasse zu verwenden. Die neue Klassenmethode __init_subclass__ wird bei der Erstellung einer neuen Unterklasse auf der Basisklasse aufgerufen.

class PluginBase:
    subclasses = []

    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        cls.subclasses.append(cls)

class Plugin1(PluginBase):
    pass

class Plugin2(PluginBase):
    pass

Damit Null-Argument super()-Aufrufe aus __init_subclass__()-Implementierungen korrekt funktionieren, müssen benutzerdefinierte Metaklassen sicherstellen, dass der neue __classcell__-Namespace-Eintrag an type.__new__ weitergegeben wird (wie in Erstellung des Klassenobjekts beschrieben).

Siehe auch

PEP 487 – Vereinfachte Anpassung der Klassenerstellung

PEP geschrieben und implementiert von Martin Teichmann.

Dokumentation der Funktion

PEP 487: Verbesserungen am Descriptor-Protokoll

PEP 487 erweitert das Descriptor-Protokoll um die neue optionale Methode __set_name__(). Bei jeder Definition einer neuen Klasse wird die neue Methode für alle in der Definition enthaltenen Deskriptoren aufgerufen und liefert ihnen einen Verweis auf die zu definierende Klasse und den Namen, der dem Deskriptor im Klassennamenraum zugewiesen wurde. Mit anderen Worten, Instanzen von Deskriptoren können nun den Attributnamen des Deskriptors in der Besitzerklasse kennen.

class IntField:
    def __get__(self, instance, owner):
        return instance.__dict__[self.name]

    def __set__(self, instance, value):
        if not isinstance(value, int):
            raise ValueError(f'expecting integer in {self.name}')
        instance.__dict__[self.name] = value

    # this is the new initializer:
    def __set_name__(self, owner, name):
        self.name = name

class Model:
    int_field = IntField()

Siehe auch

PEP 487 – Vereinfachte Anpassung der Klassenerstellung

PEP geschrieben und implementiert von Martin Teichmann.

Dokumentation der Funktion

PEP 519: Hinzufügen eines Dateisystempfad-Protokolls

Dateisystempfade wurden historisch als str- oder bytes-Objekte dargestellt. Dies führte dazu, dass Leute, die Code schreiben, der mit Dateisystempfaden arbeitet, davon ausgehen, dass solche Objekte nur eine dieser beiden Arten sind (eine int, die einen Dateideskriptor darstellt, zählt nicht, da dies kein Dateipfad ist). Leider verhindert diese Annahme, dass alternative Objekt darstellungen von Dateisystempfaden wie pathlib mit bestehendem Code, einschließlich der Python-Standardbibliothek, funktionieren.

Um diese Situation zu beheben, wurde eine neue Schnittstelle, repräsentiert durch os.PathLike, definiert. Durch die Implementierung der Methode __fspath__() signalisiert ein Objekt, dass es einen Pfad darstellt. Ein Objekt kann dann eine Low-Level-Darstellung eines Dateisystempfads als str- oder bytes-Objekt bereitstellen. Dies bedeutet, dass ein Objekt als pfadähnlich gilt, wenn es os.PathLike implementiert oder ein str- oder bytes-Objekt ist, das einen Dateisystempfad darstellt. Code kann os.fspath(), os.fsdecode() oder os.fsencode() verwenden, um explizit eine str- und/oder bytes-Darstellung eines pfadähnlichen Objekts zu erhalten.

Die integrierte Funktion open() wurde aktualisiert, um os.PathLike-Objekte zu akzeptieren, ebenso wie alle relevanten Funktionen in den Modulen os und os.path, und die meisten anderen Funktionen und Klassen in der Standardbibliothek. Die Klasse os.DirEntry und relevante Klassen in pathlib wurden ebenfalls aktualisiert, um os.PathLike zu implementieren.

Die Hoffnung ist, dass die Aktualisierung der grundlegenden Funktionen für die Arbeit mit Dateisystempfaden dazu führen wird, dass Drittanbieter-Code alle pfadähnlichen Objekte implizit ohne oder zumindest mit sehr geringfügigen Code-Änderungen unterstützt (z.B. Aufruf von os.fspath() am Anfang des Codes vor der Bearbeitung eines pfadähnlichen Objekts).

Hier sind einige Beispiele, wie die neue Schnittstelle die einfachere und transparentlichere Verwendung von pathlib.Path mit bestehendem Code ermöglicht.

>>> import pathlib
>>> with open(pathlib.Path("README")) as f:
...     contents = f.read()
...
>>> import os.path
>>> os.path.splitext(pathlib.Path("some_file.txt"))
('some_file', '.txt')
>>> os.path.join("/a/b", pathlib.Path("c"))
'/a/b/c'
>>> import os
>>> os.fspath(pathlib.Path("some_file.txt"))
'some_file.txt'

(Implementiert von Brett Cannon, Ethan Furman, Dusty Phillips und Jelle Zijlstra.)

Siehe auch

PEP 519 – Hinzufügen eines Dateisystempfad-Protokolls

PEP geschrieben von Brett Cannon und Koos Zevenhoven.

PEP 495: Mehrdeutigkeit von Ortszeit

An den meisten Orten der Welt gab und wird es Zeiten geben, in denen die lokalen Uhren zurückgestellt werden. In diesen Zeiten entstehen Intervalle, in denen die lokale Uhrzeit zweimal am selben Tag dieselbe Zeit anzeigt. In diesen Situationen reichen die auf einer lokalen Uhr (oder in einer Python datetime-Instanz) angezeigten Informationen nicht aus, um einen bestimmten Zeitpunkt zu identifizieren.

PEP 495 fügt den neuen *fold*-Attribut zu Instanzen der Klassen datetime.datetime und datetime.time hinzu, um zwischen zwei Zeitpunkten zu unterscheiden, für die die Ortszeiten gleich sind.

>>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)
>>> for i in range(4):
...     u = u0 + i*HOUR
...     t = u.astimezone(Eastern)
...     print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
...
04:00:00 UTC = 00:00:00 EDT 0
05:00:00 UTC = 01:00:00 EDT 0
06:00:00 UTC = 01:00:00 EST 1
07:00:00 UTC = 02:00:00 EST 0

Die Werte des fold-Attributs sind 0 für alle Instanzen außer denen, die den zweiten (chronologisch) Zeitpunkt in einem mehrdeutigen Fall darstellen.

Siehe auch

PEP 495 – Mehrdeutigkeit von Ortszeit

PEP geschrieben von Alexander Belopolsky und Tim Peters, Implementierung von Alexander Belopolsky.

PEP 529: Ändern der Windows-Dateisystemkodierung zu UTF-8

Die Darstellung von Dateisystempfaden ist am besten mit str (Unicode) statt mit bytes durchzuführen. Es gibt jedoch einige Situationen, in denen die Verwendung von Bytes ausreichend und korrekt ist.

Vor Python 3.6 konnte es bei der Verwendung von Byte-Pfaden unter Windows zu Datenverlust kommen. Mit dieser Änderung wird die Verwendung von Bytes zur Darstellung von Pfaden unter Windows nun unterstützt, vorausgesetzt, diese Bytes sind mit der von sys.getfilesystemencoding() zurückgegebenen Kodierung kodiert, die nun standardmäßig auf 'utf-8' gesetzt ist.

Anwendungen, die str nicht zur Darstellung von Pfaden verwenden, sollten os.fsencode() und os.fsdecode() verwenden, um sicherzustellen, dass ihre Bytes korrekt kodiert sind. Um zum vorherigen Verhalten zurückzukehren, setzen Sie PYTHONLEGACYWINDOWSFSENCODING oder rufen Sie sys._enablelegacywindowsfsencoding() auf.

Weitere Informationen und Erläuterungen zu möglichen Code-Änderungen finden Sie in PEP 529.

PEP 528: Ändern der Windows-Konsolenkodierung zu UTF-8

Die Standardkonsole unter Windows akzeptiert nun alle Unicode-Zeichen und liefert Python-Code korrekt gelesene str-Objekte. sys.stdin, sys.stdout und sys.stderr sind nun standardmäßig auf UTF-8 kodiert.

Diese Änderung gilt nur für die Verwendung einer interaktiven Konsole und nicht für die Umleitung von Dateien oder Pipes. Um zum vorherigen Verhalten für die interaktive Konsolennutzung zurückzukehren, setzen Sie PYTHONLEGACYWINDOWSSTDIO.

Siehe auch

PEP 528 – Ändern der Windows-Konsolenkodierung zu UTF-8

PEP geschrieben und implementiert von Steve Dower.

PEP 520: Beibehaltung der Reihenfolge von Klassenattributdefinitionen

Attribute im Körper einer Klassendefinition haben eine natürliche Reihenfolge: dieselbe Reihenfolge, in der die Namen im Quellcode erscheinen. Diese Reihenfolge wird nun im __dict__-Attribut der neuen Klasse beibehalten.

Außerdem ist der effektive Standard-Klassen-*Ausführungs*-Namensraum (zurückgegeben von type.__prepare__()) nun eine Einfügungsreihenfolge-erhaltende Zuordnung.

Siehe auch

PEP 520 – Beibehaltung der Reihenfolge von Klassenattributdefinitionen

PEP geschrieben und implementiert von Eric Snow.

PEP 468: Beibehaltung der Reihenfolge von Schlüsselwortargumenten

**kwargs in einer Funktionssignatur ist nun garantiert eine Einfügungsreihenfolge-erhaltende Zuordnung.

Siehe auch

PEP 468 – Beibehaltung der Reihenfolge von Schlüsselwortargumenten

PEP geschrieben und implementiert von Eric Snow.

Neue dict-Implementierung

Der Typ dict verwendet nun eine "kompakte" Darstellung, die auf einem Vorschlag von Raymond Hettinger basiert und die zuerst von PyPy implementiert wurde. Die Speichernutzung des neuen dict() ist zwischen 20 % und 25 % geringer im Vergleich zu Python 3.5.

Der Reihengeordnete Aspekt dieser neuen Implementierung wird als Implementierungsdetail betrachtet und sollte nicht als verlässlich angesehen werden (dies kann sich in Zukunft ändern, aber es ist gewünscht, diese neue dict-Implementierung für einige Releases in der Sprache zu haben, bevor die Sprachspezifikation geändert wird, um Reihengeordnete Semantik für alle aktuellen und zukünftigen Python-Implementierungen zu erzwingen; dies hilft auch, die Abwärtskompatibilität mit älteren Sprachversionen zu wahren, bei denen die zufällige Iterationsreihenfolge noch in Kraft ist, z.B. Python 3.5).

(Beigetragen von INADA Naoki in bpo-27350. Idee ursprünglich von Raymond Hettinger vorgeschlagen.)

PEP 523: Hinzufügen einer Frame-Evaluierungs-API zu CPython

Obwohl Python umfangreiche Unterstützung zur Anpassung der Codeausführung bietet, ist die Auswertung von Frame-Objekten ein Bereich, in dem dies nicht der Fall war. Wenn Sie eine Möglichkeit haben wollten, die Frame-Auswertung in Python abzufangen, gab es keine Möglichkeit, ohne direkte Manipulation von Funktionszeigern für definierte Funktionen.

PEP 523 ändert dies, indem eine API bereitgestellt wird, um die Frame-Auswertung auf C-Ebene steckbar zu machen. Dies ermöglicht Tools wie Debugger und JITs, die Frame-Auswertung abzufangen, bevor die Ausführung von Python-Code beginnt. Dies ermöglicht die Verwendung alternativer Auswertungsimplementierungen für Python-Code, die Nachverfolgung der Frame-Auswertung usw.

Diese API ist kein Teil der eingeschränkten C-API und ist als privat gekennzeichnet, um anzuzeigen, dass die Verwendung dieser API voraussichtlich eingeschränkt ist und nur für sehr ausgewählte Low-Level-Anwendungsfälle gilt. Die Semantik der API wird bei Bedarf mit Python geändert.

Siehe auch

PEP 523 – Hinzufügen einer Frame-Evaluierungs-API zu CPython

PEP geschrieben von Brett Cannon und Dino Viehland.

PYTHONMALLOC-Umgebungsvariable

Die neue Umgebungsvariable PYTHONMALLOC ermöglicht die Einstellung der Python-Speicherallokatoren und die Installation von Debug-Hooks.

Es ist nun möglich, Debug-Hooks für Python-Speicherallokatoren auf Python zu installieren, die im Release-Modus kompiliert wurden, mit PYTHONMALLOC=debug. Auswirkungen von Debug-Hooks:

  • Neu allokierter Speicher wird mit dem Byte 0xCB gefüllt.

  • Freigegebener Speicher wird mit dem Byte 0xDB gefüllt.

  • Erkennt Verstöße gegen die Python-Speicher-Allokator-API. Zum Beispiel wird PyObject_Free() für einen von PyMem_Malloc() zugewiesenen Speicherblock aufgerufen.

  • Erkennt Schreibvorgänge vor dem Anfang eines Puffers (Buffer-Underflows)

  • Erkennt Schreibvorgänge nach dem Ende eines Puffers (Buffer-Overflows)

  • Prüft, ob der GIL gehalten wird, wenn Allokatorfunktionen der Domänen PYMEM_DOMAIN_OBJ (z. B. PyObject_Malloc()) und PYMEM_DOMAIN_MEM (z. B. PyMem_Malloc()) aufgerufen werden.

Die Prüfung, ob der GIL gehalten wird, ist ebenfalls ein neues Feature von Python 3.6.

Siehe die Funktion PyMem_SetupDebugHooks() für Debugging-Hooks für Python-Speicherallokatoren.

Es ist jetzt auch möglich, die Verwendung des malloc()-Allokators der C-Bibliothek für alle Python-Speicherzuweisungen zu erzwingen, indem PYTHONMALLOC=malloc verwendet wird. Dies ist hilfreich bei der Verwendung externer Speicherdebug-Tools wie Valgrind auf einem in Release-Modus kompilierten Python.

Im Fehlerfall verwenden die Debugging-Hooks für Python-Speicherallokatoren nun das Modul tracemalloc, um den Traceback zu erhalten, wo ein Speicherblock zugewiesen wurde.

Beispiel für einen fatalen Fehler bei einem Buffer-Overflow mit python3.6 -X tracemalloc=5 (speichert 5 Frames in den Traces)

Debug memory block at address p=0x7fbcd41666f8: API 'o'
    4 bytes originally requested
    The 7 pad bytes at p-7 are FORBIDDENBYTE, as expected.
    The 8 pad bytes at tail=0x7fbcd41666fc are not all FORBIDDENBYTE (0xfb):
        at tail+0: 0x02 *** OUCH
        at tail+1: 0xfb
        at tail+2: 0xfb
        at tail+3: 0xfb
        at tail+4: 0xfb
        at tail+5: 0xfb
        at tail+6: 0xfb
        at tail+7: 0xfb
    The block was made by call #1233329 to debug malloc/realloc.
    Data at p: 1a 2b 30 00

Memory block allocated at (most recent call first):
  File "test/test_bytes.py", line 323
  File "unittest/case.py", line 600
  File "unittest/case.py", line 648
  File "unittest/suite.py", line 122
  File "unittest/suite.py", line 84

Fatal Python error: bad trailing pad byte

Current thread 0x00007fbcdbd32700 (most recent call first):
  File "test/test_bytes.py", line 323 in test_hex
  File "unittest/case.py", line 600 in run
  File "unittest/case.py", line 648 in __call__
  File "unittest/suite.py", line 122 in run
  File "unittest/suite.py", line 84 in __call__
  File "unittest/suite.py", line 122 in run
  File "unittest/suite.py", line 84 in __call__
  ...

(Beigetragen von Victor Stinner in bpo-26516 und bpo-26564.)

DTrace und SystemTap-Probing-Unterstützung

Python kann nun mit --with-dtrace kompiliert werden, was statische Marker für die folgenden Ereignisse im Interpreter aktiviert:

  • Funktionsaufruf/Rückkehr

  • Start/Ende der Garbage Collection

  • Ausgeführte Codezeile.

Dies kann verwendet werden, um laufende Interpreter in der Produktion zu instrumentieren, ohne spezifische Debug-Builds neu kompilieren oder anwendungsspezifischen Profiling-/Debugging-Code bereitstellen zu müssen.

Weitere Details in CPython mit DTrace und SystemTap instrumentieren.

Die aktuelle Implementierung wurde unter Linux und macOS getestet. Zukünftig können zusätzliche Marker hinzugefügt werden.

(Beigetragen von Łukasz Langa in bpo-21590, basierend auf Patches von Jesús Cea Avión, David Malcolm und Nikhil Benesch.)

Andere Sprachänderungen

Einige kleinere Änderungen am Kern der Python-Sprache sind:

  • Eine global- oder nonlocal-Anweisung muss nun textuell vor der ersten Verwendung des betroffenen Namens im selben Gültigkeitsbereich erscheinen. Zuvor war dies eine SyntaxWarning.

  • Es ist nun möglich, eine Spezialmethode auf None zu setzen, um anzuzeigen, dass die entsprechende Operation nicht verfügbar ist. Wenn beispielsweise eine Klasse __iter__() auf None setzt, ist die Klasse nicht iterierbar. (Beigetragen von Andrew Barnert und Ivan Levkivskyi in bpo-25958.)

  • Lange Sequenzen wiederholter Traceback-Zeilen werden nun abgekürzt als "[Vorherige Zeile {count} weitere Male wiederholt]" (siehe Traceback für ein Beispiel). (Beigetragen von Emanuel Barry in bpo-26823.)

  • Beim Importieren wird nun die neue Ausnahme ModuleNotFoundError (Unterklasse von ImportError) ausgelöst, wenn ein Modul nicht gefunden werden kann. Code, der derzeit nach ImportError prüft (in try-except), funktioniert weiterhin. (Beigetragen von Eric Snow in bpo-15767.)

  • Klassenmethoden, die von nullargumentigen super() abhängen, funktionieren nun korrekt, wenn sie von Metaklassenmethoden während der Klassenerstellung aufgerufen werden. (Beigetragen von Martin Teichmann in bpo-23722.)

Neue Module

secrets

Der Hauptzweck des neuen Moduls secrets ist es, eine offensichtliche Möglichkeit zu bieten, kryptografisch starke Pseudozufallswerte zuverlässig zu generieren, die für die Verwaltung von Geheimnissen wie Authentifizierungsdaten, Tokens und Ähnlichem geeignet sind.

Warnung

Beachten Sie, dass die Pseudozufallsgeneratoren im Modul random *NICHT* für Sicherheitszwecke verwendet werden sollten. Verwenden Sie unter Python 3.6+ secrets und unter Python 3.5 und älter os.urandom().

Siehe auch

PEP 506 – Hinzufügen eines Secrets-Moduls zur Standardbibliothek

PEP geschrieben und implementiert von Steven D’Aprano.

Verbesserte Module

array

Erschöpfte Iteratoren von array.array bleiben nun erschöpft, auch wenn das iterierte Array erweitert wird. Dies entspricht dem Verhalten anderer veränderbarer Sequenzen.

Beigetragen von Serhiy Storchaka in bpo-26492.

ast

Der neue AST-Knoten ast.Constant wurde hinzugefügt. Er kann von externen AST-Optimierern für die Zwecke der konstanten Faltung verwendet werden.

Beigetragen von Victor Stinner in bpo-26146.

asyncio

Ab Python 3.6 ist das Modul asyncio nicht mehr provisorisch und seine API gilt als stabil.

Bemerkenswerte Änderungen im Modul asyncio seit Python 3.5.0 (alle zurückportiert zu 3.5.x aufgrund des provisorischen Status)

  • Die Funktion get_event_loop() wurde geändert, um immer die aktuell laufende Schleife zurückzugeben, wenn sie von Koroutinen und Callbacks aufgerufen wird. (Beigetragen von Yury Selivanov in bpo-28613.)

  • Die Funktion ensure_future() und alle Funktionen, die sie verwenden, wie z. B. loop.run_until_complete(), akzeptieren nun alle Arten von awaitable Objekten. (Beigetragen von Yury Selivanov.)

  • Neue Funktion run_coroutine_threadsafe(), um Koroutinen aus anderen Threads an Event-Loops zu übermitteln. (Beigetragen von Vincent Michel.)

  • Neue Methode Transport.is_closing(), um zu prüfen, ob der Transport geschlossen wird oder geschlossen ist. (Beigetragen von Yury Selivanov.)

  • Die Methode loop.create_server() kann nun eine Liste von Hosts akzeptieren. (Beigetragen von Yann Sionneau.)

  • Neue Methode loop.create_future() zum Erstellen von Future-Objekten. Dies ermöglicht es alternativen Event-Loop-Implementierungen, wie z. B. uvloop, eine schnellere Implementierung von asyncio.Future bereitzustellen. (Beigetragen von Yury Selivanov in bpo-27041.)

  • Neue Methode loop.get_exception_handler() zum Abrufen des aktuellen Exception-Handlers. (Beigetragen von Yury Selivanov in bpo-27040.)

  • Neue Methode StreamReader.readuntil() zum Lesen von Daten aus dem Stream, bis eine Trennzeichen-Byte-Sequenz erscheint. (Beigetragen von Mark Korenberg.)

  • Die Leistung von StreamReader.readexactly() wurde verbessert. (Beigetragen von Mark Korenberg in bpo-28370.)

  • Die Methode loop.getaddrinfo() ist optimiert, um den Aufruf der Systemfunktion getaddrinfo zu vermeiden, wenn die Adresse bereits aufgelöst ist. (Beigetragen von A. Jesse Jiryu Davis.)

  • Die Methode loop.stop() wurde so geändert, dass die Schleife sofort nach der aktuellen Iteration gestoppt wird. Alle neuen Callbacks, die sich aus der letzten Iteration ergeben, werden verworfen. (Beigetragen von Guido van Rossum in bpo-25593.)

  • Future.set_exception löst nun TypeError aus, wenn eine Instanz der StopIteration-Ausnahme übergeben wird. (Beigetragen von Chris Angelico in bpo-26221.)

  • Neue Methode loop.connect_accepted_socket() für Server, die Verbindungen außerhalb von asyncio akzeptieren, aber asyncio zu deren Verarbeitung nutzen. (Beigetragen von Jim Fulton in bpo-27392.)

  • Das Flag TCP_NODELAY wird nun standardmäßig für alle TCP-Transports gesetzt. (Beigetragen von Yury Selivanov in bpo-27456.)

  • Neue Methode loop.shutdown_asyncgens() zum ordnungsgemäßen Schließen ausstehender asynchroner Generatoren vor dem Schließen der Schleife. (Beigetragen von Yury Selivanov in bpo-28003.)

  • Die Klassen Future und Task verfügen nun über eine optimierte C-Implementierung, die asyncio-Code um bis zu 30 % schneller macht. (Beigetragen von Yury Selivanov und INADA Naoki in bpo-26081 und bpo-28544.)

binascii

Die Funktion b2a_base64() akzeptiert nun ein optionales Schlüsselwortargument newline, um zu steuern, ob das Zeilenumbruchzeichen an den Rückgabewert angehängt wird. (Beigetragen von Victor Stinner in bpo-25357.)

cmath

Die neue Konstante cmath.tau (τ) wurde hinzugefügt. (Beigetragen von Lisa Roach in bpo-12345, siehe PEP 628 für Details.)

Neue Konstanten: cmath.inf und cmath.nan passend zu math.inf und math.nan, sowie cmath.infj und cmath.nanj passend zum Format der komplexen Repräsentation. (Beigetragen von Mark Dickinson in bpo-23229.)

collections

Die neue abstrakte Basisklasse Collection wurde hinzugefügt, um sizierte, iterierbare Containerklassen darzustellen. (Beigetragen von Ivan Levkivskyi, Dokumentation von Neil Girdhar in bpo-27598.)

Die neue abstrakte Basisklasse Reversible repräsentiert iterierbare Klassen, die auch die Methode __reversed__() bereitstellen. (Beigetragen von Ivan Levkivskyi in bpo-25987.)

Die neue abstrakte Basisklasse AsyncGenerator repräsentiert asynchrone Generatoren. (Beigetragen von Yury Selivanov in bpo-28720.)

Die Funktion namedtuple() akzeptiert nun ein optionales Schlüsselwortargument module, das bei Angabe für das Attribut __module__ der zurückgegebenen benannten Tupelklasse verwendet wird. (Beigetragen von Raymond Hettinger in bpo-17941.)

Die Argumente verbose und rename für namedtuple() sind nun schlüsselwortorientiert. (Beigetragen von Raymond Hettinger in bpo-25628.)

Rekursive collections.deque-Instanzen können nun gepickelt werden. (Beigetragen von Serhiy Storchaka in bpo-26482.)

concurrent.futures

Der Konstruktor der Klasse ThreadPoolExecutor akzeptiert nun ein optionales Argument thread_name_prefix, um die Benennung der vom Pool erstellten Threads zu ermöglichen. (Beigetragen von Gregory P. Smith in bpo-27664.)

contextlib

Die Klasse contextlib.AbstractContextManager wurde hinzugefügt, um eine abstrakte Basisklasse für Kontextmanager bereitzustellen. Sie bietet eine sinnvolle Standardimplementierung für __enter__(), die self zurückgibt und __exit__() als abstrakte Methode belässt. Eine entsprechende Klasse wurde im Modul typing als typing.ContextManager hinzugefügt. (Beigetragen von Brett Cannon in bpo-25609.)

datetime

Die Klassen datetime und time haben das neue Attribut fold, das zur Diskriminierung lokaler Zeiten bei Bedarf verwendet wird. Viele Funktionen im Modul datetime wurden aktualisiert, um die lokale Zeitdiskriminierung zu unterstützen. Weitere Informationen finden Sie im Abschnitt Lokale Zeitdiskriminierung. (Beigetragen von Alexander Belopolsky in bpo-24773.)

Die Methoden datetime.strftime() und date.strftime() unterstützen nun die ISO 8601-Direktiven %G, %u und %V. (Beigetragen von Ashley Anderson in bpo-12006.)

Die Funktion datetime.isoformat() akzeptiert nun ein optionales Argument timespec, das die Anzahl der zusätzlichen Komponenten des Zeitwerts angibt, die enthalten werden sollen. (Beigetragen von Alessandro Cucci und Alexander Belopolsky in bpo-19475.)

Die Methode datetime.combine() akzeptiert nun ein optionales Argument tzinfo. (Beigetragen von Alexander Belopolsky in bpo-27661.)

decimal

Neue Methode Decimal.as_integer_ratio(), die ein Paar von ganzen Zahlen (n, d) zurückgibt, das die gegebene Instanz Decimal als Bruch darstellt, gekürzt und mit einem positiven Nenner.

>>> Decimal('-3.14').as_integer_ratio()
(-157, 50)

(Beigetragen von Stefan Krah und Mark Dickinson in bpo-25928.)

distutils

Das Attribut default_format wurde aus distutils.command.sdist.sdist entfernt und das Attribut formats hat standardmäßig ['gztar']. Obwohl nicht erwartet, muss möglicherweise jeglicher Code, der auf der Anwesenheit von default_format beruhte, angepasst werden. Siehe bpo-27819 für weitere Details.

email

Die neue E-Mail-API, die über das policy-Schlüsselwort für verschiedene Konstruktoren aktiviert wird, ist nicht mehr provisorisch. Die Dokumentation für email wurde neu organisiert und umgeschrieben, um sich auf die neue API zu konzentrieren, während die alte Dokumentation für die Legacy-API beibehalten wird. (Beigetragen von R. David Murray in bpo-24277.)

Die Klassen email.mime akzeptieren nun alle ein optionales Schlüsselwort policy. (Beigetragen von Berker Peksag in bpo-27331.)

Die Klasse DecodedGenerator unterstützt nun das Schlüsselwort policy.

Es gibt ein neues Attribut message_factory in email.policy, das steuert, welche Klasse standardmäßig verwendet wird, wenn der Parser neue Nachrichtenobjekte erstellt. Für die Policy email.policy.compat32 ist dies Message, für die neuen Policies ist es EmailMessage. (Beigetragen von R. David Murray in bpo-20476.)

encodings

Unter Windows wurden die Kodierung 'oem' zur Verwendung von CP_OEMCP und der Alias 'ansi' für die bestehende Kodierung 'mbcs' hinzugefügt, die die Codepage CP_ACP verwendet. (Beigetragen von Steve Dower in bpo-27959.)

enum

Zwei neue Basisklassen für Aufzählungstypen wurden dem Modul enum hinzugefügt: Flag und IntFlag. Beide werden verwendet, um Konstanten zu definieren, die mit bitweisen Operatoren kombiniert werden können. (Beigetragen von Ethan Furman in bpo-23591.)

Viele Standardbibliotheksmodule wurden aktualisiert, um die Klasse IntFlag für ihre Konstanten zu verwenden.

Der Wert enum.auto kann verwendet werden, um Werte für Enum-Mitglieder automatisch zuzuweisen.

>>> from enum import Enum, auto
>>> class Color(Enum):
...     red = auto()
...     blue = auto()
...     green = auto()
...
>>> list(Color)
[<Color.red: 1>, <Color.blue: 2>, <Color.green: 3>]

faulthandler

Unter Windows installiert das Modul faulthandler nun einen Handler für Windows-Ausnahmen: siehe faulthandler.enable(). (Beigetragen von Victor Stinner in bpo-23848.)

fileinput

hook_encoded() unterstützt nun das Argument errors. (Beigetragen von Joseph Hackman in bpo-25788.)

hashlib

hashlib unterstützt OpenSSL 1.1.0. Die minimal empfohlene Version ist 1.0.2. (Beigetragen von Christian Heimes in bpo-26470.)

Die BLAKE2-Hashfunktionen wurden dem Modul hinzugefügt. blake2b() und blake2s() sind immer verfügbar und unterstützen den vollen Funktionsumfang von BLAKE2. (Beigetragen von Christian Heimes in bpo-26798 basierend auf Code von Dmitry Chestnykh und Samuel Neves. Dokumentation von Dmitry Chestnykh.)

Die SHA-3-Hashfunktionen sha3_224(), sha3_256(), sha3_384(), sha3_512() und die SHAKE-Hashfunktionen shake_128() und shake_256() wurden hinzugefügt. (Beigetragen von Christian Heimes in bpo-16113. Keccak Code Package von Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche und Ronny Van Keer.)

Die passwortbasierte Schlüsselerzeugungsfunktion scrypt() ist nun mit OpenSSL 1.1.0 und neueren Versionen verfügbar. (Beigetragen von Christian Heimes in bpo-27928.)

http.client

HTTPConnection.request() und endheaders() unterstützen jetzt Chunked-Encoding für Request-Bodys. (Beigetragen von Demian Brecht und Rolf Krahl in bpo-12319.)

idlelib und IDLE

Das idlelib-Paket wird modernisiert und refaktoriert, um IDLE besser aussehen und funktionieren zu lassen und um den Code einfacher verständlich, testbar und verbesserbar zu machen. Ein Teil davon, IDLE besser aussehen zu lassen, insbesondere unter Linux und Mac, ist die Verwendung von ttk-Widgets, hauptsächlich in den Dialogen. Daher läuft IDLE nicht mehr mit tcl/tk 8.4. Es erfordert nun tcl/tk 8.5 oder 8.6. Wir empfehlen, die jeweils neueste Version zu verwenden.

„Modernisierung“ beinhaltet die Umbenennung und Konsolidierung von idlelib-Modulen. Die Umbenennung von Dateien mit teilweise großgeschriebenen Namen ähnelt der Umbenennung von z. B. Tkinter und TkFont zu tkinter und tkinter.font in 3.0. Infolgedessen funktionieren Importe von idlelib-Dateien, die in 3.5 funktionierten, in 3.6 normalerweise nicht mehr. Mindestens eine Namensänderung des Moduls ist erforderlich (siehe idlelib/README.txt), manchmal auch mehr. (Namensänderungen beigetragen von Al Swiegart und Terry Reedy in bpo-24225. Die meisten idlelib-Patches seitdem sind und werden Teil dieses Prozesses sein.)

Als Ausgleich werden am Ende einige idlelib-Klassen einfacher zu verwenden sein, mit besseren APIs und erklärenden Docstrings. Zusätzliche nützliche Informationen werden zu idlelib hinzugefügt, sobald sie verfügbar sind.

Neu in 3.6.2

Mehrere Korrekturen für die Autovervollständigung. (Beigetragen von Louie Lu in bpo-15786.)

Neu in 3.6.3

Der Modulbrowser (im Menü "Datei", früher "Klassenbrowser" genannt) zeigt jetzt verschachtelte Funktionen und Klassen zusätzlich zu Funktionen und Klassen auf oberster Ebene an. (Beigetragen von Guilherme Polo, Cheryl Sabella und Terry Jan Reedy in bpo-1612262.)

Die früher als Erweiterungen implementierten IDLE-Funktionen wurden als normale Funktionen neu implementiert. Ihre Einstellungen wurden vom Tab "Erweiterungen" auf andere Dialog-Tabs verschoben. (Beigetragen von Charles Wohlganger und Terry Jan Reedy in bpo-27099.)

Der Einstellungsdialog (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.)

Neu in 3.6.4

Die Schriftartprobe enthält jetzt eine Auswahl nicht-lateinischer Zeichen, damit Benutzer die Auswirkung der Auswahl einer bestimmten Schriftart besser sehen können. (Beigetragen von Terry Jan Reedy in bpo-13802.) Die Probe kann bearbeitet werden, um andere Zeichen einzufügen. (Beigetragen von Serhiy Storchaka in bpo-31860.)

Neu in 3.6.6

Die Option für den Codekontext im Editor wurde überarbeitet. Eine Box zeigt alle Kontextzeilen bis zu maxlines an. Das Klicken auf eine Kontextzeile springt zum Editor zu dieser Zeile. Kontextfarben für benutzerdefinierte Themes wurden dem Highlight-Tab 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 schärfer werden. Andernfalls sollte dies keine Auswirkungen haben. (Beigetragen von Terry Jan Reedy in bpo-33656.)

Neu in 3.6.7

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.)

importlib

Import löst jetzt die neue Ausnahme ModuleNotFoundError (Unterklasse von ImportError) aus, wenn ein Modul nicht gefunden wird. Code, der derzeit nach ImportError prüft (in try-except), funktioniert weiterhin. (Beigetragen von Eric Snow in bpo-15767.)

importlib.util.LazyLoader ruft jetzt create_module() auf dem umhüllten Loader auf und entfernt die Beschränkung, dass importlib.machinery.BuiltinImporter und importlib.machinery.ExtensionFileLoader nicht mit importlib.util.LazyLoader verwendet werden konnten.

importlib.util.cache_from_source(), importlib.util.source_from_cache() und importlib.util.spec_from_file_location() akzeptieren jetzt ein pfadähnliches Objekt.

inspect

Die Funktion inspect.signature() meldet jetzt die vom Compiler für Comprehension- und Generator-Ausdrucksbereiche generierten impliziten .0-Parameter als position-only-Parameter namens implicit0. (Beigetragen von Jelle Zijlstra in bpo-19611.)

Um Code-Churn beim Upgrade von Python 2.7 und der alten inspect.getargspec()-API zu reduzieren, wurde die zuvor dokumentierte Deprecation von inspect.getfullargspec() rückgängig gemacht. Während diese Funktion für Codebasen geeignet ist, die nur mit Python 2/3 kompatibel sind, bleibt die umfassendere inspect.signature()-Schnittstelle für neuen Code die empfohlene Methode. (Beigetragen von Nick Coghlan in bpo-27172)

json

json.load() und json.loads() unterstützen jetzt binäre Eingaben. Kodierte JSONs sollten mit UTF-8, UTF-16 oder UTF-32 dargestellt werden. (Beigetragen von Serhiy Storchaka in bpo-17909.)

logging

Die neue Methode WatchedFileHandler.reopenIfNeeded() wurde hinzugefügt, um die Möglichkeit zu bieten, zu prüfen, ob die Log-Datei neu geöffnet werden muss. (Beigetragen von Marian Horban in bpo-24884.)

math

Die Konstante Tau (τ) wurde den Modulen math und cmath hinzugefügt. (Beigetragen von Lisa Roach in bpo-12345, siehe PEP 628 für Details.)

multiprocessing

Proxy-Objekte, die von multiprocessing.Manager() zurückgegeben werden, können jetzt verschachtelt werden. (Beigetragen von Davin Potts in bpo-6766.)

os

Siehe die Zusammenfassung von PEP 519 für Details, wie die Module os und os.path jetzt pfadähnliche Objekte unterstützen.

scandir() unterstützt jetzt Byte-Pfade unter Windows.

Eine neue Methode close() ermöglicht das explizite Schließen eines scandir()-Iterators. Der scandir()-Iterator unterstützt jetzt das Kontextmanager-Protokoll. Wenn ein scandir()-Iterator weder erschöpft noch explizit geschlossen wird, wird in seinem Destruktor eine ResourceWarning ausgegeben. (Beigetragen von Serhiy Storchaka in bpo-25994.)

Unter Linux blockiert os.urandom() jetzt, bis der Entropie-Pool des Systems initialisiert ist, um die Sicherheit zu erhöhen. Siehe PEP 524 für die Begründung.

Der Linux-Syscall getrandom() (get random bytes) wird nun als neue Funktion os.getrandom() bereitgestellt. (Beigetragen von Victor Stinner, Teil von PEP 524)

pathlib

pathlib unterstützt jetzt pfadähnliche Objekte. (Beigetragen von Brett Cannon in bpo-27186.)

Siehe die Zusammenfassung von PEP 519 für Details.

pdb

Der Konstruktor der Klasse Pdb hat ein neues optionales Argument readrc, um zu steuern, ob .pdbrc-Dateien gelesen werden sollen.

pickle

Objekte, die __new__ mit Schlüsselwortargumenten aufrufen müssen, können jetzt mit Pickle-Protokollen älter als Protokollversion 4 gepickelt werden. Protokollversion 4 unterstützt diesen Fall bereits. (Beigetragen von Serhiy Storchaka in bpo-24164.)

pickletools

pickletools.dis() gibt jetzt den impliziten Memo-Index für den Opcode MEMOIZE aus. (Beigetragen von Serhiy Storchaka in bpo-25382.)

pydoc

Das Modul pydoc respektiert nun die Umgebungsvariable MANPAGER. (Beigetragen von Matthias Klose in bpo-8637.)

help() und pydoc können jetzt benannte Tupelfelder in der Reihenfolge ihrer Definition auflisten, anstatt alphabetisch. (Beigetragen von Raymond Hettinger in bpo-24879.)

random

Die neue Funktion choices() gibt eine Liste von Elementen bestimmter Größe aus der gegebenen Population mit optionalen Gewichten zurück. (Beigetragen von Raymond Hettinger in bpo-18844.)

re

Unterstützung für Modifikatorspannen in regulären Ausdrücken hinzugefügt. Beispiele: '(?i:p)ython' stimmt mit 'python' und 'Python' überein, aber nicht mit 'PYTHON'; '(?i)g(?-i:v)r' stimmt mit 'GvR' und 'gvr' überein, aber nicht mit 'GVR'. (Beigetragen von Serhiy Storchaka in bpo-433028.)

Match-Objektgruppen können über __getitem__ angesprochen werden, was äquivalent zu group() ist. Daher ist mo['name'] nun äquivalent zu mo.group('name'). (Beigetragen von Eric Smith in bpo-24454.)

Match-Objekte unterstützen jetzt index-ähnliche Objekte als Gruppenindizes. (Beigetragen von Jeroen Demeyer und Xiang Zhang in bpo-27177.)

readline

Hinzugefügt set_auto_history() zum Aktivieren oder Deaktivieren der automatischen Hinzufügung von Eingaben zur Verlaufshistorie. (Beigetragen von Tyler Crompton in bpo-26870.)

rlcompleter

Private und spezielle Attributnamen werden jetzt ausgelassen, es sei denn, der Präfix beginnt mit Unterstrichen. Nach einigen vervollständigten Schlüsselwörtern wird ein Leerzeichen oder ein Doppelpunkt hinzugefügt. (Beigetragen von Serhiy Storchaka in bpo-25011 und bpo-25209.)

shlex

Das Modul shlex hat eine deutlich verbesserte Shell-Kompatibilität durch das neue Argument punctuation_chars zur Steuerung, welche Zeichen als Satzzeichen behandelt werden. (Beigetragen von Vinay Sajip in bpo-1521950.)

site

Beim Angeben von Pfaden, die zu sys.path in einer .pth-Datei hinzugefügt werden sollen, können Sie jetzt Dateipfade zusätzlich zu Verzeichnissen angeben (z. B. Zip-Dateien). (Beigetragen von Wolfgang Langner in bpo-26587).

sqlite3

sqlite3.Cursor.lastrowid unterstützt jetzt die REPLACE-Anweisung. (Beigetragen von Alex LordThorsen in bpo-16864.)

socket

Die Funktion ioctl() unterstützt jetzt den Steuerungs-Code SIO_LOOPBACK_FAST_PATH. (Beigetragen von Daniel Stokes in bpo-26536.)

Die Konstanten SO_DOMAIN, SO_PROTOCOL, SO_PEERSEC und SO_PASSSEC für getsockopt() werden jetzt unterstützt. (Beigetragen von Christian Heimes in bpo-26907.)

Die Form setsockopt(level, optname, None, optlen: int) wird jetzt von setsockopt() unterstützt. (Beigetragen von Christian Heimes in bpo-27744.)

Das Socket-Modul unterstützt jetzt die Adressfamilie AF_ALG zur Schnittstellenanbindung an die Linux Kernel Crypto API. ALG_*, SOL_ALG und sendmsg_afalg() wurden hinzugefügt. (Beigetragen von Christian Heimes in bpo-27744 mit Unterstützung von Victor Stinner.)

Neue Linux-Konstanten TCP_USER_TIMEOUT und TCP_CONGESTION wurden hinzugefügt. (Beigetragen von Omar Sandoval, bpo-26273).

socketserver

Server, die auf dem Modul socketserver basieren, einschließlich der in http.server, xmlrpc.server und wsgiref.simple_server definierten, unterstützen jetzt das Kontextmanager-Protokoll. (Beigetragen von Aviv Palivoda in bpo-26404.)

Das Attribut wfile von wfile der Klassen StreamRequestHandler implementiert jetzt die schreibbare Schnittstelle von io.BufferedIOBase. Insbesondere ist garantiert, dass das Aufrufen von write() die Daten vollständig sendet. (Beigetragen von Martin Panter in bpo-26721.)

ssl

ssl unterstützt OpenSSL 1.1.0. Die Mindestempfehlung ist 1.0.2. (Beigetragen von Christian Heimes in bpo-26470.)

3DES wurde aus den Standard-Cipher-Suiten entfernt und ChaCha20 Poly1305 Cipher-Suiten wurden hinzugefügt. (Beigetragen von Christian Heimes in bpo-27850 und bpo-27766.)

SSLContext hat eine bessere Standardkonfiguration für Optionen und Cipher-Suiten. (Beigetragen von Christian Heimes in bpo-28043.)

SSL-Sitzungen können mit der neuen Klasse SSLSession von einer Client-Verbindung zu einer anderen kopiert werden. TLS-Sitzungsfortsetzung kann den anfänglichen Handshake beschleunigen, Latenz reduzieren und die Leistung verbessern. (Beigetragen von Christian Heimes in bpo-19500 basierend auf einem Entwurf von Alex Warhawk.)

Die neue Methode get_ciphers() kann verwendet werden, um eine Liste der aktivierten Cipher-Suiten in Reihenfolge ihrer Priorität zu erhalten.

Alle Konstanten und Flags wurden in IntEnum und IntFlag konvertiert. (Beigetragen von Christian Heimes in bpo-28025.)

Server- und clientseitige spezifische TLS-Protokolle für SSLContext wurden hinzugefügt. (Beigetragen von Christian Heimes in bpo-28085.)

Hinzugefügt wurden ssl.SSLContext.post_handshake_auth zum Aktivieren und ssl.SSLSocket.verify_client_post_handshake() zum Initiieren von TLS 1.3 Post-Handshake-Authentifizierung. (Beigetragen von Christian Heimes in gh-78851.)

statistics

Eine neue Funktion harmonic_mean() wurde hinzugefügt. (Beigetragen von Steven D’Aprano in bpo-27181.)

struct

struct unterstützt jetzt IEEE 754 Halbgenauigkeits-Gleitkommazahlen über den Format-Spezifizierer 'e'. (Beigetragen von Eli Stevens, Mark Dickinson in bpo-11734.)

subprocess

Der Destruktor von subprocess.Popen gibt jetzt eine ResourceWarning aus, wenn der Kindprozess noch läuft. Verwenden Sie das Kontextmanager-Protokoll (with proc: ...) oder rufen Sie explizit die Methode wait() auf, um den Exit-Status des Kindprozesses zu lesen. (Beigetragen von Victor Stinner in bpo-26741.)

Der Konstruktor von subprocess.Popen und alle Funktionen, die Argumente an ihn übergeben, akzeptieren jetzt die Argumente encoding und errors. Die Angabe eines dieser Argumente aktiviert den Textmodus für die Streams stdin, stdout und stderr. (Beigetragen von Steve Dower in bpo-6135.)

sys

Die neue Funktion getfilesystemencodeerrors() gibt den Namen des Fehler-Modus zurück, der zur Konvertierung zwischen Unicode-Dateinamen und Byte-Dateinamen verwendet wird. (Beigetragen von Steve Dower in bpo-27781.)

Unter Windows enthält der Rückgabewert der Funktion getwindowsversion() jetzt das Feld platform_version, das die genaue Hauptversion, Nebenversion und Build-Nummer des aktuellen Betriebssystems enthält, anstatt der Version, die für den Prozess emuliert wird. (Beigetragen von Steve Dower in bpo-27932.)

telnetlib

telnetlib.Telnet ist jetzt ein Kontextmanager (beigetragen von Stéphane Wirtel in bpo-25485).

time

Die Attribute tm_gmtoff und tm_zone des struct_time sind jetzt auf allen Plattformen verfügbar.

timeit

Die neue Komfortmethode Timer.autorange() wurde hinzugefügt, um Timer.timeit() wiederholt aufzurufen, sodass die Gesamtlaufzeit größer oder gleich 200 Millisekunden ist. (Beigetragen von Steven D’Aprano in bpo-6422.)

timeit gibt jetzt eine Warnung aus, wenn es eine erhebliche (4-fache) Varianz zwischen den besten und schlechtesten Zeiten gibt. (Beigetragen von Serhiy Storchaka in bpo-23552.)

tkinter

Methoden Variable.trace_add(), Variable.trace_remove() und trace_info() wurden zur Klasse tkinter.Variable hinzugefügt. Sie ersetzen die alten Methoden trace_variable(), trace(), trace_vdelete() und trace_vinfo(), die veraltete Tcl-Befehle verwenden und in zukünftigen Tcl-Versionen möglicherweise nicht mehr funktionieren. (Beigetragen von Serhiy Storchaka in bpo-22115).

traceback

Sowohl das Traceback-Modul als auch die integrierte Ausnahme-Anzeige des Interpreters kürzen jetzt lange Folgen von wiederholten Zeilen in Tracebacks, wie im folgenden Beispiel gezeigt.

>>> def f(): f()
...
>>> f()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in f
  File "<stdin>", line 1, in f
  File "<stdin>", line 1, in f
  [Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded

(Beigetragen von Emanuel Barry in bpo-26823.)

tracemalloc

Das Modul tracemalloc unterstützt jetzt das Tracing von Speicherzuweisungen in mehreren verschiedenen Adressräumen.

Die neue Filterklasse DomainFilter wurde hinzugefügt, um Block-Traces nach ihrem Adressraum (Domäne) zu filtern.

(Beigetragen von Victor Stinner in bpo-26588.)

typing

Da das Modul typing eine provisorische API ist, wurden alle in Python 3.6 eingeführten Änderungen auch auf Python 3.5.x zurückportiert.

Das Modul typing hat eine stark verbesserte Unterstützung für generische Typ-Aliase. Zum Beispiel ist Dict[str, Tuple[S, T]] nun eine gültige Typ-Annotation. (Beigetragen von Guido van Rossum in Github #195.)

Die Klasse typing.ContextManager wurde hinzugefügt, um contextlib.AbstractContextManager darzustellen. (Beigetragen von Brett Cannon in bpo-25609.)

Die Klasse typing.Collection wurde hinzugefügt, um collections.abc.Collection darzustellen. (Beigetragen von Ivan Levkivskyi in bpo-27598.)

Die Typkonstruktion typing.ClassVar wurde hinzugefügt, um Klassenvariablen zu markieren. Wie in PEP 526 eingeführt, zeigt eine Typannotation einer Variable, die in ClassVar eingekapselt ist, an, dass ein bestimmtes Attribut als Klassenvariable verwendet werden soll und nicht auf Instanzen dieser Klasse gesetzt werden darf. (Beigetragen von Ivan Levkivskyi in Github #280.)

Eine neue Konstante TYPE_CHECKING wurde hinzugefügt, die von statischen Typ-Checkern als True angenommen wird, zur Laufzeit jedoch False ist. (Beigetragen von Guido van Rossum in Github #230.)

Eine neue Hilfsfunktion NewType() wurde hinzugefügt, um leichte, eigenständige Typen für Annotationen zu erstellen.

from typing import NewType

UserId = NewType('UserId', int)
some_id = UserId(524313)

Der statische Typ-Checker wird den neuen Typ so behandeln, als wäre er eine Unterklasse des ursprünglichen Typs. (Beigetragen von Ivan Levkivskyi in Github #189.)

unicodedata

Das Modul unicodedata verwendet nun Daten von Unicode 9.0.0. (Beigetragen von Benjamin Peterson.)

unittest.mock

Die Klasse Mock hat die folgenden Verbesserungen erhalten:

urllib.request

Wenn eine HTTP-Anfrage einen Datei- oder iterierbaren Body hat (außer einem Bytes-Objekt) und keinen Content-Length Header, verwendet AbstractHTTPHandler nun statt eines Fehlers die Chunked Transfer Encoding. (Beigetragen von Demian Brecht und Rolf Krahl in bpo-12319.)

urllib.robotparser

RobotFileParser unterstützt nun die Erweiterungen Crawl-delay und Request-rate. (Beigetragen von Nikolay Bogoychev in bpo-16099.)

venv

venv akzeptiert einen neuen Parameter --prompt. Dieser Parameter bietet ein alternatives Präfix für die virtuelle Umgebung. (Vorgeschlagen von Łukasz Balcerzak und portiert zu 3.6 von Stéphane Wirtel in bpo-22829.)

warnings

Ein neuer optionaler Parameter source wurde zur Funktion warnings.warn_explicit() hinzugefügt: das zerstörte Objekt, das eine ResourceWarning emittiert hat. Ein source-Attribut wurde ebenfalls zu warnings.WarningMessage hinzugefügt (Beigetragen von Victor Stinner in bpo-26568 und bpo-26567).

Wenn eine ResourceWarning-Warnung protokolliert wird, wird nun das Modul tracemalloc verwendet, um den Traceback abzurufen, an dem das zerstörte Objekt alloziert wurde.

Beispiel mit dem Skript example.py

import warnings

def func():
    return open(__file__)

f = func()
f = None

Ausgabe des Befehls python3.6 -Wd -X tracemalloc=5 example.py

example.py:7: ResourceWarning: unclosed file <_io.TextIOWrapper name='example.py' mode='r' encoding='UTF-8'>
  f = None
Object allocated at (most recent call first):
  File "example.py", lineno 4
    return open(__file__)
  File "example.py", lineno 6
    f = func()

Der "Object allocated at" Traceback ist neu und wird nur angezeigt, wenn tracemalloc Python-Speicherallokationen verfolgt und das Modul warnings bereits importiert wurde.

winreg

Der 64-Bit-Ganzzahltyp REG_QWORD wurde hinzugefügt. (Beigetragen von Clement Rouault in bpo-23026.)

winsound

Schlüsselwortargumente können nun an Beep, MessageBeep und PlaySound übergeben werden (bpo-27982).

xmlrpc.client

Das Modul xmlrpc.client unterstützt nun das Entpacken zusätzlicher Datentypen, die von der Apache XML-RPC-Implementierung für numerische Werte und None verwendet werden. (Beigetragen von Serhiy Storchaka in bpo-26885.)

zipfile

Eine neue Klassenmethode ZipInfo.from_file() ermöglicht die Erstellung einer ZipInfo-Instanz aus einer Datei im Dateisystem. Eine neue Methode ZipInfo.is_dir() kann verwendet werden, um zu prüfen, ob die ZipInfo-Instanz ein Verzeichnis repräsentiert. (Beigetragen von Thomas Kluyver in bpo-26039.)

Die Methode ZipFile.open() kann nun zum Schreiben von Daten in eine ZIP-Datei sowie zum Extrahieren von Daten verwendet werden. (Beigetragen von Thomas Kluyver in bpo-26039.)

zlib

Die Funktionen compress() und decompress() akzeptieren nun Schlüsselwortargumente. (Beigetragen von Aviv Palivoda in bpo-26243 und Xiang Zhang in bpo-16764.)

Optimierungen

  • Der Python-Interpreter verwendet nun einen 16-Bit-Wordcode anstelle von Bytecode, was eine Reihe von Opcode-Optimierungen ermöglichte. (Beigetragen von Demur Rumed mit Beiträgen und Überprüfungen von Serhiy Storchaka und Victor Stinner in bpo-26647 und bpo-28050.)

  • Die Klasse asyncio.Future hat nun eine optimierte C-Implementierung. (Beigetragen von Yury Selivanov und INADA Naoki in bpo-26081.)

  • Die Klasse asyncio.Task hat nun eine optimierte C-Implementierung. (Beigetragen von Yury Selivanov in bpo-28544.)

  • Verschiedene Implementierungsverbesserungen im Modul typing (wie z.B. Caching von generischen Typen) ermöglichen Leistungssteigerungen von bis zu 30-mal und reduzierten Speicherbedarf.

  • Der ASCII-Dekoder ist nun bis zu 60-mal schneller für die Fehlerbehandler surrogateescape, ignore und replace (Beigetragen von Victor Stinner in bpo-24870).

  • Die ASCII- und Latin1-Encoder sind nun bis zu 3-mal schneller für den Fehlerbehandler surrogateescape (Beigetragen von Victor Stinner in bpo-25227).

  • Der UTF-8-Encoder ist nun bis zu 75-mal schneller für die Fehlerbehandler ignore, replace, surrogateescape, surrogatepass (Beigetragen von Victor Stinner in bpo-25267).

  • Der UTF-8-Dekoder ist nun bis zu 15-mal schneller für die Fehlerbehandler ignore, replace und surrogateescape (Beigetragen von Victor Stinner in bpo-25301).

  • bytes % args ist nun bis zu 2-mal schneller. (Beigetragen von Victor Stinner in bpo-25349).

  • bytearray % args ist nun zwischen 2,5 und 5-mal schneller. (Beigetragen von Victor Stinner in bpo-25399).

  • Optimieren Sie bytes.fromhex() und bytearray.fromhex(): Sie sind nun zwischen 2x und 3,5x schneller. (Beigetragen von Victor Stinner in bpo-25401).

  • Optimieren Sie bytes.replace(b'', b'.') und bytearray.replace(b'', b'.'): bis zu 80 % schneller. (Beigetragen von Josh Snider in bpo-26574).

  • Allokatorfunktionen der Domäne PyMem_Malloc() (PYMEM_DOMAIN_MEM) verwenden nun den pymalloc-Speicherallokator anstelle der malloc()-Funktion der C-Bibliothek. Der pymalloc-Allokator ist für Objekte optimiert, die kleiner oder gleich 512 Bytes sind und eine kurze Lebensdauer haben, und verwendet malloc() für größere Speicherblöcke. (Beigetragen von Victor Stinner in bpo-26249).

  • pickle.load() und pickle.loads() sind nun bis zu 10 % schneller beim Deserialisieren vieler kleiner Objekte (Beigetragen von Victor Stinner in bpo-27056).

  • Das Übergeben von Schlüsselwortargumenten an eine Funktion verursacht einen Overhead im Vergleich zur Übergabe von Positionsargumenten. Nun ist bei Erweiterungsfunktionen, die mit Hilfe von Argument Clinic implementiert sind, dieser Overhead signifikant reduziert. (Beigetragen von Serhiy Storchaka in bpo-27574).

  • Optimierte Funktionen glob() und iglob() im Modul glob; sie sind nun etwa 3–6 mal schneller. (Beigetragen von Serhiy Storchaka in bpo-25596).

  • Optimierte Globbing-Funktionen im Modul pathlib durch die Verwendung von os.scandir(); dies ist nun etwa 1,5–4 mal schneller. (Beigetragen von Serhiy Storchaka in bpo-26032).

  • Die Leistung beim Parsen, Iterieren und Deepcopy von xml.etree.ElementTree wurde erheblich verbessert. (Beigetragen von Serhiy Storchaka in bpo-25638, bpo-25873 und bpo-25869.)

  • Die Erstellung von fractions.Fraction-Instanzen aus Gleitkommazahlen und Dezimalzahlen ist nun 2 bis 3 mal schneller. (Beigetragen von Serhiy Storchaka in bpo-25971.)

Build- und C-API-Änderungen

  • Python erfordert nun einige C99-Unterstützung in der Toolchain zum Bauen. Vor allem verwendet Python nun Standard-Ganzzahltypen und Makros anstelle von benutzerdefinierten Makros wie PY_LONG_LONG. Weitere Informationen finden Sie in PEP 7 und bpo-17884.

  • Das Cross-Kompilieren von CPython mit dem Android NDK und einer Android API-Stufe von 21 (Android 5.0 Lollipop) oder höher ist erfolgreich. Obwohl Android noch keine unterstützte Plattform ist, läuft die Python-Testsuite auf dem Android-Emulator mit nur etwa 16 fehlgeschlagenen Tests. Siehe das Android-Meta-Issue bpo-26865.

  • Das Konfigurationsflag --enable-optimizations wurde hinzugefügt. Wenn es aktiviert ist, werden teure Optimierungen wie PGO aktiviert. (Ursprünglicher Patch von Alecsandru Patrascu von Intel in bpo-26359.)

  • Der GIL muss nun gehalten werden, wenn Allokatorfunktionen der Domänen PYMEM_DOMAIN_OBJ (z.B. PyObject_Malloc()) und PYMEM_DOMAIN_MEM (z.B. PyMem_Malloc()) aufgerufen werden.

  • Neue API Py_FinalizeEx(), die angibt, ob das Leeren gepufferter Daten fehlgeschlagen ist. (Beigetragen von Martin Panter in bpo-5319.)

  • PyArg_ParseTupleAndKeywords() unterstützt nun Positions-only Parameter. Positions-only Parameter werden durch leere Namen definiert. (Beigetragen von Serhiy Storchaka in bpo-26282).

  • Die Methode PyTraceback_Print kürzt nun lange Sequenzen von wiederholten Zeilen als "[Vorherige Zeile {count} mehr mal]". (Beigetragen von Emanuel Barry in bpo-26823.)

  • Die neue Funktion PyErr_SetImportErrorSubclass() ermöglicht die Angabe einer Unterklasse von ImportError, die ausgelöst werden soll. (Beigetragen von Eric Snow in bpo-15767.)

  • Die neue Funktion PyErr_ResourceWarning() kann verwendet werden, um eine ResourceWarning zu erzeugen, die die Quelle der Ressourcenallokation angibt. (Beigetragen von Victor Stinner in bpo-26567.)

  • Die neue Funktion PyOS_FSPath() gibt die Dateisystem-Repräsentation eines pfadähnlichen Objekts zurück. (Beigetragen von Brett Cannon in bpo-27186.)

  • Die Funktionen PyUnicode_FSConverter() und PyUnicode_FSDecoder() akzeptieren nun pfadähnliche Objekte.

Weitere Verbesserungen

  • Wenn --version (Kurzform: -V) zweimal angegeben wird, gibt Python sys.version für detaillierte Informationen aus.

    $ ./python -VV
    Python 3.6.0b4+ (3.6:223967b49e49+, Nov 21 2016, 20:55:04)
    [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]
    

Veraltet

Neue Schlüsselwörter

async und await sollten nicht als Namen für Variablen, Klassen, Funktionen oder Module verwendet werden. Eingeführt durch PEP 492 in Python 3.5, werden sie in Python 3.7 zu echten Schlüsselwörtern. Ab Python 3.6 wird die Verwendung von async oder await als Namen eine DeprecationWarning generieren.

Veraltetes Python-Verhalten

Das Auslösen der StopIteration-Exception innerhalb eines Generators generiert nun eine DeprecationWarning und wird in Python 3.7 eine RuntimeError auslösen. Siehe PEP 479: Änderung der StopIteration-Behandlung innerhalb von Generatoren für Details.

Die Methode __aiter__() wird nun direkt einen asynchronen Iterator zurückgeben, anstatt wie bisher ein Awaitable. Das letztere Verhalten wird eine DeprecationWarning auslösen. Die Rückwärtskompatibilität wird in Python 3.7 entfernt. (Beigetragen von Yury Selivanov in bpo-27243.)

Ein Backslash-Zeichenpaar, das keine gültige Escape-Sequenz ist, generiert nun eine DeprecationWarning. Obwohl dies schließlich zu einem SyntaxError werden wird, wird dies nicht in einigen Python-Versionen passieren. (Beigetragen von Emanuel Barry in bpo-27364.)

Beim Ausführen eines relativen Imports wird nun eine ImportWarning ausgelöst, wenn auf __name__ und __path__ aus dem aufrufenden Modul zurückgegriffen wird, wenn __spec__ oder __package__ nicht definiert sind. (Beigetragen von Rose Ames in bpo-25791.)

Veraltete Python-Module, Funktionen und Methoden

asynchat

Das Modul asynchat wurde zugunsten von asyncio als veraltet markiert. (Beigetragen von Mariatta in bpo-25002.)

asyncore

Das Modul asyncore wurde zugunsten von asyncio als veraltet markiert. (Beigetragen von Mariatta in bpo-25002.)

dbm

Im Gegensatz zu anderen dbm-Implementierungen erstellt das Modul dbm.dumb Datenbanken mit dem Modus 'rw' und erlaubt die Modifizierung der mit dem Modus 'r' geöffneten Datenbank. Dieses Verhalten ist nun veraltet und wird in 3.8 entfernt. (Beigetragen von Serhiy Storchaka in bpo-21708.)

distutils

Das undokumentierte Argument extra_path für den Konstruktor distutils.Distribution gilt nun als veraltet und löst eine Warnung aus, wenn es gesetzt ist. Die Unterstützung für diesen Parameter wird in einer zukünftigen Python-Version entfernt. Siehe bpo-27919 für Details.

grp

Die Unterstützung für nicht-ganzzahlige Argumente in getgrgid() ist veraltet. (Beigetragen von Serhiy Storchaka in bpo-26129.)

importlib

Die Methoden importlib.machinery.SourceFileLoader.load_module() und importlib.machinery.SourcelessFileLoader.load_module() sind nun veraltet. Sie waren die letzten verbleibenden Implementierungen von importlib.abc.Loader.load_module() in importlib, die in früheren Python-Versionen nicht zugunsten von importlib.abc.Loader.exec_module() als veraltet markiert worden waren.

Die Klasse importlib.machinery.WindowsRegistryFinder ist nun veraltet. Ab 3.6.0 wird sie standardmäßig zu sys.meta_path hinzugefügt (unter Windows), dies kann sich jedoch in zukünftigen Versionen ändern.

os

Die undokumentierte Unterstützung für allgemeine bytes-ähnliche Objekte als Pfade in os-Funktionen, compile() und ähnlichen Funktionen ist nun veraltet. (Beigetragen von Serhiy Storchaka in bpo-25791 und bpo-26754.)

re

Die Unterstützung für Inline-Flags (?buchstaben) mitten im regulären Ausdruck ist veraltet und wird in einer zukünftigen Python-Version entfernt. Flags am Anfang eines regulären Ausdrucks sind weiterhin erlaubt. (Beigetragen von Serhiy Storchaka in bpo-22493.)

ssl

OpenSSL 0.9.8, 1.0.0 und 1.0.1 sind veraltet und werden nicht mehr unterstützt. Zukünftig wird das Modul ssl mindestens OpenSSL 1.0.2 oder 1.1.0 benötigen.

SSL-bezogene Argumente wie certfile, keyfile und check_hostname in ftplib, http.client, imaplib, poplib und smtplib wurden zugunsten von context als veraltet markiert. (Beigetragen von Christian Heimes in bpo-28022.)

Einige Protokolle und Funktionen des Moduls ssl sind nun veraltet. Einige Funktionen werden in zukünftigen Versionen von OpenSSL nicht mehr verfügbar sein. Andere Funktionen sind zugunsten einer anderen API veraltet. (Beigetragen von Christian Heimes in bpo-28022 und bpo-26470.)

tkinter

Das Modul tkinter.tix ist nun veraltet. tkinter-Benutzer sollten stattdessen tkinter.ttk verwenden.

venv

Das Skript pyvenv wurde zugunsten von python3 -m venv als veraltet erklärt. Dies vermeidet Verwirrung darüber, mit welchem Python-Interpreter pyvenv verbunden ist und somit, welcher Python-Interpreter von der virtuellen Umgebung verwendet wird. (Beigetragen von Brett Cannon in bpo-25154.)

xml

  • Als Schutz gegen die Abfrage von DTD 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.)

Veraltete Funktionen und Typen der C-API

Die undokumentierten Funktionen PyUnicode_AsEncodedObject(), PyUnicode_AsDecodedObject(), PyUnicode_AsEncodedUnicode() und PyUnicode_AsDecodedUnicode() sind nun veraltet. Verwenden Sie stattdessen die generische Codec-basierte API.

Veraltete Build-Optionen

Das Konfigurationsflag --with-system-ffi ist nun standardmäßig auf Nicht-macOS UNIX-Plattformen aktiviert. Es kann mit --without-system-ffi deaktiviert werden, aber die Verwendung des Flags ist veraltet und wird in Python 3.7 nicht mehr akzeptiert. macOS ist von dieser Änderung nicht betroffen. Beachten Sie, dass viele OS-Anbieter bereits das Flag --with-system-ffi verwenden, wenn sie ihr System-Python erstellen.

Entfernt

Entfernung von APIs und Features

  • Unbekannte Escapes, die aus '\' und einem ASCII-Buchstaben in regulären Ausdrücken bestehen, führen nun zu einem Fehler. In Ersetzungsvorlagen für re.sub() sind sie weiterhin erlaubt, aber veraltet. Das Flag re.LOCALE kann nun nur noch mit binären Mustern verwendet werden.

  • inspect.getmoduleinfo() wurde entfernt (war seit CPython 3.3 veraltet). inspect.getmodulename() sollte verwendet werden, um den Modulnamen für einen gegebenen Pfad zu erhalten. (Beigetragen von Yury Selivanov in bpo-13248.)

  • traceback.Ignore-Klasse und die Methoden traceback.usage, traceback.modname, traceback.fullmodname, traceback.find_lines_from_code, traceback.find_lines, traceback.find_strings, traceback.find_executable_lines wurden aus dem Modul traceback entfernt. Dies waren undokumentierte, seit Python 3.2 veraltete Methoden, und die entsprechende Funktionalität ist über private Methoden verfügbar.

  • Die Dummy-Methoden tk_menuBar() und tk_bindForTraversal() in den tkinter Widget-Klassen wurden entfernt (die entsprechenden Tk-Befehle waren seit Tk 4.0 obsolet).

  • Die Methode open() der Klasse zipfile.ZipFile unterstützt nicht mehr den Modus 'U' (war seit Python 3.4 veraltet). Verwenden Sie io.TextIOWrapper zum Lesen komprimierter Textdateien im Modus für universelle Zeilenumbrüche.

  • Die undokumentierten Module IN, CDROM, DLFCN, TYPES, CDIO und STROPTS wurden entfernt. Sie waren in den plattformspezifischen Verzeichnissen Lib/plat-*/ verfügbar, waren aber chronisch veraltet, inkonsistent über Plattformen hinweg verfügbar und wurden nicht gepflegt. Das Skript, das diese Module erstellte, ist weiterhin in der Quellcodeverteilung unter Tools/scripts/h2py.py verfügbar.

  • Die veraltete Klasse asynchat.fifo wurde entfernt.

Portierung auf Python 3.6

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

Änderungen im Verhalten des Kommandos ‚python‘

  • Die Ausgabe eines speziellen Python-Builds mit definierten Makros COUNT_ALLOCS, SHOW_ALLOC_COUNT oder SHOW_TRACK_COUNT ist nun standardmäßig deaktiviert. Sie kann mit der Option -X showalloccount wieder aktiviert werden. Sie gibt nun auf stderr statt auf stdout aus. (Beigetragen von Serhiy Storchaka in bpo-23034.)

Änderungen in der Python-API

  • open() erlaubt nicht mehr die Kombination des Modus-Flags 'U' mit '+'. (Beigetragen von Jeff Balogh und John O’Connor in bpo-2091.)

  • sqlite3 committet keine offene Transaktion mehr implizit vor DDL-Anweisungen.

  • Unter Linux blockiert os.urandom() nun, bis der Urandom-Entropiepool des Systems initialisiert ist, um die Sicherheit zu erhöhen.

  • Wenn importlib.abc.Loader.exec_module() definiert ist, muss auch importlib.abc.Loader.create_module() definiert sein.

  • PyErr_SetImportError() setzt nun TypeError, wenn sein Argument msg nicht gesetzt ist. Zuvor wurde nur NULL zurückgegeben.

  • Das Format des Attributs co_lnotab von Code-Objekten wurde geändert, um eine negative Zeilennummerndifferenz zu unterstützen. Standardmäßig gibt Python keinen Bytecode mit einer negativen Zeilennummerndifferenz aus. Funktionen, die frame.f_lineno, PyFrame_GetLineNumber() oder PyCode_Addr2Line() verwenden, sind nicht betroffen. Funktionen, die co_lnotab direkt dekodieren, sollten aktualisiert werden, um einen vorzeichenbehafteten 8-Bit-Integer-Typ für die Zeilennummerndifferenz zu verwenden, dies ist jedoch nur erforderlich, um Anwendungen zu unterstützen, die eine negative Zeilennummerndifferenz verwenden. Informationen zum Format von co_lnotab und dessen Dekodierung finden Sie unter Objects/lnotab_notes.txt, und die Begründung finden Sie in PEP 511.

  • Die Funktionen im Modul compileall geben nun Booleans zurück, anstatt 1 oder 0, um Erfolg bzw. Misserfolg darzustellen. Da Booleans eine Unterklasse von Integers sind, sollte dies nur dann ein Problem darstellen, wenn Sie Identitätsprüfungen auf 1 oder 0 durchführen. Siehe bpo-25768.

  • Das Lesen des Attributs port von Ergebnissen von urllib.parse.urlsplit() und urlparse() löst nun bei ungültigen Werten eine ValueError aus, anstatt None zurückzugeben. Siehe bpo-20059.

  • Das Modul imp löst nun eine DeprecationWarning anstelle einer PendingDeprecationWarning aus.

  • Die folgenden Module haben fehlende APIs zu ihren __all__-Attributen hinzugefügt, um mit den dokumentierten APIs übereinzustimmen: calendar, cgi, csv, ElementTree, enum, fileinput, ftplib, logging, mailbox, mimetypes, optparse, plistlib, smtpd, subprocess, tarfile, threading und wave. Das bedeutet, dass sie neue Symbole exportieren, wenn import * verwendet wird. (Beigetragen von Joel Taddei und Jacek Kołodziej in bpo-23883.)

  • Bei einer relativen Importierung wird eine ImportWarning ausgelöst, wenn __package__ nicht mit __spec__.parent übereinstimmt. (Beigetragen von Brett Cannon in bpo-25791.)

  • Wenn eine relative Importierung durchgeführt wird und kein Elternpaket bekannt ist, wird eine ImportError ausgelöst. Zuvor konnte eine SystemError ausgelöst werden. (Beigetragen von Brett Cannon in bpo-18018.)

  • Server, die auf dem Modul socketserver basieren, einschließlich der in http.server, xmlrpc.server und wsgiref.simple_server definierten, fangen nun nur noch Ausnahmen ab, die von Exception abgeleitet sind. Wenn daher ein Request-Handler eine Ausnahme wie SystemExit oder KeyboardInterrupt auslöst, wird handle_error() nicht mehr aufgerufen und die Ausnahme beendet einen Single-Threaded-Server. (Beigetragen von Martin Panter in bpo-23430.)

  • spwd.getspnam() löst nun eine PermissionError anstelle einer KeyError aus, wenn der Benutzer keine Berechtigungen hat.

  • Die Methode socket.socket.close() löst nun eine Ausnahme aus, wenn ein Fehler (z. B. EBADF) vom zugrundeliegenden Systemaufruf gemeldet wurde. (Beigetragen von Martin Panter in bpo-26685.)

  • Das Argument decode_data für die Konstruktoren von smtpd.SMTPChannel und smtpd.SMTPServer ist nun standardmäßig False. Das bedeutet, dass das an process_message() übergebene Argument nun standardmäßig ein Bytes-Objekt ist und process_message() mit Schlüsselwortargumenten aufgerufen wird. Code, der bereits gemäß der von 3.5 generierten Veraltungswarnung aktualisiert wurde, ist davon nicht betroffen.

  • Alle optionalen Argumente der Funktionen dump(), dumps(), load() und loads() sowie der Konstruktoren der Klassen JSONEncoder und JSONDecoder im Modul json sind nun keyword-only. (Beigetragen von Serhiy Storchaka in bpo-18726.)

  • Unterklassen von type, die type.__new__ nicht überschreiben, dürfen die Ein-Argument-Form zur Ermittlung des Typs eines Objekts nicht mehr verwenden.

  • Im Rahmen von PEP 487 wird die Behandlung von Schlüsselwortargumenten, die an type übergeben werden (außer dem Metaklassen-Hinweis metaclass), nun konsistent an object.__init_subclass__() delegiert. Dies bedeutet, dass sowohl type.__new__ als auch type.__init__ nun beliebige Schlüsselwortargumente akzeptieren, aber object.__init_subclass__() (das aus type.__new__ aufgerufen wird) diese standardmäßig ablehnt. Benutzerdefinierte Metaklassen, die zusätzliche Schlüsselwortargumente akzeptieren, müssen ihre Aufrufe von type.__new__ (entweder direkt oder über super) entsprechend anpassen.

  • In distutils.command.sdist.sdist wurde das Attribut default_format entfernt und wird nicht mehr beachtet. Stattdessen ist das gzippte Tarfile-Format auf allen Plattformen der Standard, und es wird keine plattformspezifische Auswahl getroffen. In Umgebungen, in denen Distributionen unter Windows erstellt werden und Zip-Distributionen erforderlich sind, konfigurieren Sie das Projekt mit einer setup.cfg-Datei, die Folgendes enthält:

    [sdist]
    formats=zip
    

    Dieses Verhalten wurde auch mit Setuptools 26.0.0 auf frühere Python-Versionen zurückportiert.

  • Im Modul urllib.request und in der Methode http.client.HTTPConnection.request() wird, wenn kein Content-Length-Headerfeld angegeben wurde und der Request-Body ein Dateiobjekt ist, dieser nun mit HTTP 1.1 Chunked Encoding gesendet. Wenn ein Dateiobjekt an einen HTTP 1.0 Server gesendet werden muss, muss der Content-Length-Wert nun vom Aufrufer angegeben werden. (Beigetragen von Demian Brecht und Rolf Krahl mit Anpassungen von Martin Panter in bpo-12319.)

  • Der DictReader gibt nun Zeilen vom Typ OrderedDict zurück. (Beigetragen von Steve Holden in bpo-27842.)

  • Das Konstante crypt.METHOD_CRYPT wird nicht mehr zu crypt.methods hinzugefügt, wenn es von der Plattform nicht unterstützt wird. (Beigetragen von Victor Stinner in bpo-25287.)

  • Die Argumente verbose und rename für namedtuple() sind nun schlüsselwortorientiert. (Beigetragen von Raymond Hettinger in bpo-25628.)

  • Unter Linux sucht ctypes.util.find_library() nun in LD_LIBRARY_PATH nach Shared Libraries. (Beigetragen von Vinay Sajip in bpo-9998.)

  • Die Klasse imaplib.IMAP4 behandelt nun Flags, die das Zeichen ']' enthalten, in vom Server gesendeten Nachrichten, um die Kompatibilität mit der realen Welt zu verbessern. (Beigetragen von Lita Cho in bpo-21815.)

  • Die Funktion mmap.mmap.write() gibt nun die Anzahl der geschriebenen Bytes zurück, wie andere Schreibmethoden auch. (Beigetragen von Jakub Stasiak in bpo-26335.)

  • Die Funktionen pkgutil.iter_modules() und pkgutil.walk_packages() geben nun benannte Tupel vom Typ ModuleInfo zurück. (Beigetragen von Ramchandra Apte in bpo-17211.)

  • re.sub() löst nun einen Fehler bei ungültigen numerischen Gruppenreferenzen in Ersetzungsvorlagen aus, auch wenn das Muster nicht in der Zeichenkette gefunden wird. Die Fehlermeldung für ungültige Gruppenreferenzen enthält nun den Gruppenindex und die Position der Referenz. (Beigetragen von SilentGhost, Serhiy Storchaka in bpo-25953.)

  • zipfile.ZipFile löst nun NotImplementedError für nicht erkannte Kompressionswerte aus. Zuvor wurde eine einfache RuntimeError ausgelöst. Außerdem löst das Aufrufen von ZipFile-Methoden auf einer geschlossenen ZipFile oder das Aufrufen der Methode write() auf einer mit dem Modus 'r' erstellten ZipFile eine ValueError aus. Zuvor wurde in diesen Szenarien eine RuntimeError ausgelöst.

  • Wenn benutzerdefinierte Metaklassen mit Null-Argument-super() oder direkten Referenzen von Methoden auf die implizite __class__ Closure-Variable kombiniert werden, muss der implizite __classcell__-Namespace-Eintrag nun zur Initialisierung an type.__new__ übergeben werden. Andernfalls wird in Python 3.6 eine DeprecationWarning und in Python 3.8 eine RuntimeError ausgelöst.

  • Mit der Einführung von ModuleNotFoundError können Konsumenten des Importsystems damit beginnen, von Importsystem-Ersetzungen zu erwarten, dass diese diese spezifischere Ausnahme auslösen, wenn dies angebracht ist, anstatt der weniger spezifischen ImportError. Um zukünftige Kompatibilität mit solchen Konsumenten zu gewährleisten, müssen Implementierer alternativer Importsysteme, die __import__() vollständig ersetzen, ihre Implementierungen aktualisieren, um die neue Unterklasse auszulösen, wenn ein Modul überhaupt nicht gefunden werden kann. Implementierer konformer Plugins für das Standard-Importsystem sollten keine Änderungen vornehmen müssen, da das Standard-Importsystem die neue Unterklasse auslöst, wenn dies angebracht ist.

Änderungen in der C-API

  • Der Speicher-Allocator der Familie PyMem_Malloc() verwendet nun den pymalloc-Allocator anstelle des System-Allocators malloc(). Anwendungen, die PyMem_Malloc() aufrufen, ohne den GIL zu halten, können nun abstürzen. Setzen Sie die Umgebungsvariable PYTHONMALLOC auf debug, um die Verwendung von Speicher-Allocatoren in Ihrer Anwendung zu validieren. Siehe bpo-26249.

  • Py_Exit() (und der Hauptinterpreter) überschreiben nun den Exit-Status mit 120, wenn das Leeren von gepufferten Daten fehlschlug. Siehe bpo-5319.

CPython Bytecode-Änderungen

Es gab mehrere wichtige Änderungen am Bytecode in Python 3.6.

  • Der Python-Interpreter verwendet nun ein 16-Bit-Wordcode anstelle von Bytecode. (Beigetragen von Demur Rumed mit Input und Reviews von Serhiy Storchaka und Victor Stinner in bpo-26647 und bpo-28050.)

  • Die neuen Opcodes FORMAT_VALUE und BUILD_STRING als Teil der Implementierung von formatierten Zeichenkettenliteralen. (Beigetragen von Eric Smith in bpo-25483 und Serhiy Storchaka in bpo-27078.)

  • Der neue Opcode BUILD_CONST_KEY_MAP zur Optimierung der Erstellung von Dictionaries mit konstanten Schlüsseln. (Beigetragen von Serhiy Storchaka in bpo-27140.)

  • Die Opcodes für Funktionsaufrufe wurden für bessere Leistung und einfachere Implementierung stark überarbeitet. Die Opcodes MAKE_FUNCTION, CALL_FUNCTION, CALL_FUNCTION_KW und BUILD_MAP_UNPACK_WITH_CALL wurden modifiziert, die neuen Opcodes CALL_FUNCTION_EX und BUILD_TUPLE_UNPACK_WITH_CALL wurden hinzugefügt, und die Opcodes CALL_FUNCTION_VAR, CALL_FUNCTION_VAR_KW und MAKE_CLOSURE wurden entfernt. (Beigetragen von Demur Rumed in bpo-27095 und Serhiy Storchaka in bpo-27213, bpo-28257.)

  • Die neuen Opcodes SETUP_ANNOTATIONS und STORE_ANNOTATION wurden hinzugefügt, um die neue Syntax für Variablenannotationen zu unterstützen. (Beigetragen von Ivan Levkivskyi in bpo-27985.)

Bemerkenswerte Änderungen in Python 3.6.2

Neues Build-Ziel make regen-all

Um die Kreuzkompilierung zu vereinfachen und sicherzustellen, dass CPython zuverlässig ohne eine bereits vorhandene Python-Version kompiliert werden kann, versucht das Autotools-basierte Build-System nicht mehr, generierte Dateien implizit basierend auf den Änderungszeiten neu zu kompilieren.

Stattdessen wurde ein neues Kommando make regen-all hinzugefügt, um die Neubereitstellung dieser Dateien zu erzwingen, wenn dies gewünscht ist (z. B. nachdem bereits eine erste Python-Version basierend auf den vorgenommenen Generierungen erstellt wurde).

Es sind auch selektivere Regenerationsziele definiert - siehe Makefile.pre.in für Details.

(Beigetragen von Victor Stinner in bpo-23404.)

Hinzugefügt in Version 3.6.2.

Entfernung des Build-Ziels make touch

Das Build-Ziel make touch, das zuvor verwendet wurde, um die implizite Neubereitstellung generierter Dateien durch Aktualisierung ihrer Änderungszeiten anzufordern, wurde entfernt.

Es wurde durch das neue Ziel make regen-all ersetzt.

(Beigetragen von Victor Stinner in bpo-23404.)

Geändert in Version 3.6.2.

Bemerkenswerte Änderungen in Python 3.6.4

Das Singleton PyExc_RecursionErrorInst, das Teil der öffentlichen API war, wurde entfernt, da seine niemals gelöschten Member beim finalen Beenden des Interpreters zu einem Segmentierungsfehler führen können. (Beigetragen von Xavier de Gaye in bpo-22898 und bpo-30697.)

Bemerkenswerte Änderungen in Python 3.6.5

Die Funktion locale.localeconv() setzt in einigen Fällen vorübergehend die Locale LC_CTYPE auf die Locale LC_NUMERIC. (Beigetragen von Victor Stinner in bpo-31900.)

Bemerkenswerte Änderungen in Python 3.6.7

Die Module xml.dom.minidom und xml.sax verarbeiten standardmäßig keine externen Entitäten mehr. Siehe auch gh-61441.

In 3.6.7 gibt das Modul tokenize nun implizit einen 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.6.10

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.6.13

Frühere Python-Versionen erlaubten die Verwendung von sowohl ; als auch & als Trennzeichen für Query-Parameter in urllib.parse.parse_qs() und urllib.parse.parse_qsl(). Aus Sicherheitsgründen und zur Einhaltung neuerer W3C-Empfehlungen wurde dies geändert, um nur ein einzelnes Trennzeichen zu erlauben, wobei & als Standard gilt. Diese Änderung wirkt sich auch auf cgi.parse() und cgi.parse_multipart() aus, da diese intern die betroffenen Funktionen verwenden. Weitere Details finden Sie in der jeweiligen Dokumentation. (Beigetragen von Adam Goldschmidt, Senthil Kumaran und Ken Jin in bpo-42967.)

Bemerkenswerte Änderungen in Python 3.6.14

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 einige Angriffsformen. Gemäß der WHATWG-Spezifikation, die RFC 3986 aktualisiert, werden ASCII-Zeilenumbruchszeichen \n, \r und Tabulatorzeichen \t von der Parserfunktion urllib.parse() aus der URL entfernt, um solche Angriffe zu verhindern. Die zu entfernenden Zeichen werden durch eine neue Modulvariable urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE gesteuert. (Siehe gh-88048)