Was ist neu in Python 3.5

Herausgeber:

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

Dieser Artikel erklärt die neuen Features in Python 3.5 im Vergleich zu 3.4. Python 3.5 wurde am 13. September 2015 veröffentlicht. Eine vollständige Liste der Änderungen finden Sie im Änderungsprotokoll.

Siehe auch

PEP 478 - Python 3.5 Release Schedule

Zusammenfassung – Release-Highlights

Neue Syntaxfunktionen

  • PEP 492, Coroutinen mit async und await Syntax.

  • PEP 465, ein neuer Operator für Matrixmultiplikation: a @ b.

  • PEP 448, zusätzliche Entpackungs-Generalisierungen.

Neue Bibliotheksmodule

Neue eingebaute Funktionen

  • bytes % args, bytearray % args: PEP 461 – Hinzufügen von %-Formatierung zu bytes und bytearray.

  • Neue Methoden bytes.hex(), bytearray.hex() und memoryview.hex(). (Beigesteuert von Arnon Yaari in bpo-9951.)

  • memoryview unterstützt jetzt Tupel-Indizierung (einschließlich mehrdimensionaler). (Beigesteuert von Antoine Pitrou in bpo-23632.)

  • Generatoren haben ein neues Attribut gi_yieldfrom, das das Objekt zurückgibt, das von yield from-Ausdrücken iteriert wird. (Beigesteuert von Benno Leslie und Yury Selivanov in bpo-24450.)

  • Eine neue Ausnahme RecursionError wird nun ausgelöst, wenn die maximale Rekursionstiefe erreicht ist. (Beigesteuert von Georg Brandl in bpo-19235.)

CPython-Implementierungsverbesserungen

  • Wenn das Gebietsschema LC_TYPE das POSIX-Gebietsschema (C-Gebietsschema) ist, verwenden sys.stdin und sys.stdout nun den Fehlerbehandler surrogateescape anstelle des Fehlerbehandlers strict. (Beigesteuert von Victor Stinner in bpo-19977.)

  • .pyo-Dateien werden nicht mehr verwendet und wurden durch ein flexibleres Schema ersetzt, das die Optimierungsstufe explizit in den .pyc-Namen aufnimmt. (Siehe PEP 488 Übersicht.)

  • Eingebaute und Erweiterungsmodule werden nun in einem mehrphasigen Prozess initialisiert, der dem Ladevorgang von Python-Modulen ähnelt. (Siehe PEP 489 Übersicht.)

Signifikante Verbesserungen in der Standardbibliothek

Sicherheitsverbesserungen

  • SSLv3 ist nun in der gesamten Standardbibliothek deaktiviert. Es kann immer noch durch manuelle Instanziierung eines ssl.SSLContext aktiviert werden. (Weitere Details finden Sie in bpo-22638; diese Änderung wurde in CPython 3.4 und 2.7 zurückportiert.)

  • Das Parsen von HTTP-Cookies ist nun strenger, um vor potenziellen Injection-Angriffen zu schützen. (Beigesteuert von Antoine Pitrou in bpo-22796.)

Windows-Verbesserungen

  • Ein neuer Installer für Windows hat den alten MSI ersetzt. Weitere Informationen finden Sie unter Verwendung von Python unter Windows.

  • Windows-Builds verwenden nun Microsoft Visual C++ 14.0, und Erweiterungsmodule sollten dasselbe verwenden.

Lesen Sie weiter für eine umfassende Liste der für den Benutzer sichtbaren Änderungen, einschließlich vieler weiterer kleiner Verbesserungen, CPython-Optimierungen, Deprecations und möglicher Portierungsprobleme.

Neue Funktionen

PEP 492 – Coroutinen mit async und await Syntax

PEP 492 verbessert die Unterstützung für asynchrones Programmieren in Python erheblich, indem awaitable Objekte, Coroutinen-Funktionen, asynchrone Iteration und asynchrone Kontextmanager hinzugefügt werden.

Coroutinen-Funktionen werden mit der neuen async def-Syntax deklariert.

>>> async def coro():
...     return 'spam'

Innerhalb einer Coroutinen-Funktion kann der neue await-Ausdruck verwendet werden, um die Ausführung der Coroutine zu unterbrechen, bis das Ergebnis verfügbar ist. Jedes Objekt kann *gewartet* werden, solange es das awaitable-Protokoll implementiert, indem es die Methode __await__() definiert.

PEP 492 fügt auch die async for-Anweisung für eine bequeme Iteration über asynchrone Iterables hinzu.

Ein Beispiel für einen rudimentären HTTP-Client, der mit der neuen Syntax geschrieben wurde

import asyncio

async def http_get(domain):
    reader, writer = await asyncio.open_connection(domain, 80)

    writer.write(b'\r\n'.join([
        b'GET / HTTP/1.1',
        b'Host: %b' % domain.encode('latin-1'),
        b'Connection: close',
        b'', b''
    ]))

    async for line in reader:
        print('>>>', line)

    writer.close()

loop = asyncio.get_event_loop()
try:
    loop.run_until_complete(http_get('example.com'))
finally:
    loop.close()

Ähnlich der asynchronen Iteration gibt es eine neue Syntax für asynchrone Kontextmanager. Das folgende Skript

import asyncio

async def coro(name, lock):
    print('coro {}: waiting for lock'.format(name))
    async with lock:
        print('coro {}: holding the lock'.format(name))
        await asyncio.sleep(1)
        print('coro {}: releasing the lock'.format(name))

loop = asyncio.get_event_loop()
lock = asyncio.Lock()
coros = asyncio.gather(coro(1, lock), coro(2, lock))
try:
    loop.run_until_complete(coros)
finally:
    loop.close()

wird ausgeben

coro 2: waiting for lock
coro 2: holding the lock
coro 1: waiting for lock
coro 2: releasing the lock
coro 1: holding the lock
coro 1: releasing the lock

Beachten Sie, dass sowohl async for als auch async with nur innerhalb einer Coroutinen-Funktion verwendet werden können, die mit async def deklariert wurde.

Coroutinen-Funktionen sind dazu bestimmt, innerhalb einer kompatiblen Event-Schleife ausgeführt zu werden, wie z.B. die asyncio Schleife.

Hinweis

Geändert in Version 3.5.2: Ab CPython 3.5.2 kann __aiter__ direkt asynchrone Iteratoren zurückgeben. Das Zurückgeben eines awaitable Objekts führt zu einem PendingDeprecationWarning.

Weitere Details finden Sie im Dokumentationsabschnitt Asynchrone Iteratoren.

Siehe auch

PEP 492 – Coroutinen mit async und await Syntax

PEP verfasst und implementiert von Yury Selivanov.

PEP 465 – Ein dedizierter Infix-Operator für Matrixmultiplikation

PEP 465 fügt den Infix-Operator @ für die Matrixmultiplikation hinzu. Derzeit implementieren keine eingebauten Python-Typen den neuen Operator. Er kann jedoch durch die Definition von __matmul__(), __rmatmul__() und __imatmul__() für reguläre, reflektierte und In-Place-Matrixmultiplikation implementiert werden. Die Semantik dieser Methoden ähnelt der von Methoden, die andere Infix-Arithmetikoperatoren definieren.

Matrixmultiplikation ist eine bemerkenswert häufige Operation in vielen Bereichen der Mathematik, Wissenschaft, Ingenieurwesen, und die Addition von @ ermöglicht das Schreiben von saubererem Code

S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)

anstelle von

S = dot((dot(H, beta) - r).T,
        dot(inv(dot(dot(H, V), H.T)), dot(H, beta) - r))

NumPy 1.10 hat Unterstützung für den neuen Operator.

>>> import numpy

>>> x = numpy.ones(3)
>>> x
array([ 1., 1., 1.])

>>> m = numpy.eye(3)
>>> m
array([[ 1., 0., 0.],
       [ 0., 1., 0.],
       [ 0., 0., 1.]])

>>> x @ m
array([ 1., 1., 1.])

Siehe auch

PEP 465 – Ein dedizierter Infix-Operator für Matrixmultiplikation

PEP verfasst von Nathaniel J. Smith; implementiert von Benjamin Peterson.

PEP 448 – Zusätzliche Entpackungs-Generalisierungen

PEP 448 erweitert die erlaubten Verwendungen des *-Iterable-Entpackungsoperators und des **-Dictionary-Entpackungsoperators. Es ist nun möglich, eine beliebige Anzahl von Entpackungen in Funktionsaufrufen zu verwenden.

>>> print(*[1], *[2], 3, *[4, 5])
1 2 3 4 5

>>> def fn(a, b, c, d):
...     print(a, b, c, d)
...

>>> fn(**{'a': 1, 'c': 3}, **{'b': 2, 'd': 4})
1 2 3 4

Ähnlich erlauben Tupel-, Listen-, Set- und Dictionary-Anzeigen mehrere Entpackungen (siehe Ausdruckslisten und Dictionary-Anzeigen).

>>> *range(4), 4
(0, 1, 2, 3, 4)

>>> [*range(4), 4]
[0, 1, 2, 3, 4]

>>> {*range(4), 4, *(5, 6, 7)}
{0, 1, 2, 3, 4, 5, 6, 7}

>>> {'x': 1, **{'y': 2}}
{'x': 1, 'y': 2}

Siehe auch

PEP 448 – Zusätzliche Entpackungs-Generalisierungen

PEP verfasst von Joshua Landau; implementiert von Neil Girdhar, Thomas Wouters und Joshua Landau.

PEP 461 – Prozent-Formatierungsunterstützung für bytes und bytearray

PEP 461 fügt Unterstützung für den % Interpolationsoperator für bytes und bytearray hinzu.

Obwohl Interpolation normalerweise als String-Operation betrachtet wird, gibt es Fälle, in denen die Interpolation auf bytes oder bytearrays sinnvoll ist, und die Arbeit, die zur Behebung dieser fehlenden Funktionalität erforderlich ist, beeinträchtigt die allgemeine Lesbarkeit des Codes. Dieses Problem ist besonders wichtig, wenn mit Wire-Format-Protokollen gearbeitet wird, die oft eine Mischung aus binären und ASCII-kompatiblen Texten sind.

Beispiele

>>> b'Hello %b!' % b'World'
b'Hello World!'

>>> b'x=%i y=%f' % (1, 2.5)
b'x=1 y=2.500000'

Unicode ist für %b nicht erlaubt, wird aber von %a (äquivalent zu repr(obj).encode('ascii', 'backslashreplace')) akzeptiert.

>>> b'Hello %b!' % 'World'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: %b requires bytes, or an object that implements __bytes__, not 'str'

>>> b'price: %a' % '10€'
b"price: '10\\u20ac'"

Beachten Sie, dass die Konversionsarten %s und %r, obwohl unterstützt, nur in Codebasen verwendet werden sollten, die Kompatibilität mit Python 2 benötigen.

Siehe auch

PEP 461 – Hinzufügen von %-Formatierung zu bytes und bytearray

PEP verfasst von Ethan Furman; implementiert von Neil Schemenauer und Ethan Furman.

PEP 484 – Typ-Hinweise

Die Syntax für Funktionsannotationen ist seit Version 3.0 eine Funktion von Python (PEP 3107), jedoch war die Semantik von Annotationen undefiniert geblieben.

