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()undmemoryview.hex(). (Beigesteuert von Arnon Yaari in bpo-9951.)memoryviewunterstü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 vonyield from-Ausdrücken iteriert wird. (Beigesteuert von Benno Leslie und Yury Selivanov in bpo-24450.)Eine neue Ausnahme
RecursionErrorwird nun ausgelöst, wenn die maximale Rekursionstiefe erreicht ist. (Beigesteuert von Georg Brandl in bpo-19235.)
CPython-Implementierungsverbesserungen
Wenn das Gebietsschema
LC_TYPEdas POSIX-Gebietsschema (C-Gebietsschema) ist, verwendensys.stdinundsys.stdoutnun den Fehlerbehandlersurrogateescapeanstelle des Fehlerbehandlersstrict. (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
collections.OrderedDictist nun in C implementiert, was ihn 4- bis 100-mal schneller macht.Das Modul
sslerhielt Unterstützung für Memory BIO, welche die SSL-Protokollbehandlung von der Netzwerk-I/O entkoppelt.Die neue Funktion
os.scandir()bietet eine bessere und deutlich schnellere Methode zur Verzeichnisdurchquerung.functools.lru_cache()wurde größtenteils in C neu implementiert, was zu einer deutlich besseren Leistung führt.Die neue Funktion
subprocess.run()bietet eine vereinfachte Methode zum Ausführen von Subprozessen.Das Modul
tracebackwurde für verbesserte Leistung und Benutzerfreundlichkeit erheblich erweitert.
Sicherheitsverbesserungen
SSLv3 ist nun in der gesamten Standardbibliothek deaktiviert. Es kann immer noch durch manuelle Instanziierung eines
ssl.SSLContextaktiviert 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).
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:
Ignorieren Sie die
InterruptedError.Behandeln Sie die
InterruptedErrorund 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:
Funktionen des Moduls
faulthandler;Funktionen des Moduls
os:fchdir(),fchmod(),fchown(),fdatasync(),fstat(),fstatvfs(),fsync(),ftruncate(),mkfifo(),mknod(),open(),posix_fadvise(),posix_fallocate(),pread(),pwrite(),read(),readv(),sendfile(),wait3(),wait4(),wait(),waitid(),waitpid(),write(),writev();Spezialfälle:
os.close()undos.dup2()ignorieren nunEINTRFehler; der Systemaufruf wird nicht wiederholt (siehe PEP für die Begründung);Funktionen von
select:devpoll.poll(),epoll.poll(),kqueue.control(),poll.poll(),select();Methoden der Klasse
socket:accept(),connect()(außer für nicht-blockierende Sockets),recv(),recvfrom(),recvmsg(),send(),sendall(),sendmsg(),sendto();
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
-bbeeinflusst nun Vergleiche vonbytesmitint. (Beigetragen von Serhiy Storchaka in bpo-23681.)Neue kasachische
kz1048und tadschikischekoi8_tCodecs. (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
Neue Debugging-APIs: Methoden
loop.set_debug()undloop.get_debug(). (Beigetragen von Victor Stinner.)Die Proactor-Event-Schleife unterstützt nun SSL. (Beigetragen von Antoine Pitrou und Victor Stinner in bpo-22560.)
Eine neue Methode
loop.is_closed()zur Überprüfung, ob die Event-Schleife geschlossen ist. (Beigetragen von Victor Stinner in bpo-21326.)Eine neue Methode
loop.create_task(), um bequem einen neuenTaskfür eine Koroutine zu erstellen und zu planen. Die Methodecreate_taskwird auch von allen asyncio-Funktionen verwendet, die Koroutinen in Tasks verpacken, wie z. B.asyncio.wait(),asyncio.gather(), etc. (Beigetragen von Victor Stinner.)Eine neue Methode
transport.get_write_buffer_limits(), um die *hohen* und *niedrigen* Grenzwertlimits des Flusskontrollmechanismus abzufragen. (Beigetragen von Victor Stinner.)Die Funktion
async()ist zugunsten vonensure_future()veraltet. (Beigetragen von Yury Selivanov.)Neue Methoden
loop.set_task_factory()undloop.get_task_factory()zum Anpassen der Task-Fabrik, die von der Methodeloop.create_task()verwendet wird. (Beigetragen von Yury Selivanov.)Neue Warteschlangenmethoden
Queue.join()undQueue.task_done(). (Beigetragen von Victor Stinner.)Die Klasse
JoinableQueuewurde zugunsten der Klasseasyncio.Queueentfernt. (Beigetragen von Victor Stinner.)
Änderungen in 3.5.1
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 von anderen Threads an Event-Schleifen zu übergeben. (Beigetragen von Vincent Michel.)Neue Methode
Transport.is_closing(), um zu überprüfen, ob der Transport schließt oder geschlossen ist. (Beigetragen von Yury Selivanov.)Die Methode
loop.create_server()kann nun eine Liste von Hosts akzeptieren. (Beigetragen von Yann Sionneau.)
Ä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 schnellerenasyncio.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()undloop.create_server()sind optimiert, um den Aufruf der Systemfunktiongetaddrinfozu 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 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,
AttributeErrorbei 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
Py_DecodeLocale()(ersetzt_Py_char2wchar()),Py_EncodeLocale()(ersetzt_Py_wchar2char()).
(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 dies3.<minor>ist die Minor-Nummer der Python-Version; für Python 3.5 ist dies5.<architecture>ist die Hardware-Architektur, für die das Erweiterungsmodul gebaut wurde. Es ist meist entwederi386für 32-Bit-Intel-Plattformen oderx86_64für 64-Bit-Intel- (und AMD-) Plattformen.<os>ist immerlinux-gnu, außer für Erweiterungen, die für die 32-Bit-ABI auf 64-Bit-Plattformen erstellt wurden, in diesem Fall ist eslinux-gnu32(und<architecture>istx86_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 dies3.<minor>ist die Minor-Nummer der Python-Version; für Python 3.5 ist dies5.<platform>ist die Plattform, für die das Erweiterungsmodul gebaut wurde, entwederwin32für Win32,win_amd64für Win64,win_ia64für Windows Itanium 64 undwin_armfü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
Netrcim Modulftplibwar 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
asynciowar 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
SyntaxErroraus, 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
InterruptedErrorauszulösen, wenn der Python-Signalhandler keine Ausnahme auslöst.Vor Python 3.5 wurde ein
datetime.timeObjekt 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 entwederssl.SSLWantReadErroroderssl.SSLWantWriteErrorauf einem nicht-blockierenden Socket aus, wenn die Operation blockieren würde. Zuvor gab sie0zurü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 Siegen.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 AusnahmeHTMLParserErrorwurden entfernt. (Beigetragen von Ezio Melotti in bpo-15114.) Das Argument convert_charrefs vonHTMLParserist nun standardmäßigTrue. (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
FileNotFoundErrornicht mehr ausgelöst. Stattdessen gibtfind_spec()Nonezurück, **ohne**Noneinsys.path_importer_cachezu cachen, was sich vom typischen Fall unterscheidet (bpo-22834).HTTP-Statuscodes und -Nachrichten aus
http.clientundhttp.serverwurden in eine gemeinsameHTTPStatus-Enum refaktorisiert. Die Werte inhttp.clientundhttp.serverbleiben aus Kompatibilitätsgründen erhalten. (Beigetragen von Demian Brecht in bpo-21793.)Wenn ein Import-Loader
exec_module()definiert, wird nun erwartet, dass er auchcreate_module()definiert (löst nun eineDeprecationWarningaus, wird in Python 3.6 ein Fehler sein). Wenn der Loader vonimportlib.abc.Loadererbt, gibt es nichts zu tun, andernfalls definieren Sie einfachcreate_module()so, dass esNonezurü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östre.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.Morselwurde konsistent gemacht: Der Vergleich von Morsels berücksichtigt nunkeyundvalue,copy()ergibt nun eineMorsel-Instanz anstelle einesdict, undupdate()löst nun eine Ausnahme aus, wenn einer der Schlüssel im Aktualisierungsdictionary ungültig ist. Zusätzlich ist der undokumentierte Parameter LegalChars vonset()veraltet und wird nun ignoriert. (Beigetragen von Demian Brecht in bpo-2211.)PEP 488 hat
.pyo-Dateien aus Python entfernt und den optionalen Tagopt-in.pyc-Dateinamen eingeführt.importlib.util.cache_from_source()hat einen Parameter optimization erhalten, um das Tagopt-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
socketexportiert nun die KonstanteCAN_RAW_FD_FRAMESunter 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 eineint. (Beigetragen von Akira Li in bpo-19940.)Das Werkzeug
pygettext.pyverwendet nun das Standardformat +NNNN für Zeitzonen im POT-Creation-Date-Header.Das Modul
smtplibverwendet nunsys.stderranstelle der vorherigen modularen Variablestderrfü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()undstr.endswith()geben nun nicht mehrTruezurü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 Modulspydocund der Funktionhelp()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 einemfunctools.partial()-Objekt hinzufügen oder eine Unterklasse vonfunctools.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
PyMemAllocatorwurde inPyMemAllocatorExumbenannt und ein neues Feldcallocwurde hinzugefügt.Entferntes, nicht dokumentiertes Makro
PyObject_REPR(), das Referenzen leckte. Verwenden Sie das Formatzeichen%Rin Funktionen wiePyUnicode_FromFormat(), um dasrepr()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 einAttributeErrorsein. (Beigetragen von Serhiy Storchaka in bpo-20204.)Als Teil der Implementierung von PEP 492 wurde der Slot
tp_reservedvonPyTypeObjectdurch einen Slottp_as_asyncersetzt. 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.