Die Erfahrung hat gezeigt, dass die Mehrheit der Anwendungen von Funktionsannotationen dazu diente, Typ-Hinweise für Funktionsparameter und Rückgabewerte bereitzustellen. Es wurde deutlich, dass es für Python-Benutzer von Vorteil wäre, wenn die Standardbibliothek die Basisdefinitionen und Werkzeuge für Typannotationen enthalten würde.

PEP 484 führt ein vorläufiges Modul ein, das diese Standarddefinitionen und Werkzeuge bereitstellt, zusammen mit einigen Konventionen für Situationen, in denen Annotationen nicht verfügbar sind.

Hier ist zum Beispiel eine einfache Funktion, deren Argument- und Rückgabetyp in den Annotationen deklariert sind.

def greeting(name: str) -> str:
    return 'Hello ' + name

Obwohl diese Annotationen zur Laufzeit über das übliche Attribut __annotations__ verfügbar sind, *erfolgt zur Laufzeit keine automatische Typprüfung*. Stattdessen wird angenommen, dass ein separater Offline-Typ-Checker (z.B. mypy) für die On-Demand-Quellcodeanalyse verwendet wird.

Das Typsystem unterstützt Vereinigungen, generische Typen und einen speziellen Typ namens Any, der mit allen Typen konsistent ist (d.h. zu und von ihnen zuweisbar).

Siehe auch

  • Dokumentation des Moduls typing

  • PEP 484 – Typ-Hinweise

    PEP verfasst von Guido van Rossum, Jukka Lehtosalo und Łukasz Langa; implementiert von Guido van Rossum.

  • PEP 483 – Die Theorie der Typ-Hinweise

    PEP verfasst von Guido van Rossum.

PEP 471 – os.scandir() Funktion – ein besserer und schnellerer Verzeichnis-Iterator

PEP 471 fügt der Standardbibliothek eine neue Verzeichnis-Iterator-Funktion, os.scandir(), hinzu. Zusätzlich wird os.walk() nun unter Verwendung von scandir implementiert, was ihn auf POSIX-Systemen 3- bis 5-mal und auf Windows-Systemen 7- bis 20-mal schneller macht. Dies wird größtenteils durch die deutliche Reduzierung der Anzahl von os.stat()-Aufrufen erreicht, die zum Durchlaufen eines Verzeichnisbaums benötigt werden.

Zusätzlich gibt scandir einen Iterator zurück, anstatt einer Liste von Dateinamen, was die Speichereffizienz bei der Iteration über sehr große Verzeichnisse verbessert.

Das folgende Beispiel zeigt eine einfache Verwendung von os.scandir(), um alle Dateien (ohne Verzeichnisse) im angegebenen *Pfad* anzuzeigen, die nicht mit '.' beginnen. Der Aufruf entry.is_file() macht im Allgemeinen keinen zusätzlichen Systemaufruf.

for entry in os.scandir(path):
    if not entry.name.startswith('.') and entry.is_file():
        print(entry.name)

Siehe auch

PEP 471 – os.scandir() Funktion – ein besserer und schnellerer Verzeichnis-Iterator

PEP verfasst und implementiert von Ben Hoyt mit Hilfe von Victor Stinner.

PEP 475: Systemaufrufe, die mit EINTR fehlschlagen, wiederholen

Ein Fehlercode errno.EINTR wird zurückgegeben, wenn ein Systemaufruf, der auf I/O wartet, durch ein Signal unterbrochen wird. Zuvor löste Python in solchen Fällen InterruptedError aus. Das bedeutete, dass der Entwickler beim Schreiben einer Python-Anwendung zwei Möglichkeiten hatte:

  1. Ignorieren Sie die InterruptedError.

  2. Behandeln Sie die InterruptedError und versuchen Sie, den unterbrochenen Systemaufruf bei jedem Aufruf neu zu starten.

Die erste Option führt zu intermittierenden Fehlern der Anwendung. Die zweite Option fügt eine große Menge an Boilerplate-Code hinzu, der den Code fast unlesbar macht. Vergleichen Sie

print("Hello World")

und

while True:
    try:
        print("Hello World")
        break
    except InterruptedError:
        continue

PEP 475 implementiert das automatische Wiederholen von Systemaufrufen bei EINTR. Dies entlastet den Benutzercode in den meisten Situationen von der mühsamen Handhabung von EINTR oder InterruptedError und macht Python-Programme, einschließlich der Standardbibliothek, robuster. Beachten Sie, dass der Systemaufruf nur wiederholt wird, wenn der Signal-Handler keine Ausnahme auslöst.

Unten finden Sie eine Liste von Funktionen, die nun bei Unterbrechung durch ein Signal wiederholt werden:

Siehe auch

PEP 475 – Systemaufrufe, die mit EINTR fehlschlagen, wiederholen

PEP und Implementierung verfasst von Charles-François Natali und Victor Stinner, mit Hilfe von Antoine Pitrou (The French Connection).

PEP 479: Änderung der StopIteration-Behandlung in Generatoren

Die Interaktion von Generatoren und StopIteration in Python 3.4 und früheren Versionen war manchmal überraschend und konnte obskure Fehler verbergen. Zuvor wurde StopIteration, die versehentlich in einer Generatorfunktion ausgelöst wurde, vom Schleifenkonstrukt, das den Generator antrieb, als Ende der Iteration interpretiert.

PEP 479 ändert das Verhalten von Generatoren: Wenn eine StopIteration-Ausnahme innerhalb eines Generators ausgelöst wird, wird diese vor dem Verlassen des Generator-Frames durch eine RuntimeError ersetzt. Das Hauptziel dieser Änderung ist es, die Fehlersuche in Situationen zu erleichtern, in denen ein ungeschützter next()-Aufruf StopIteration auslöst und die vom Generator gesteuerte Iteration stillschweigend beendet wird. Dies ist besonders tückisch in Kombination mit dem yield from-Konstrukt.

Dies ist eine abwärts inkompatible Änderung. Um das neue Verhalten zu aktivieren, ist ein __future__-Import erforderlich.

>>> from __future__ import generator_stop

>>> def gen():
...     next(iter([]))
...     yield
...
>>> next(gen())
Traceback (most recent call last):
  File "<stdin>", line 2, in gen
StopIteration

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: generator raised StopIteration

Ohne einen __future__-Import wird eine PendingDeprecationWarning ausgelöst, wann immer eine StopIteration-Ausnahme innerhalb eines Generators ausgelöst wird.

Siehe auch

PEP 479 – Änderung der Behandlung von StopIteration in Generatoren

PEP geschrieben von Chris Angelico und Guido van Rossum. Implementiert von Chris Angelico, Yury Selivanov und Nick Coghlan.

PEP 485: Eine Funktion zum Testen auf annähernde Gleichheit

PEP 485 fügt die Funktionen math.isclose() und cmath.isclose() hinzu, die angeben, ob zwei Werte annähernd gleich oder „nah“ beieinander sind. Ob zwei Werte als nah gelten, wird anhand der angegebenen absoluten und relativen Toleranzen bestimmt. Die relative Toleranz ist die maximal zulässige Differenz zwischen den Argumenten von isclose, relativ zum größeren Absolutwert

>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, rel_tol=1e-5)
True
>>> math.isclose(a, b, rel_tol=1e-6)
False

Es ist auch möglich, zwei Werte mit absoluter Toleranz zu vergleichen, die ein nicht-negativer Wert sein muss.

>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, abs_tol=0.00003)
True
>>> math.isclose(a, b, abs_tol=0.00001)
False

Siehe auch

PEP 485 – Eine Funktion zum Testen auf annähernde Gleichheit

PEP geschrieben von Christopher Barker; implementiert von Chris Barker und Tal Einat.

PEP 486: Den Python Launcher für virtuelle Umgebungen bekannt machen

PEP 486 macht den Windows Launcher (siehe PEP 397) auf eine aktive virtuelle Umgebung aufmerksam. Wenn der Standard-Interpreter verwendet würde und die Umgebungsvariable VIRTUAL_ENV gesetzt ist, wird der Interpreter in der virtuellen Umgebung verwendet.

Siehe auch

PEP 486 – Den Python Launcher für virtuelle Umgebungen bekannt machen

PEP geschrieben und implementiert von Paul Moore.

PEP 488: Eliminierung von PYO-Dateien

PEP 488 schafft das Konzept von .pyo-Dateien ab. Das bedeutet, dass .pyc-Dateien sowohl unoptimierten als auch optimierten Bytecode darstellen. Um die Notwendigkeit der ständigen Neuerstellung von Bytecode-Dateien zu vermeiden, haben .pyc-Dateien nun einen optionalen opt-Tag in ihrem Namen, wenn der Bytecode optimiert ist. Dies hat den Nebeneffekt, dass es keine Namenskonflikte bei Bytecode-Dateien mehr gibt, wenn unter -O oder -OO ausgeführt wird. Folglich können Bytecode-Dateien, die aus -O und -OO generiert wurden, nun gleichzeitig existieren. importlib.util.cache_from_source() hat eine aktualisierte API, um bei dieser Änderung zu helfen.

Siehe auch

PEP 488 – Eliminierung von PYO-Dateien

PEP geschrieben und implementiert von Brett Cannon.

PEP 489: Mehrphasige Initialisierung von Erweiterungsmodulen

PEP 489 aktualisiert die Initialisierung von Erweiterungsmodulen, um den von PEP 451 in Python 3.4 eingeführten zweistufigen Modulladungsmechanismus zu nutzen.

Diese Änderung bringt die Importsemantik von Erweiterungsmodulen, die sich für die Nutzung des neuen Mechanismus entscheiden, viel näher an die von Python-Quellcode- und Bytecode-Modulen heran, einschließlich der Möglichkeit, jeden gültigen Bezeichner als Modulnamen zu verwenden, anstatt auf ASCII beschränkt zu sein.

Siehe auch

PEP 489 – Mehrphasige Initialisierung von Erweiterungsmodulen

PEP geschrieben von Petr Viktorin, Stefan Behnel und Nick Coghlan; implementiert von Petr Viktorin.

Andere Sprachänderungen

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

  • Hinzugefügt wurden die Fehlerbehandlungsroutinen "namereplace". Die Fehlerbehandlungsroutinen "backslashreplace" funktionieren jetzt mit Dekodierung und Übersetzung. (Beigetragen von Serhiy Storchaka in bpo-19676 und bpo-22286.)

  • Die Option -b beeinflusst nun Vergleiche von bytes mit int. (Beigetragen von Serhiy Storchaka in bpo-23681.)

  • Neue kasachische kz1048 und tadschikische koi8_t Codecs. (Beigetragen von Serhiy Storchaka in bpo-22682 und bpo-22681.)

  • Docstrings von Properties sind nun beschreibbar. Dies ist besonders nützlich für Docstrings von collections.namedtuple(). (Beigetragen von Berker Peksag in bpo-24064.)

  • Zirkuläre Importe, die relative Importe beinhalten, werden nun unterstützt. (Beigetragen von Brett Cannon und Antoine Pitrou in bpo-17636.)

Neue Module

typing

Das neue typing Provisional Modul bietet Standarddefinitionen und Werkzeuge für Funktions-Typ-Annotationen. Weitere Informationen finden Sie unter Type Hints.

zipapp

Das neue Modul zipapp (spezifiziert in PEP 441) bietet eine API und ein Kommandozeilen-Tool zum Erstellen von ausführbaren Python-Zip-Anwendungen, die in Python 2.6 in bpo-1739468 eingeführt wurden, aber weder damals noch seitdem gut beworben wurden.

Mit dem neuen Modul ist das Bündeln Ihrer Anwendung so einfach, wie alle Dateien, einschließlich einer __main__.py-Datei, in ein Verzeichnis myapp zu legen und auszuführen.

$ python -m zipapp myapp
$ python myapp.pyz

Die Modulimplementierung wurde von Paul Moore in bpo-23491 beigesteuert.

Siehe auch

PEP 441 – Verbesserung der Unterstützung für Python ZIP-Anwendungen

Verbesserte Module

argparse

Die Klasse ArgumentParser erlaubt nun das Deaktivieren von abgekürzter Verwendung von langen Optionen, indem allow_abbrev auf False gesetzt wird. (Beigetragen von Jonathan Paugh, Steven Bethard, paul j3 und Daniel Eriksson in bpo-14910.)

asyncio

Da das Modul asyncio provisional ist, wurden alle in Python 3.5 eingeführten Änderungen auch nach Python 3.4.x zurückportiert.

Bemerkenswerte Änderungen im Modul asyncio seit Python 3.4.0

Änderungen in 3.5.1

Änderungen in 3.5.2

  • Neue Methode loop.create_future() zum Erstellen von Future-Objekten. Dies ermöglicht alternativen Event-Schleifen-Implementierungen, wie z. B. uvloop, die Bereitstellung einer schnelleren asyncio.Future-Implementierung. (Beigetragen von Yury Selivanov.)

  • Neue Methode loop.get_exception_handler(), um den aktuellen Exception-Handler abzurufen. (Beigetragen von Yury Selivanov.)

  • Neue Methode StreamReader.readuntil(), um Daten aus dem Stream zu lesen, bis eine Trenner-Byte-Sequenz erscheint. (Beigetragen von Mark Korenberg.)

  • Die Methoden loop.create_connection() und loop.create_server() sind 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.sock_connect(sock, address) erfordert nicht mehr, dass die *address* vor dem Aufruf aufgelöst wird. (Beigetragen von A. Jesse Jiryu Davis.)

bz2

Die Methode BZ2Decompressor.decompress akzeptiert nun ein optionales Argument max_length, um die maximale Größe der dekomprimierten Daten zu begrenzen. (Beigetragen von Nikolaus Rath in bpo-15955.)

cgi

Die Klasse FieldStorage unterstützt nun das Protokoll des Kontextmanagers. (Beigetragen von Berker Peksag in bpo-20289.)

cmath

Eine neue Funktion isclose() bietet eine Möglichkeit, auf annähernde Gleichheit zu testen. (Beigetragen von Chris Barker und Tal Einat in bpo-24270.)

code

Die Methode InteractiveInterpreter.showtraceback() gibt nun den vollständigen verketteten Traceback aus, genau wie der interaktive Interpreter. (Beigetragen von Claudiu Popa in bpo-17442.)

collections

Die Klasse OrderedDict wird nun in C implementiert, was sie 4- bis 100-mal schneller macht. (Beigetragen von Eric Snow in bpo-16991.)

OrderedDict.items(), OrderedDict.keys() und OrderedDict.values() Sichten unterstützen nun die reversed() Iteration. (Beigetragen von Serhiy Storchaka in bpo-19505.)

Die Klasse deque definiert nun index(), insert() und copy() und unterstützt die Operatoren + und *. Dies ermöglicht es, dass Deques als MutableSequence erkannt werden und verbessert ihre Austauschbarkeit mit Listen. (Beigetragen von Raymond Hettinger in bpo-23704.)

Docstrings, die von namedtuple() erzeugt werden, können nun aktualisiert werden.

Point = namedtuple('Point', ['x', 'y'])
Point.__doc__ += ': Cartesian coordinate'
Point.x.__doc__ = 'abscissa'
Point.y.__doc__ = 'ordinate'

(Beigetragen von Berker Peksag in bpo-24064.)

Die Klasse UserString implementiert nun die Methoden __getnewargs__(), __rmod__(), casefold(), format_map(), isprintable() und maketrans(), um den entsprechenden Methoden von str zu entsprechen. (Beigetragen von Joe Jevnik in bpo-22189.)

collections.abc

Die Methode Sequence.index() akzeptiert nun die Argumente start und stop, um den entsprechenden Methoden von tuple, list usw. zu entsprechen. (Beigetragen von Devin Jeanpierre in bpo-23086.)

Eine neue abstrakte Basisklasse Generator. (Beigetragen von Stefan Behnel in bpo-24018.)

Neue abstrakte Basisklassen Awaitable, Coroutine, AsyncIterator und AsyncIterable. (Beigetragen von Yury Selivanov in bpo-24184.)

Für frühere Python-Versionen ist ein Backport der neuen ABCs in einem externen PyPI-Paket verfügbar.

compileall

Eine neue Option -j N von compileall erlaubt die gleichzeitige Ausführung von N Arbeitern zur parallelen Bytecode-Kompilierung. Die Funktion compile_dir() hat einen entsprechenden Parameter workers. (Beigetragen von Claudiu Popa in bpo-16104.)

Eine weitere neue Option, -r, erlaubt die Steuerung der maximalen Rekursionstiefe für Unterverzeichnisse. (Beigetragen von Claudiu Popa in bpo-19628.)

Die Kommandozeilenoption -q kann nun mehrfach angegeben werden, in diesem Fall werden alle Ausgaben, einschließlich Fehlern, unterdrückt. Der entsprechende Parameter quiet in compile_dir(), compile_file() und compile_path() kann nun einen ganzzahligen Wert akzeptieren, der den Grad der Ausgabunterdrückung angibt. (Beigetragen von Thomas Kluyver in bpo-21338.)

concurrent.futures

Die Methode Executor.map() akzeptiert nun ein Argument chunksize, um die Stapelverarbeitung von Aufgaben zu ermöglichen und die Leistung bei Verwendung von ProcessPoolExecutor() zu verbessern. (Beigetragen von Dan O’Reilly in bpo-11271.)

Die Anzahl der Worker im Konstruktor von ThreadPoolExecutor ist nun optional. Der Standardwert ist das 5-fache der Anzahl der CPUs. (Beigetragen von Claudiu Popa in bpo-21527.)

configparser

configparser bietet nun eine Möglichkeit, die Konvertierung von Werten anzupassen, indem ein Wörterbuch von Konvertern im Konstruktor von ConfigParser angegeben wird oder indem sie als Methoden in Unterklassen von ConfigParser definiert werden. In einem Parser-Instanz definierte Konverter werden von seinen Abschnitts-Proxys vererbt.

Beispiel

>>> import configparser
>>> conv = {}
>>> conv['list'] = lambda v: [e.strip() for e in v.split() if e.strip()]
>>> cfg = configparser.ConfigParser(converters=conv)
>>> cfg.read_string("""
... [s]
... list = a b c d e f g
... """)
>>> cfg.get('s', 'list')
'a b c d e f g'
>>> cfg.getlist('s', 'list')
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> section = cfg['s']
>>> section.getlist('list')
['a', 'b', 'c', 'd', 'e', 'f', 'g']

(Beigetragen von Łukasz Langa in bpo-18159.)

contextlib

Der neue redirect_stderr() Kontextmanager (ähnlich wie redirect_stdout()) erleichtert es Hilfsskripten, unflexible APIs zu handhaben, die ihre Ausgaben nach sys.stderr schreiben und keine Optionen zur Umleitung bieten.

>>> import contextlib, io, logging
>>> f = io.StringIO()
>>> with contextlib.redirect_stderr(f):
...     logging.warning('warning')
...
>>> f.getvalue()
'WARNING:root:warning\n'

(Beigetragen von Berker Peksag in bpo-22389.)

csv

Die Methode writerow() unterstützt nun beliebige Iterables, nicht nur Sequenzen. (Beigetragen von Serhiy Storchaka in bpo-23171.)

curses

Die neue Funktion update_lines_cols() aktualisiert die Modulvariablen LINES und COLS. Dies ist nützlich, um manuelle Bildschirmänderungen zu erkennen. (Beigetragen von Arnon Yaari in bpo-4254.)

dbm

dumb.open erstellt immer eine neue Datenbank, wenn das Flag den Wert "n" hat. (Beigetragen von Claudiu Popa in bpo-18039.)

difflib

Die Zeichenkodierung von HTML-Dokumenten, die von HtmlDiff.make_file() generiert werden, kann jetzt durch die Verwendung eines neuen namensgebundenen Arguments charset angepasst werden. Die Standard-Zeichenkodierung von HTML-Dokumenten wurde von "ISO-8859-1" auf "utf-8" geändert. (Beigetragen von Berker Peksag in bpo-2052.)

Die Funktion diff_bytes() kann jetzt Listen von Byte-Strings vergleichen. Dies behebt eine Regression aus Python 2. (Beigetragen von Terry J. Reedy und Greg Ward in bpo-17445.)

distutils

Die Befehle build und build_ext akzeptieren jetzt die Option -j, um das parallele Erstellen von Erweiterungsmodulen zu ermöglichen. (Beigetragen von Antoine Pitrou in bpo-5309.)

Das Modul distutils unterstützt jetzt xz-Kompression und kann durch Übergabe von xztar als Argument an bdist --format aktiviert werden. (Beigetragen von Serhiy Storchaka in bpo-16314.)

doctest

Die Funktion DocTestSuite() gibt eine leere unittest.TestSuite zurück, wenn module keine Docstrings enthält, anstatt ValueError auszulösen. (Beigetragen von Glenn Jones in bpo-15916.)

email

Eine neue Richtlinienoption Policy.mangle_from_ steuert, ob Zeilen, die mit "From " beginnen, in E-Mail-Bodies von Generatoren mit einem ">"-Zeichen präfixiert werden. Der Standardwert ist True für compat32 und False für alle anderen Richtlinien. (Beigetragen von Milan Oberkirch in bpo-20098.)

Eine neue Methode Message.get_content_disposition() bietet einfachen Zugriff auf einen kanonischen Wert für den Header Content-Disposition. (Beigetragen von Abhilash Raj in bpo-21083.)

Eine neue Richtlinienoption EmailPolicy.utf8 kann auf True gesetzt werden, um E-Mail-Header mit der UTF-8-Zeichenkodierung zu kodieren, anstatt kodierte Wörter zu verwenden. Dies ermöglicht die Formatierung von Messages gemäß RFC 6532 und die Verwendung mit einem SMTP-Server, der die RFC 6531 SMTPUTF8-Erweiterung unterstützt. (Beigetragen von R. David Murray in bpo-24211.)

Der Konstruktor mime.text.MIMEText akzeptiert jetzt eine Instanz von charset.Charset. (Beigetragen von Claude Paroz und Berker Peksag in bpo-16324.)

enum

Das aufrufbare Objekt Enum verfügt über einen neuen Parameter start, um die Anfangszahl der Enum-Werte anzugeben, wenn nur Namen bereitgestellt werden.

>>> Animal = enum.Enum('Animal', 'cat dog', start=10)
>>> Animal.cat
<Animal.cat: 10>
>>> Animal.dog
<Animal.dog: 11>

(Beigetragen von Ethan Furman in bpo-21706.)

faulthandler

Die Funktionen enable(), register(), dump_traceback() und dump_traceback_later() akzeptieren jetzt zusätzlich zu Datei-ähnlichen Objekten auch Dateideskriptoren. (Beigetragen von Wei Wu in bpo-23566.)

functools

Der Großteil der lru_cache()-Mechanik ist jetzt in C implementiert, was sie deutlich schneller macht. (Beigetragen von Matt Joiner, Alexey Kachayev und Serhiy Storchaka in bpo-14373.)

glob

Die Funktionen iglob() und glob() unterstützen jetzt die rekursive Suche in Unterverzeichnissen mithilfe des Musters "**". (Beigetragen von Serhiy Storchaka in bpo-13968.)

gzip

Das Argument mode des Konstruktors GzipFile akzeptiert jetzt "x", um die exklusive Erstellung anzufordern. (Beigetragen von Tim Heaney in bpo-19222.)

heapq

Der Elementvergleich in merge() kann jetzt durch Übergabe einer Schlüsselfunktion als neues optionales namensgebundenes Argument key angepasst werden, und ein neues optionales Argument reverse kann verwendet werden, um den Elementvergleich umzukehren.

>>> import heapq
>>> a = ['9', '777', '55555']
>>> b = ['88', '6666']
>>> list(heapq.merge(a, b, key=len))
['9', '88', '777', '6666', '55555']
>>> list(heapq.merge(reversed(a), reversed(b), key=len, reverse=True))
['55555', '6666', '777', '88', '9']

(Beigetragen von Raymond Hettinger in bpo-13742.)

http

Eine neue Aufzählung HTTPStatus, die eine Reihe von HTTP-Statuscodes, Grundformulierungen und langen Beschreibungen in englischer Sprache definiert. (Beigetragen von Demian Brecht in bpo-21793.)

http.client

HTTPConnection.getresponse() löst jetzt eine RemoteDisconnected-Ausnahme aus, wenn eine Remoteserververbindung unerwartet geschlossen wird. Wenn außerdem eine ConnectionError (deren Unterklasse RemoteDisconnected ist) ausgelöst wird, wird der Client-Socket jetzt automatisch geschlossen und bei der nächsten Anfrage neu verbunden.

import http.client
conn = http.client.HTTPConnection('www.python.org')
for retries in range(3):
    try:
        conn.request('GET', '/')
        resp = conn.getresponse()
    except http.client.RemoteDisconnected:
        pass

(Beigetragen von Martin Panter in bpo-3566.)

idlelib und IDLE

Da idlelib die IDLE-Shell und den Editor implementiert und nicht zum Import durch andere Programme gedacht ist, erhält es mit jeder Veröffentlichung Verbesserungen. Die kumulative Liste der Änderungen seit 3.4.0 sowie Änderungen, die in zukünftigen 3.5.x-Versionen vorgenommen wurden, finden Sie in Lib/idlelib/NEWS.txt. Diese Datei ist auch über den Dialog Hilfe ‣ Info zu IDLE in IDLE verfügbar.

imaplib

Die Klasse IMAP4 unterstützt jetzt das Context-Manager-Protokoll. Wenn es in einer with-Anweisung verwendet wird, wird der IMAP4-Befehl LOGOUT am Ende des Blocks automatisch aufgerufen. (Beigetragen von Tarek Ziadé und Serhiy Storchaka in bpo-4972.)

Das Modul imaplib unterstützt jetzt RFC 5161 (ENABLE-Erweiterung) und RFC 6855 (UTF-8-Unterstützung) über die Methode IMAP4.enable(). Ein neues Attribut IMAP4.utf8_enabled verfolgt, ob die Unterstützung für RFC 6855 aktiviert ist. (Beigetragen von Milan Oberkirch, R. David Murray und Maciej Szulik in bpo-21800.)

Das Modul imaplib kodiert jetzt automatisch Benutzernamen und Passwörter, die keine ASCII-Zeichen enthalten, mit UTF-8, wie von den RFCs empfohlen. (Beigetragen von Milan Oberkirch in bpo-21800.)

imghdr

Die Funktion what() erkennt jetzt das OpenEXR-Format (beigetragen von Martin Vignali und Claudiu Popa in bpo-20295) und das WebP-Format (beigetragen von Fabrice Aneche und Claudiu Popa in bpo-20197.)

importlib

Die Klasse util.LazyLoader ermöglicht das verzögerte Laden von Modulen in Anwendungen, bei denen die Startzeit wichtig ist. (Beigetragen von Brett Cannon in bpo-17621.)

Die Methode abc.InspectLoader.source_to_code() ist jetzt eine statische Methode. Dies erleichtert die Initialisierung eines Modulobjekts mit aus einem String kompiliertem Code, indem exec(code, module.__dict__) ausgeführt wird. (Beigetragen von Brett Cannon in bpo-21156.)

Die neue Funktion util.module_from_spec() ist jetzt der bevorzugte Weg, um ein neues Modul zu erstellen. Im Gegensatz zur direkten Erstellung einer types.ModuleType-Instanz setzt diese neue Funktion die verschiedenen importgesteuerten Attribute basierend auf dem übergebenen Spec-Objekt. (Beigetragen von Brett Cannon in bpo-20383.)

inspect

Sowohl die Klassen Signature als auch Parameter sind jetzt pickelbar und hashbar. (Beigetragen von Yury Selivanov in bpo-20726 und bpo-20334.)

Eine neue Methode BoundArguments.apply_defaults() bietet eine Möglichkeit, Standardwerte für fehlende Argumente festzulegen.

>>> def foo(a, b='ham', *args): pass
>>> ba = inspect.signature(foo).bind('spam')
>>> ba.apply_defaults()
>>> ba.arguments
OrderedDict([('a', 'spam'), ('b', 'ham'), ('args', ())])

(Beigetragen von Yury Selivanov in bpo-24190.)

Eine neue Klassenmethode Signature.from_callable() erleichtert die Unterklassifizierung von Signature. (Beigetragen von Yury Selivanov und Eric Snow in bpo-17373.)

Die Funktion signature() akzeptiert jetzt ein optionales namensgebundenes Argument follow_wrapped, das, wenn es auf False gesetzt ist, dem automatischen Folgen von __wrapped__-Links deaktiviert. (Beigetragen von Yury Selivanov in bpo-20691.)

Eine Reihe neuer Funktionen zur Inspektion von Coroutine-Funktionen und Coroutine-Objekten wurde hinzugefügt: iscoroutine(), iscoroutinefunction(), isawaitable(), getcoroutinelocals() und getcoroutinestate(). (Beigetragen von Yury Selivanov in bpo-24017 und bpo-24400.)

Die Funktionen stack(), trace(), getouterframes() und getinnerframes() geben jetzt eine Liste von benannten Tupeln zurück. (Beigetragen von Daniel Shahaf in bpo-16808.)

io

Eine neue Methode BufferedIOBase.readinto1(), die höchstens einen Aufruf der Methoden RawIOBase.read() oder RawIOBase.readinto() des zugrunde liegenden Rohstreams verwendet. (Beigetragen von Nikolaus Rath in bpo-20578.)

ipaddress

Sowohl die Klassen IPv4Network als auch IPv6Network akzeptieren jetzt ein Tupelargument (address, netmask), um Netzwerkobjekte einfach aus vorhandenen Adressen zu erstellen.

>>> import ipaddress
>>> ipaddress.IPv4Network(('127.0.0.0', 8))
IPv4Network('127.0.0.0/8')
>>> ipaddress.IPv4Network(('127.0.0.0', '255.0.0.0'))
IPv4Network('127.0.0.0/8')

(Beigetragen von Peter Moody und Antoine Pitrou in bpo-16531.)

Ein neues Attribut reverse_pointer für die Klassen IPv4Address und IPv6Address gibt den Namen des Reverse-DNS-PTR-Eintrags zurück.

>>> import ipaddress
>>> addr = ipaddress.IPv4Address('127.0.0.1')
>>> addr.reverse_pointer
'1.0.0.127.in-addr.arpa'
>>> addr6 = ipaddress.IPv6Address('::1')
>>> addr6.reverse_pointer
'1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa'

(Beigetragen von Leon Weber in bpo-20480.)

json

Die Kommandozeilenschnittstelle json.tool behält jetzt die Reihenfolge der Schlüssel in eingegebenen JSON-Objekten bei. Die neue Option --sort-keys kann verwendet werden, um die Schlüssel alphabetisch zu sortieren. (Beigetragen von Berker Peksag in bpo-21650.)

Der JSON-Decoder löst jetzt JSONDecodeError anstelle von ValueError aus, um bessere Kontextinformationen über den Fehler bereitzustellen. (Beigetragen von Serhiy Storchaka in bpo-19361.)

linecache

Eine neue Funktion lazycache() kann verwendet werden, um Informationen über ein nicht dateibasiertes Modul zu erfassen, um später dessen Zeilen über getline() abrufen zu können. Dies vermeidet I/O, bis eine Zeile tatsächlich benötigt wird, ohne dass die Modul-Globals auf unbestimmte Zeit mitgeführt werden müssen. (Beigetragen von Robert Collins in bpo-17911.)

locale

Eine neue Funktion delocalize() kann verwendet werden, um einen String unter Berücksichtigung der LC_NUMERIC-Einstellungen in einen normalisierten Zahlenstring umzuwandeln.

>>> import locale
>>> locale.setlocale(locale.LC_NUMERIC, 'de_DE.UTF-8')
'de_DE.UTF-8'
>>> locale.delocalize('1.234,56')
'1234.56'
>>> locale.setlocale(locale.LC_NUMERIC, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.delocalize('1,234.56')
'1234.56'

(Beigetragen von Cédric Krier in bpo-13918.)

logging

Alle Logging-Methoden (Logger log(), exception(), critical(), debug(), etc.) akzeptieren jetzt Ausnahmeinstanzen als exc_info-Argument, zusätzlich zu booleschen Werten und Tupeln von Ausnahmen.

>>> import logging
>>> try:
...     1/0
... except ZeroDivisionError as ex:
...     logging.error('exception', exc_info=ex)
ERROR:root:exception

(Beigetragen von Yury Selivanov in bpo-20537.)

Die Klasse handlers.HTTPHandler akzeptiert jetzt eine optionale Instanz von ssl.SSLContext, um SSL-Einstellungen für eine HTTP-Verbindung zu konfigurieren. (Beigetragen von Alex Gaynor in bpo-22788.)

Die Klasse handlers.QueueListener nimmt jetzt ein namensgebundenes Argument respect_handler_level entgegen, das, wenn es auf True gesetzt ist, Nachrichten unter Berücksichtigung der Handler-Level an die Handler weiterleitet. (Beigetragen von Vinay Sajip.)

lzma

Die Methode LZMADecompressor.decompress() akzeptiert jetzt ein optionales Argument max_length, um die maximale Größe der dekomprimierten Daten zu begrenzen. (Beigetragen von Martin Panter in bpo-15955.)

math

Zwei neue Konstanten wurden dem Modul math hinzugefügt: inf und nan. (Beigetragen von Mark Dickinson in bpo-23185.)

Eine neue Funktion isclose() bietet eine Möglichkeit, auf ungefähre Gleichheit zu testen. (Beigetragen von Chris Barker und Tal Einat in bpo-24270.)

Eine neue Funktion gcd() wurde hinzugefügt. Die Funktion fractions.gcd() ist nun veraltet. (Beigetragen von Mark Dickinson und Serhiy Storchaka in bpo-22486.)

multiprocessing

Objekte von sharedctypes.synchronized() unterstützen jetzt das Context-Manager-Protokoll. (Beigetragen von Charles-François Natali in bpo-21565.)

operator

Objekte von attrgetter(), itemgetter() und methodcaller() unterstützen jetzt Pickling. (Beigetragen von Josh Rosenberg und Serhiy Storchaka in bpo-22955.)

Neue Funktionen matmul() und imatmul() zur Durchführung von Matrixmultiplikation. (Beigetragen von Benjamin Peterson in bpo-21176.)

os

Die neue Funktion scandir(), die einen Iterator von DirEntry-Objekten zurückgibt, wurde hinzugefügt. Wenn möglich, extrahiert scandir() Dateieigenschaften beim Scannen eines Verzeichnisses, wodurch die Notwendigkeit nachfolgender Systemaufrufe zur Bestimmung des Dateityps oder der Eigenschaften entfällt, was die Leistung erheblich verbessern kann. (Beigetragen von Ben Hoyt mit Hilfe von Victor Stinner in bpo-22524.)

Unter Windows ist ein neues Attribut stat_result.st_file_attributes verfügbar. Es entspricht dem Member dwFileAttributes der Struktur BY_HANDLE_FILE_INFORMATION, die von GetFileInformationByHandle() zurückgegeben wird. (Beigetragen von Ben Hoyt in bpo-21719.)

Die Funktion urandom() verwendet jetzt den Systemaufruf getrandom() unter Linux 3.17 oder neuer und getentropy() unter OpenBSD 5.6 oder neuer, wodurch die Notwendigkeit der Verwendung von /dev/urandom entfällt und Fehler aufgrund von potenziellem Dateideskriptor-Erschöpfung vermieden werden. (Beigetragen von Victor Stinner in bpo-22181.)

Neue Funktionen get_blocking() und set_blocking() ermöglichen das Abrufen und Setzen des Blockierungsmodus eines Dateideskriptors (O_NONBLOCK.) (Beigetragen von Victor Stinner in bpo-22054.)

Die Funktionen truncate() und ftruncate() werden jetzt unter Windows unterstützt. (Beigetragen von Steve Dower in bpo-23668.)

Es gibt eine neue Funktion os.path.commonpath(), die den längsten gemeinsamen Unterpfad jedes übergebenen Pfadnamens zurückgibt. Im Gegensatz zur Funktion os.path.commonprefix() gibt sie immer einen gültigen Pfad zurück.

>>> os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
'/usr/l'

>>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
'/usr'

(Beigetragen von Rafik Draoui und Serhiy Storchaka in bpo-10395.)

pathlib

Die neue Methode Path.samefile() kann verwendet werden, um zu prüfen, ob der Pfad auf dieselbe Datei wie ein anderer Pfad verweist, der entweder ein anderes Path-Objekt oder ein String sein kann.

>>> import pathlib
>>> p1 = pathlib.Path('/etc/hosts')
>>> p2 = pathlib.Path('/etc/../etc/hosts')
>>> p1.samefile(p2)
True

(Beigetragen von Vajrasky Kok und Antoine Pitrou in bpo-19775.)

Die Methode Path.mkdir() akzeptiert jetzt ein neues optionales Argument exist_ok, um der Funktionalität von mkdir -p und os.makedirs() zu entsprechen. (Beigetragen von Berker Peksag in bpo-21539.)

Es gibt eine neue Methode Path.expanduser(), um ~ und ~user Präfixe zu expandieren. (Beigetragen von Serhiy Storchaka und Claudiu Popa in bpo-19776.)

Eine neue Klassenmethode Path.home() kann verwendet werden, um eine Path-Instanz zu erhalten, die das Heimatverzeichnis des Benutzers repräsentiert. (Beigetragen von Victor Salgado und Mayank Tripathi in bpo-19777.)

Neue Methoden Path.write_text(), Path.read_text(), Path.write_bytes(), Path.read_bytes() zur Vereinfachung von Lese-/Schreiboperationen auf Dateien.

Der folgende Code-Schnipsel erstellt oder überschreibt die vorhandene Datei ~/spam42

>>> import pathlib
>>> p = pathlib.Path('~/spam42')
>>> p.expanduser().write_text('ham')
3

(Beigetragen von Christopher Welborn in bpo-20218.)

pickle

Verschachtelte Objekte wie ungebundene Methoden oder verschachtelte Klassen können jetzt mit pickle-Protokollen älter als Protokollversion 4 gepickelt werden. Protokollversion 4 unterstützt diese Fälle bereits. (Beigetragen von Serhiy Storchaka in bpo-23611.)

poplib

Ein neuer Befehl POP3.utf8() aktiviert die Unterstützung für RFC 6856 (Internationalisierte E-Mails), falls ein POP-Server dies unterstützt. (Beigetragen von Milan OberKirch in bpo-21804.)

re

Referenzen und bedingte Referenzen auf Gruppen fester Länge sind nun in Lookbehind-Assertions erlaubt.

>>> import re
>>> pat = re.compile(r'(a|b).(?<=\1)c')
>>> pat.match('aac')
<_sre.SRE_Match object; span=(0, 3), match='aac'>
>>> pat.match('bbc')
<_sre.SRE_Match object; span=(0, 3), match='bbc'>

(Beigetragen von Serhiy Storchaka in bpo-9179.)

Die Anzahl der erfassenden Gruppen in regulären Ausdrücken ist nicht mehr auf 100 begrenzt. (Beigetragen von Serhiy Storchaka in bpo-22437.)

Die Funktionen sub() und subn() ersetzen jetzt nicht übereinstimmende Gruppen durch leere Strings, anstatt eine Ausnahme auszulösen. (Beigetragen von Serhiy Storchaka in bpo-1519638.)

Die Ausnahmen re.error haben neue Attribute msg, pattern, pos, lineno und colno, die bessere Kontextinformationen über den Fehler liefern.

>>> re.compile("""
...     (?x)
...     .++
... """)
Traceback (most recent call last):
   ...
sre_constants.error: multiple repeat at position 16 (line 3, column 7)

(Beigetragen von Serhiy Storchaka in bpo-22578.)

readline

Eine neue Funktion append_history_file() kann verwendet werden, um die angegebene Anzahl von nachfolgenden Elementen im Verlauf in die angegebene Datei anzuhängen. (Beigetragen von Bruno Cauet in bpo-22940.)

selectors

Der neue DevpollSelector unterstützt effizientes /dev/poll Polling auf Solaris. (Beigetragen von Giampaolo Rodola’ in bpo-18931.)

shutil

Die Funktion move() akzeptiert jetzt ein Argument copy_function, das es ermöglicht, zum Beispiel die Funktion copy() anstelle der Standardfunktion copy2() zu verwenden, falls die Dateimetadaten beim Verschieben ignoriert werden sollen. (Beigetragen von Claudiu Popa in bpo-19840.)

Die Funktion make_archive() unterstützt nun das Format xztar. (Beigetragen von Serhiy Storchaka in bpo-5411.)

signal

Unter Windows unterstützt die Funktion set_wakeup_fd() jetzt auch Socket-Handles. (Beigetragen von Victor Stinner in bpo-22018.)

Verschiedene SIG* Konstanten im Modul signal wurden in Enums umgewandelt. Dies ermöglicht aussagekräftige Namen während des Debuggens anstelle von ganzzahligen „magischen Zahlen“. (Beigetragen von Giampaolo Rodola’ in bpo-21076.)

smtpd

Sowohl die Klassen SMTPServer als auch SMTPChannel akzeptieren jetzt ein Schlüsselwortargument decode_data, um zu bestimmen, ob der DATA-Teil der SMTP-Transaktion mit dem "utf-8"-Codec dekodiert wird oder stattdessen als Byte-String an die Methode SMTPServer.process_message() übergeben wird. Der Standard ist True aus Kompatibilitätsgründen, wird aber in Python 3.6 zu False geändert. Wenn decode_data auf False gesetzt ist, muss die Methode process_message darauf vorbereitet sein, Schlüsselwortargumente zu akzeptieren. (Beigetragen von Maciej Szulik in bpo-19662.)

Die Klasse SMTPServer bewirbt jetzt die Erweiterung 8BITMIME (RFC 6152), wenn decode_data auf True gesetzt wurde. Wenn der Client BODY=8BITMIME im MAIL-Befehl angibt, wird dies über das Schlüsselwort mail_options an SMTPServer.process_message() übergeben. (Beigetragen von Milan OberKirch und R. David Murray in bpo-21795.)

Die Klasse SMTPServer unterstützt jetzt auch die Erweiterung SMTPUTF8 (RFC 6531: Internationalisierte E-Mails). Wenn der Client SMTPUTF8 BODY=8BITMIME im MAIL-Befehl angegeben hat, werden diese über das Schlüsselwort mail_options an SMTPServer.process_message() übergeben. Es liegt in der Verantwortung der Methode process_message, die SMTPUTF8-Daten korrekt zu verarbeiten. (Beigetragen von Milan OberKirch in bpo-21725.)

Es ist jetzt möglich, IPv6-Adressen direkt oder über Namensauflösung im Konstruktor von SMTPServer anzugeben und eine erfolgreiche Verbindung herzustellen. (Beigetragen von Milan OberKirch in bpo-14758.)

smtplib

Eine neue Methode SMTP.auth() bietet eine bequeme Möglichkeit zur Implementierung benutzerdefinierter Authentifizierungsmechanismen. (Beigetragen von Milan OberKirch in bpo-15014.)

Die Methode SMTP.set_debuglevel() akzeptiert jetzt einen zusätzlichen Debug-Level (2), der Zeitstempel in Debug-Meldungen aktiviert. (Beigetragen von Gavin Chappell und Maciej Szulik in bpo-16914.)

Sowohl die Methoden SMTP.sendmail() als auch SMTP.send_message() unterstützen jetzt RFC 6531 (SMTPUTF8). (Beigetragen von Milan OberKirch und R. David Murray in bpo-22027.)

sndhdr

Die Funktionen what() und whathdr() geben jetzt ein namedtuple() zurück. (Beigetragen von Claudiu Popa in bpo-18615.)

socket

Funktionen mit Timeouts verwenden nun eine monotone Uhr anstelle einer Systemuhr. (Beigetragen von Victor Stinner in bpo-22043.)

Eine neue Methode socket.sendfile() ermöglicht das Senden einer Datei über einen Socket unter Verwendung der Hochleistungsfunktion os.sendfile() unter UNIX, was zu Uploads führt, die 2- bis 3-mal schneller sind als die Verwendung von reinem socket.send(). (Beigetragen von Giampaolo Rodola’ in bpo-17552.)

Die Methode socket.sendall() setzt das Socket-Timeout nicht mehr jedes Mal zurück, wenn Bytes empfangen oder gesendet werden. Das Socket-Timeout ist nun die maximale Gesamtdauer für das Senden aller Daten. (Beigetragen von Victor Stinner in bpo-23853.)

Das Argument backlog der Methode socket.listen() ist jetzt optional. Standardmäßig ist es auf SOMAXCONN oder 128 gesetzt, je nachdem, welcher Wert kleiner ist. (Beigetragen von Charles-François Natali in bpo-21455.)

ssl

Memory BIO Support

(Beigetragen von Geert Jansen in bpo-21965.)

Die neue Klasse SSLObject wurde hinzugefügt, um SSL-Protokollunterstützung für Fälle bereitzustellen, in denen die Netzwerk-E/A-Fähigkeiten von SSLSocket nicht erforderlich sind oder suboptimal sind. SSLObject repräsentiert eine SSL-Protokollinstanz, implementiert jedoch keine Netzwerk-E/A-Methoden, sondern bietet eine Memory-Buffer-Schnittstelle. Die neue Klasse MemoryBIO kann verwendet werden, um Daten zwischen Python und einer SSL-Protokollinstanz zu übergeben.

Die Memory BIO SSL-Unterstützung ist hauptsächlich für die Verwendung in Frameworks gedacht, die asynchrone E/A implementieren, für die das Bereitschaftsmodell von SSLSocket („select/poll“) ineffizient ist.

Eine neue Methode SSLContext.wrap_bio() kann verwendet werden, um eine neue SSLObject-Instanz zu erstellen.

Application-Layer Protocol Negotiation Support

(Beigetragen von Benjamin Peterson in bpo-20188.)

Wenn OpenSSL-Unterstützung vorhanden ist, implementiert das Modul ssl jetzt die TLS-Erweiterung Application-Layer Protocol Negotiation gemäß RFC 7301.

Die neue Methode SSLContext.set_alpn_protocols() kann verwendet werden, um anzugeben, welche Protokolle ein Socket während des TLS-Handshakes aushandeln soll.

Die neue Methode SSLSocket.selected_alpn_protocol() gibt das während des TLS-Handshakes ausgewählte Protokoll zurück. Das Flag HAS_ALPN zeigt an, ob ALPN-Unterstützung vorhanden ist.

Andere Änderungen

Es gibt eine neue Methode SSLSocket.version(), um die tatsächlich verwendete Protokollversion abzufragen. (Beigetragen von Antoine Pitrou in bpo-20421.)

Die Klasse SSLSocket implementiert nun eine Methode SSLSocket.sendfile(). (Beigetragen von Giampaolo Rodola’ in bpo-17552.)

Die Methode SSLSocket.send() löst nun entweder die Ausnahme ssl.SSLWantReadError oder ssl.SSLWantWriteError bei einem nicht blockierenden Socket aus, wenn die Operation blockieren würde. Zuvor gab sie 0 zurück. (Beigetragen von Nikolaus Rath in bpo-20951.)

Die Funktion cert_time_to_seconds() interpretiert die Eingabezeit nun als UTC und nicht als lokale Zeit, gemäß RFC 5280. Zusätzlich ist der Rückgabewert immer ein int. (Beigetragen von Akira Li in bpo-19940.)

Neue Methoden SSLObject.shared_ciphers() und SSLSocket.shared_ciphers() geben die Liste der vom Client während des Handshakes gesendeten Chiffren zurück. (Beigetragen von Benjamin Peterson in bpo-23186.)

Die Methoden SSLSocket.do_handshake(), SSLSocket.read(), SSLSocket.shutdown() und SSLSocket.write() der Klasse SSLSocket setzen das Socket-Timeout nicht mehr jedes Mal zurück, wenn Bytes empfangen oder gesendet werden. Das Socket-Timeout ist nun die maximale Gesamtdauer der Methode. (Beigetragen von Victor Stinner in bpo-23853.)

Die Funktion match_hostname() unterstützt jetzt das Abgleichen von IP-Adressen. (Beigetragen von Antoine Pitrou in bpo-23239.)

sqlite3

Die Klasse Row unterstützt nun vollständig das Sequenzprotokoll, insbesondere reversed()-Iteration und Slice-Indizierung. (Beigetragen von Claudiu Popa in bpo-10203; von Lucas Sinclair, Jessica McKellar und Serhiy Storchaka in bpo-13583.)

subprocess

Die neue Funktion run() wurde hinzugefügt. Sie führt den angegebenen Befehl aus und gibt ein CompletedProcess-Objekt zurück, das einen abgeschlossenen Prozess beschreibt. Die neue API ist konsistenter und der empfohlene Ansatz für die Aufrufe von Subprozessen in Python-Code, der keine Kompatibilität mit früheren Python-Versionen erfordert. (Beigetragen von Thomas Kluyver in bpo-23342.)

Beispiele

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')

sys

Eine neue Funktion set_coroutine_wrapper() ermöglicht das Setzen eines globalen Hooks, der aufgerufen wird, wenn ein Coroutine-Objekt von einer async def-Funktion erstellt wird. Eine entsprechende Funktion get_coroutine_wrapper() kann verwendet werden, um einen aktuell gesetzten Wrapper abzurufen. Beide Funktionen sind vorläufig und nur für Debugging-Zwecke gedacht. (Beigetragen von Yury Selivanov in bpo-24017.)

Eine neue Funktion is_finalizing() kann verwendet werden, um zu prüfen, ob der Python-Interpreter herunterfährt. (Beigetragen von Antoine Pitrou in bpo-22696.)

sysconfig

Der Name des Benutzer-Skriptverzeichnisses unter Windows enthält nun die ersten beiden Komponenten der Python-Version. (Beigetragen von Paul Moore in bpo-23437.)

tarfile

Das Argument mode der Funktion open() akzeptiert nun "x", um die exklusive Erstellung anzufordern. (Beigetragen von Berker Peksag in bpo-21717.)

Die Methoden TarFile.extractall() und TarFile.extract() nehmen nun ein Schlüsselwortargument numeric_owner entgegen. Wenn es auf True gesetzt ist, gehören die extrahierten Dateien und Verzeichnisse dem numerischen uid und gid aus dem Tarfile. Wenn es auf False (der Standardwert und das Verhalten in Versionen vor 3.5) gesetzt ist, gehören sie dem benannten Benutzer und der benannten Gruppe im Tarfile. (Beigetragen von Michael Vogt und Eric Smith in bpo-23193.)

Die Methode TarFile.list() akzeptiert nun ein optionales Schlüsselwortargument members, das auf eine Teilmenge der von TarFile.getmembers() zurückgegebenen Liste gesetzt werden kann. (Beigetragen von Serhiy Storchaka in bpo-21549.)

threading

Sowohl die Methoden Lock.acquire() als auch RLock.acquire() verwenden nun eine monotone Uhr für die Timeout-Verwaltung. (Beigetragen von Victor Stinner in bpo-22043.)

time

Die Funktion monotonic() ist jetzt immer verfügbar. (Beigetragen von Victor Stinner in bpo-22043.)

timeit

Eine neue Kommandozeilenoption -u oder --unit=U kann verwendet werden, um die Zeiteinheit für die Ausgabe des Timers anzugeben. Unterstützte Optionen sind usec, msec oder sec. (Beigetragen von Julian Gindi in bpo-18983.)

Die Funktion timeit() hat einen neuen Parameter globals zur Angabe des Namespace, in dem der Code ausgeführt wird. (Beigetragen von Ben Roberts in bpo-2527.)

tkinter

Das Modul tkinter._fix, das zur Einrichtung der Tcl/Tk-Umgebung unter Windows verwendet wird, wurde durch eine private Funktion im Modul _tkinter ersetzt, die keine permanenten Änderungen an Umgebungsvariablen vornimmt. (Beigetragen von Zachary Ware in bpo-20035.)

traceback

Neue Funktionen walk_stack() und walk_tb() zum bequemen Traversieren von Frame- und Traceback-Objekten. (Beigetragen von Robert Collins in bpo-17911.)

Neue leichtgewichtige Klassen: TracebackException, StackSummary und FrameSummary. (Beigetragen von Robert Collins in bpo-17911.)

Sowohl die Funktionen print_tb() als auch print_stack() unterstützen jetzt negative Werte für das Argument limit. (Beigetragen von Dmitry Kazakov in bpo-22619.)

types

Eine neue Funktion coroutine() zur Umwandlung von Generator- und generator-ähnlichen Objekten in awaitables. (Beigetragen von Yury Selivanov in bpo-24017.)

Ein neuer Typ namens CoroutineType, der für Coroutine-Objekte verwendet wird, die von async def-Funktionen erstellt werden. (Beigetragen von Yury Selivanov in bpo-24400.)

unicodedata

Das Modul unicodedata verwendet jetzt Daten aus Unicode 8.0.0.

unittest

Die Methode TestLoader.loadTestsFromModule() akzeptiert jetzt ein Keyword-only-Argument pattern, das an load_tests als drittes Argument übergeben wird. Gefundene Pakete werden jetzt auf load_tests überprüft, unabhängig davon, ob ihr Pfad mit pattern übereinstimmt, da es für einen Paketnamen unmöglich ist, mit dem Standardmuster übereinzustimmen. (Beigetragen von Robert Collins und Barry A. Warsaw in bpo-16662.)

Fehler bei der Unittest-Discovery werden jetzt im Attribut TestLoader.errors der Instanz TestLoader angezeigt. (Beigetragen von Robert Collins in bpo-19746.)

Eine neue Kommandozeilenoption --locals zum Anzeigen lokaler Variablen in Tracebacks. (Beigetragen von Robert Collins in bpo-22936.)

unittest.mock

Die Klasse Mock hat folgende Verbesserungen

  • Der Konstruktor der Klasse hat einen neuen Parameter unsafe, der Mock-Objekte dazu veranlasst, AttributeError bei Attributnamen auszulösen, die mit "assert" beginnen. (Beigetragen von Kushal Das in bpo-21238.)

  • Eine neue Methode Mock.assert_not_called(), um zu überprüfen, ob das Mock-Objekt aufgerufen wurde. (Beigetragen von Kushal Das in bpo-21262.)

Die Klasse MagicMock unterstützt jetzt die Operatoren __truediv__(), __divmod__() und __matmul__(). (Beigetragen von Johannes Baiter in bpo-20968 und Håkan Lövdahl in bpo-23581 und bpo-23568.)

Es ist nicht mehr notwendig, create=True explizit an die Funktion patch() zu übergeben, wenn Builtin-Namen gepatcht werden. (Beigetragen von Kushal Das in bpo-17660.)

urllib

Die neue Klasse request.HTTPPasswordMgrWithPriorAuth ermöglicht die Verwaltung von HTTP Basic Authentication-Anmeldeinformationen, um unnötige Behandlung von 401-Antworten zu vermeiden oder um Anmeldeinformationen bedingungslos bei der ersten Anfrage zu senden, um mit Servern zu kommunizieren, die eine 404-Antwort anstelle einer 401 zurückgeben, wenn der Authorization-Header nicht gesendet wird. (Beigetragen von Matej Cepl in bpo-19494 und Akshit Khurana in bpo-7159.)

Ein neues Argument quote_via für die Funktion parse.urlencode() bietet eine Möglichkeit, die Kodierung von Query-Teilen bei Bedarf zu steuern. (Beigetragen von Samwyse und Arnon Yaari in bpo-13866.)

Die Funktion request.urlopen() akzeptiert ein ssl.SSLContext-Objekt als context-Argument, das für die HTTPS-Verbindung verwendet wird. (Beigetragen von Alex Gaynor in bpo-22366.)

Die Funktion parse.urljoin() wurde aktualisiert, um die Semantik von RFC 3986 für die Auflösung relativer URLs zu verwenden, anstatt RFC 1808 und RFC 2396. (Beigetragen von Demian Brecht und Senthil Kumaran in bpo-22118.)

wsgiref

Das Argument headers des Konstruktors der Klasse headers.Headers ist jetzt optional. (Beigetragen von Pablo Torres Navarrete und SilentGhost in bpo-5800.)

xmlrpc

Die Klasse client.ServerProxy unterstützt jetzt das Protokoll für Kontextmanager. (Beigetragen von Claudiu Popa in bpo-20627.)

Der Konstruktor client.ServerProxy akzeptiert jetzt eine optionale Instanz von ssl.SSLContext. (Beigetragen von Alex Gaynor in bpo-22960.)

xml.sax

SAX-Parser unterstützen jetzt einen Zeichenstrom des Objekts xmlreader.InputSource. (Beigetragen von Serhiy Storchaka in bpo-2175.)

parseString() akzeptiert jetzt eine Instanz von str. (Beigetragen von Serhiy Storchaka in bpo-10590.)

zipfile

ZIP-Ausgaben können jetzt in nicht seekbare Streams geschrieben werden. (Beigetragen von Serhiy Storchaka in bpo-23252.)

Das Argument mode der Methode ZipFile.open() akzeptiert jetzt "x", um exklusives Erstellen anzufordern. (Beigetragen von Serhiy Storchaka in bpo-21717.)

Weitere Änderungen auf Modulebene

Viele Funktionen in den Modulen mmap, ossaudiodev, socket, ssl und codecs akzeptieren jetzt beschreibbare bytes-ähnliche Objekte. (Beigetragen von Serhiy Storchaka in bpo-23001.)

Optimierungen

Die Funktion os.walk() wurde auf POSIX-Systemen um das 3- bis 5-fache und unter Windows um das 7- bis 20-fache beschleunigt. Dies geschah unter Verwendung der neuen Funktion os.scandir(), die Dateinformationen aus den zugrunde liegenden Systemaufrufen readdir oder FindFirstFile/FindNextFile bereitstellt. (Beigetragen von Ben Hoyt mit Hilfe von Victor Stinner in bpo-23605.)

Die Konstruktion von bytes(int) (mit Null-Bytes gefüllt) ist schneller und verbraucht weniger Speicher für große Objekte. calloc() wird anstelle von malloc() zur Speicherzuweisung für diese Objekte verwendet. (Beigetragen von Victor Stinner in bpo-21233.)

Einige Operationen auf ipaddress IPv4Network und IPv6Network wurden massiv beschleunigt, wie z.B. subnets(), supernet(), summarize_address_range(), collapse_addresses(). Die Beschleunigung kann von 3 bis 15 Mal reichen. (Beigetragen von Antoine Pitrou, Michel Albert und Markus in bpo-21486, bpo-21487, bpo-20826, bpo-23266.)

Das Pickling von ipaddress-Objekten wurde optimiert, um deutlich kleinere Ausgaben zu erzeugen. (Beigetragen von Serhiy Storchaka in bpo-23133.)

Viele Operationen auf io.BytesIO sind jetzt 50% bis 100% schneller. (Beigetragen von Serhiy Storchaka in bpo-15381 und David Wilson in bpo-22003.)

Die Funktion marshal.dumps() ist jetzt schneller: 65–85% bei den Versionen 3 und 4, 20–25% bei den Versionen 0 bis 2 bei typischen Daten und bis zu 5-mal in besten Fällen. (Beigetragen von Serhiy Storchaka in bpo-20416 und bpo-23344.)

Der UTF-32-Encoder ist jetzt 3- bis 7-mal schneller. (Beigetragen von Serhiy Storchaka in bpo-15027.)

Reguläre Ausdrücke werden jetzt bis zu 10% schneller geparst. (Beigetragen von Serhiy Storchaka in bpo-19380.)

Die Funktion json.dumps() wurde optimiert, um mit ensure_ascii=False genauso schnell wie mit ensure_ascii=True zu laufen. (Beigetragen von Naoki Inada in bpo-23206.)

Die Funktionen PyObject_IsInstance() und PyObject_IsSubclass() wurden im häufigen Fall beschleunigt, dass das zweite Argument type als seine Metaklasse hat. (Beigetragen von Georg Brandl in bpo-22540.)

Methoden-Caching wurde leicht verbessert und lieferte in einigen Benchmarks eine Leistungssteigerung von bis zu 5%. (Beigetragen von Antoine Pitrou in bpo-22847.)

Objekte aus dem Modul random verbrauchen jetzt auf 64-Bit-Builds 50% weniger Speicher. (Beigetragen von Serhiy Storchaka in bpo-23488.)

Getter-Aufrufe für property() sind bis zu 25% schneller. (Beigetragen von Joe Jevnik in bpo-23910.)

Die Instanziierung von fractions.Fraction ist jetzt bis zu 30% schneller. (Beigetragen von Stefan Behnel in bpo-22464.)

Die String-Methoden find(), rfind(), split(), partition() und der String-Operator in sind jetzt für die Suche nach 1-Zeichen-Substrings erheblich schneller. (Beigetragen von Serhiy Storchaka in bpo-23573.)

Build- und C-API-Änderungen

Neue calloc-Funktionen wurden hinzugefügt

(Beigetragen von Victor Stinner in bpo-21233.)

Neue Funktionen für Kodierung/Dekodierung

(Beigetragen von Victor Stinner in bpo-18395.)

Eine neue Funktion PyCodec_NameReplaceErrors() zum Ersetzen von Unicode-Kodierungsfehlern durch \N{...}-Escapes. (Beigetragen von Serhiy Storchaka in bpo-19676.)

Eine neue Funktion PyErr_FormatV() ähnlich wie PyErr_Format(), die jedoch ein va_list-Argument akzeptiert. (Beigetragen von Antoine Pitrou in bpo-18711.)

Eine neue Ausnahme PyExc_RecursionError. (Beigetragen von Georg Brandl in bpo-19235.)

Neue Funktionen PyModule_FromDefAndSpec(), PyModule_FromDefAndSpec2() und PyModule_ExecDef() eingeführt durch PEP 489 – Mehrphasen-Initialisierung von Erweiterungsmodulen. (Beigetragen von Petr Viktorin in bpo-24268.)

Neue Funktionen PyNumber_MatrixMultiply() und PyNumber_InPlaceMatrixMultiply() zur Durchführung von Matrixmultiplikationen. (Beigetragen von Benjamin Peterson in bpo-21176. Siehe auch PEP 465 für Details.)

Der Slot PyTypeObject.tp_finalize ist jetzt Teil der stabilen ABI.

Windows-Builds erfordern jetzt Microsoft Visual C++ 14.0, das als Teil von Visual Studio 2015 erhältlich ist.

Erweiterungsmodule enthalten jetzt einen Plattforminformations-Tag in ihrem Dateinamen auf einigen Plattformen (der Tag ist optional, und CPython lädt Erweiterungen ohne ihn, obwohl wenn der Tag vorhanden und inkongruent ist, die Erweiterung nicht geladen wird)

  • Unter Linux enden Dateinamen von Erweiterungsmodulen mit .cpython-<major><minor>m-<architecture>-<os>.pyd

    • <major> ist die Major-Nummer der Python-Version; für Python 3.5 ist dies 3.

    • <minor> ist die Minor-Nummer der Python-Version; für Python 3.5 ist dies 5.

    • <architecture> ist die Hardware-Architektur, für die das Erweiterungsmodul gebaut wurde. Es ist meist entweder i386 für 32-Bit-Intel-Plattformen oder x86_64 für 64-Bit-Intel- (und AMD-) Plattformen.

    • <os> ist immer linux-gnu, außer für Erweiterungen, die für die 32-Bit-ABI auf 64-Bit-Plattformen erstellt wurden, in diesem Fall ist es linux-gnu32 (und <architecture> ist x86_64).

  • Unter Windows enden Dateinamen von Erweiterungsmodulen mit <debug>.cp<major><minor>-<platform>.pyd

    • <major> ist die Major-Nummer der Python-Version; für Python 3.5 ist dies 3.

    • <minor> ist die Minor-Nummer der Python-Version; für Python 3.5 ist dies 5.

    • <platform> ist die Plattform, für die das Erweiterungsmodul gebaut wurde, entweder win32 für Win32, win_amd64 für Win64, win_ia64 für Windows Itanium 64 und win_arm für Windows auf ARM.

    • Wenn im Debug-Modus kompiliert, ist <debug> _d, andernfalls ist es leer.

  • Auf OS X-Plattformen enden Dateinamen von Erweiterungsmodulen jetzt mit -darwin.so.

  • Auf allen anderen Plattformen sind die Dateinamen von Erweiterungsmodulen dieselben wie bei Python 3.4.

Veraltet

Neue Schlüsselwörter

async und await sollten nicht als Variablennamen, Klassennamen, Funktionsnamen oder Modulnamen verwendet werden. Eingeführt durch PEP 492 in Python 3.5 werden sie in Python 3.7 zu echten Schlüsselwörtern.

Veraltetes Python-Verhalten

Das Auslösen der Ausnahme StopIteration innerhalb eines Generators löst jetzt eine stille PendingDeprecationWarning aus, die in Python 3.6 zu einer nicht-stillen Deprecation-Warnung wird und in Python 3.7 eine RuntimeError auslöst. Einzelheiten finden Sie unter PEP 479: Änderung der StopIteration-Behandlung innerhalb von Generatoren.

Nicht unterstützte Betriebssysteme

Windows XP wird von Microsoft nicht mehr unterstützt, daher wird CPython 3.5 gemäß PEP 11 auf diesem Betriebssystem nicht mehr offiziell unterstützt.

Veraltete Python-Module, Funktionen und Methoden

Das Modul formatter ist jetzt vollständig veraltet und soll in Python 3.6 entfernt werden.

Die Funktion asyncio.async() ist zugunsten von ensure_future() veraltet.

Das Modul smtpd dekodierte in der Vergangenheit stets den DATA-Teil von E-Mails mit dem utf-8 Codec. Dies kann nun über den neuen decode_data-Parameter an SMTPServer gesteuert werden. Der Standardwert ist True, dieser Standard ist jedoch veraltet. Geben Sie den decode_data-Parameter mit einem geeigneten Wert an, um die Veraltungswarnung zu vermeiden.

Die direkte Zuweisung von Werten zu den key, value und coded_value von http.cookies.Morsel Objekten ist veraltet. Verwenden Sie stattdessen die set() Methode. Zusätzlich ist der undokumentierte Parameter LegalChars von set() veraltet und wird nun ignoriert.

Das Übergeben eines Formatstrings als Schlüsselwortargument format_string an die format() Methode der Klasse string.Formatter ist veraltet. (Beigetragen von Serhiy Storchaka in bpo-23671.)

Die Funktionen platform.dist() und platform.linux_distribution() sind nun veraltet. Linux-Distributionen verwenden zu viele verschiedene Wege, um sich selbst zu beschreiben, daher wird die Funktionalität an ein Paket übergeben. (Beigetragen von Vajrasky Kok und Berker Peksag in bpo-1322.)

Die bisher undokumentierten Methoden from_function und from_builtin von inspect.Signature sind veraltet. Verwenden Sie stattdessen die neue Methode Signature.from_callable(). (Beigetragen von Yury Selivanov in bpo-24248.)

Die Funktion inspect.getargspec() ist veraltet und wird voraussichtlich in Python 3.6 entfernt. (Siehe bpo-20438 für Details.)

Die Funktionen inspect getfullargspec(), getcallargs() und formatargspec() sind zugunsten der inspect.signature() API veraltet. (Beigetragen von Yury Selivanov in bpo-20438.)

Die Funktionen getargvalues() und formatargvalues() wurden mit der Veröffentlichung von Python 3.5.0 versehentlich als veraltet markiert.

Die Verwendung des Flags re.LOCALE mit Zeichenkettenmustern oder re.ASCII ist nun veraltet. (Beigetragen von Serhiy Storchaka in bpo-22407.)

Die Verwendung nicht erkannter Sondersequenzen, die aus '\' und einem ASCII-Buchstaben bestehen, in regulären Ausdrucksmustern und Ersatzmustern löst nun eine Veraltungswarnung aus und wird in Python 3.6 verboten. (Beigetragen von Serhiy Storchaka in bpo-23622.)

Das undokumentierte und inoffizielle Standardargument use_load_tests der Methode unittest.TestLoader.loadTestsFromModule() ist nun veraltet und wird ignoriert. (Beigetragen von Robert Collins und Barry A. Warsaw in bpo-16662.)

Entfernt

Entfernung von APIs und Features

Die folgenden obsoleten und zuvor veralteten APIs und Features wurden entfernt

  • Das Attribut __version__ wurde aus dem E-Mail-Paket entfernt. Der E-Mail-Code wurde schon seit langem nicht mehr separat von der Standardbibliothek ausgeliefert, und die Zeichenkette __version__ wurde in den letzten Releases nicht mehr aktualisiert.

  • Die interne Klasse Netrc im Modul ftplib war in 3.4 veraltet und wurde nun entfernt. (Beigetragen von Matt Chaput in bpo-6623.)

  • Das Konzept von .pyo-Dateien wurde entfernt.

  • Die Klasse JoinableQueue im provisorischen Modul asyncio war in 3.4.4 veraltet und ist nun entfernt. (Beigetragen von A. Jesse Jiryu Davis in bpo-23464.)

Portierung auf Python 3.5

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

Änderungen im Python-Verhalten

  • Aufgrund eines Versehen akzeptierten frühere Python-Versionen fälschlicherweise die folgende Syntax

    f(1 for x in [1], *args)
    f(1 for x in [1], **kwargs)
    

    Python 3.5 löst nun korrekt einen SyntaxError aus, da Generatorausdrücke in Klammern gesetzt werden müssen, wenn sie nicht das einzige Argument für eine Funktion sind.

Änderungen in der Python-API

  • PEP 475: Systemaufrufe werden nun beim Unterbrechen durch ein Signal erneut versucht, anstatt InterruptedError auszulösen, wenn der Python-Signalhandler keine Ausnahme auslöst.

  • Vor Python 3.5 wurde ein datetime.time Objekt als falsch betrachtet, wenn es Mitternacht in UTC repräsentierte. Dieses Verhalten wurde als obskur und fehleranfällig angesehen und in Python 3.5 entfernt. Siehe bpo-13936 für vollständige Details.

  • Die Methode ssl.SSLSocket.send() löst nun entweder ssl.SSLWantReadError oder ssl.SSLWantWriteError auf einem nicht-blockierenden Socket aus, wenn die Operation blockieren würde. Zuvor gab sie 0 zurück. (Beigetragen von Nikolaus Rath in bpo-20951.)

  • Das Attribut __name__ von Generatoren wird nun aus dem Funktionsnamen gesetzt und nicht mehr aus dem Codenamen. Verwenden Sie gen.gi_code.co_name, um den Codenamen abzurufen. Generatoren haben auch ein neues Attribut __qualname__, den qualifizierten Namen, der nun für die Darstellung eines Generators (repr(gen)) verwendet wird. (Beigetragen von Victor Stinner in bpo-21205.)

  • Der veraltete "strict"-Modus und das Argument von HTMLParser, HTMLParser.error() und die Ausnahme HTMLParserError wurden entfernt. (Beigetragen von Ezio Melotti in bpo-15114.) Das Argument convert_charrefs von HTMLParser ist nun standardmäßig True. (Beigetragen von Berker Peksag in bpo-21047.)

  • Obwohl es kein formeller Bestandteil der API ist, ist es für Portierungszwecke (d.h. zur Fehlerbehebung in Tests) erwähnenswert, dass Fehlermeldungen, die zuvor die Form hatten: „’sometype‘ unterstützt das Pufferprotokoll nicht“, nun die Form haben: „Ein bytes-ähnliches Objekt wird benötigt, kein ‚sometype‘“. (Beigetragen von Ezio Melotti in bpo-16518.)

  • Wenn das aktuelle Verzeichnis auf ein Verzeichnis gesetzt wird, das nicht mehr existiert, wird FileNotFoundError nicht mehr ausgelöst. Stattdessen gibt find_spec() None zurück, **ohne** None in sys.path_importer_cache zu cachen, was sich vom typischen Fall unterscheidet (bpo-22834).

  • HTTP-Statuscodes und -Nachrichten aus http.client und http.server wurden in eine gemeinsame HTTPStatus-Enum refaktorisiert. Die Werte in http.client und http.server bleiben aus Kompatibilitätsgründen erhalten. (Beigetragen von Demian Brecht in bpo-21793.)

  • Wenn ein Import-Loader exec_module() definiert, wird nun erwartet, dass er auch create_module() definiert (löst nun eine DeprecationWarning aus, wird in Python 3.6 ein Fehler sein). Wenn der Loader von importlib.abc.Loader erbt, gibt es nichts zu tun, andernfalls definieren Sie einfach create_module() so, dass es None zurückgibt. (Beigetragen von Brett Cannon in bpo-23014.)

  • Die Funktion re.split() hat leere Musterübereinstimmungen immer ignoriert, sodass das Muster "x*" wie "x+" funktionierte und das Muster "\b" nie funktionierte. Nun löst re.split() eine Warnung aus, wenn das Muster eine leere Zeichenkette abgleichen könnte. Zur Kompatibilität verwenden Sie Muster, die niemals eine leere Zeichenkette abgleichen (z.B. "x+" statt "x*"). Muster, die nur eine leere Zeichenkette abgleichen könnten (wie "\b"), lösen nun einen Fehler aus. (Beigetragen von Serhiy Storchaka in bpo-22818.)

  • Die dictum-ähnliche Schnittstelle von http.cookies.Morsel wurde konsistent gemacht: Der Vergleich von Morsels berücksichtigt nun key und value, copy() ergibt nun eine Morsel-Instanz anstelle eines dict, und update() löst nun eine Ausnahme aus, wenn einer der Schlüssel im Aktualisierungsdictionary ungültig ist. Zusätzlich ist der undokumentierte Parameter LegalChars von set() veraltet und wird nun ignoriert. (Beigetragen von Demian Brecht in bpo-2211.)

  • PEP 488 hat .pyo-Dateien aus Python entfernt und den optionalen Tag opt- in .pyc-Dateinamen eingeführt. importlib.util.cache_from_source() hat einen Parameter optimization erhalten, um das Tag opt- zu steuern. Aus diesem Grund ist der Parameter debug_override der Funktion nun veraltet. .pyo-Dateien werden auch nicht mehr als Datei-Argument für den Python-Interpreter unterstützt und dienen daher keinem Zweck mehr, wenn sie eigenständig verteilt werden (d.h. sourcelose Code-Distribution). Da sich die magische Zahl für Bytecode in Python 3.5 geändert hat, sind alle alten .pyo-Dateien aus früheren Python-Versionen unabhängig von diesem PEP ungültig.

  • Das Modul socket exportiert nun die Konstante CAN_RAW_FD_FRAMES unter Linux 3.6 und höher.

  • Die Funktion ssl.cert_time_to_seconds() interpretiert die Eingabezeit nun als UTC und nicht als lokale Zeit, gemäß RFC 5280. Zusätzlich ist der Rückgabewert immer eine int. (Beigetragen von Akira Li in bpo-19940.)

  • Das Werkzeug pygettext.py verwendet nun das Standardformat +NNNN für Zeitzonen im POT-Creation-Date-Header.

  • Das Modul smtplib verwendet nun sys.stderr anstelle der vorherigen modularen Variable stderr für Debug-Ausgaben. Wenn Ihr (Test-)Programm auf dem Patchen der modularen Variable zum Abfangen der Debug-Ausgaben beruht, müssen Sie es aktualisieren, um stattdessen sys.stderr abzufangen.

  • Die Methoden str.startswith() und str.endswith() geben nun nicht mehr True zurück, wenn die leere Zeichenkette gefunden wird und die Indizes vollständig außerhalb des Bereichs liegen. (Beigetragen von Serhiy Storchaka in bpo-24284.)

  • Die Funktion inspect.getdoc() gibt nun von Basisklassen geerbte Dokumentationsstrings zurück. Dokumentationsstrings müssen nicht mehr dupliziert werden, wenn die geerbte Dokumentation angemessen ist. Um einen geerbten String zu unterdrücken, muss eine leere Zeichenkette angegeben werden (oder die Dokumentation kann ausgefüllt werden). Diese Änderung wirkt sich auf die Ausgabe des Moduls pydoc und der Funktion help() aus. (Beigetragen von Serhiy Storchaka in bpo-15582.)

  • Verschachtelte Aufrufe von functools.partial() werden nun abgeflacht. Wenn Sie sich auf das frühere Verhalten verlassen haben, können Sie nun entweder ein Attribut zu einem functools.partial()-Objekt hinzufügen oder eine Unterklasse von functools.partial() erstellen. (Beigetragen von Alexander Belopolsky in bpo-7830.)

Änderungen in der C-API

  • Das undokumentierte `format`-Mitglied der (nicht-öffentlichen) `PyMemoryViewObject`-Struktur wurde entfernt. Alle Erweiterungen, die auf die relevanten Teile in `memoryobject.h` angewiesen sind, müssen neu kompiliert werden.

  • Die Struktur PyMemAllocator wurde in PyMemAllocatorEx umbenannt und ein neues Feld calloc wurde hinzugefügt.

  • Entferntes, nicht dokumentiertes Makro PyObject_REPR(), das Referenzen leckte. Verwenden Sie das Formatzeichen %R in Funktionen wie PyUnicode_FromFormat(), um das repr() des Objekts zu formatieren. (Beigetragen von Serhiy Storchaka in bpo-22453.)

  • Da das Fehlen des Attributs __module__ das Pickling und die Introspektion beeinträchtigt, wird nun eine Veraltungswarnung für eingebaute Typen ohne das Attribut __module__ ausgegeben. Dies wird in Zukunft ein AttributeError sein. (Beigetragen von Serhiy Storchaka in bpo-20204.)

  • Als Teil der Implementierung von PEP 492 wurde der Slot tp_reserved von PyTypeObject durch einen Slot tp_as_async ersetzt. Informationen zu neuen Typen, Strukturen und Funktionen finden Sie unter Coroutine Objects.

Bemerkenswerte Änderungen in Python 3.5.4

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

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