Was ist neu in Python 3.4

Autor:

R. David Murray <rdmurray@bitdance.com> (Herausgeber)

Dieser Artikel erklärt die neuen Funktionen in Python 3.4 im Vergleich zu 3.3. Python 3.4 wurde am 16. März 2014 veröffentlicht. Ausführliche Details finden Sie in der Änderungsliste.

Siehe auch

PEP 429 – Python 3.4 Release-Zeitplan

Zusammenfassung – Release-Highlights

Neue Syntaxfunktionen

  • In Python 3.4 wurden keine neuen Syntaxfunktionen hinzugefügt.

Andere neue Funktionen

Neue Bibliotheksmodule

Signifikant verbesserte Bibliotheksmodule

Sicherheitsverbesserungen

CPython-Implementierungsverbesserungen

Lesen Sie weiter für eine umfassende Liste der für Endbenutzer sichtbaren Änderungen, einschließlich vieler weiterer kleinerer Verbesserungen, CPython-Optimierungen, veralteter Funktionen und möglicher Portierungsprobleme.

Neue Funktionen

PEP 453: Explizites Bootstrapping von PIP in Python-Installationen

Bootstrapping von Pip standardmäßig

Das neue Modul ensurepip (definiert in PEP 453) bietet einen standardmäßigen plattformübergreifenden Mechanismus zum Bootstrapping des Pip-Installers in Python-Installationen und virtuelle Umgebungen. Die Version von pip, die mit Python 3.4.0 enthalten ist, ist pip 1.5.4, und zukünftige Wartungsversionen von 3.4.x werden die gebündelte Version auf die neueste Version von pip aktualisieren, die zum Zeitpunkt der Erstellung des Release Candidates verfügbar ist.

Standardmäßig werden die Befehle pipX und pipX.Y auf allen Plattformen installiert (wobei X.Y für die Version der Python-Installation steht) zusammen mit dem Python-Paket pip und seinen Abhängigkeiten. Unter Windows und in virtuellen Umgebungen auf allen Plattformen wird auch der nicht versionierte pip-Befehl installiert. Auf anderen Plattformen verweist der systemweite, nicht versionierte pip-Befehl in der Regel auf die separat installierte Python 2-Version.

Das Kommandozeilen-Dienstprogramm pyvenv und das Modul venv nutzen das Modul ensurepip, um pip in virtuellen Umgebungen leicht verfügbar zu machen. Bei Verwendung des Kommandozeilen-Dienstprogramms wird pip standardmäßig installiert, während bei Verwendung der venv-Modul-API (API) die Installation von pip explizit angefordert werden muss.

Für CPython Source-Builds auf POSIX-Systemen bootstrappen die Befehle make install und make altinstall standardmäßig pip. Dieses Verhalten kann über Konfigurationsoptionen gesteuert und über Makefile-Optionen überschrieben werden.

Unter Windows und Mac OS X installieren die CPython-Installer standardmäßig pip zusammen mit CPython selbst (Benutzer können die Installation während des Installationsvorgangs abwählen). Windows-Benutzer müssen die automatischen PATH-Änderungen akzeptieren, um pip standardmäßig über die Kommandozeile verfügbar zu haben. Andernfalls kann es weiterhin über den Python-Launcher für Windows als py -m pip aufgerufen werden.

Wie in der PEP diskutiert, können Plattformpaketer entscheiden, diese Befehle nicht standardmäßig zu installieren, solange sie bei Aufruf klare und einfache Anweisungen zur Installation auf dieser Plattform geben (normalerweise über den Systempaketmanager).

Hinweis

Um Konflikte zwischen parallelen Python 2- und Python 3-Installationen zu vermeiden, werden beim direkten Aufruf von ensurepip standardmäßig nur die versionierten Befehle pip3 und pip3.4 gebootstrapped – die Option --default-pip wird benötigt, um auch den nicht versionierten pip-Befehl anzufordern. pyvenv und der Windows-Installer stellen sicher, dass der nicht qualifizierte pip-Befehl in diesen Umgebungen verfügbar ist, und pip kann auf Systemen mit mehreren Python-Installationen immer über den Schalter -m anstelle des direkten Aufrufs aufgerufen werden, um Mehrdeutigkeiten zu vermeiden.

Dokumentationsänderungen

Als Teil dieser Änderung wurden die Abschnitte Installieren von Python-Modulen und Verteilen von Python-Modulen der Dokumentation vollständig neu gestaltet als kurze Anleitungen und FAQ-Dokumente. Die meisten Paketierungsdokumente wurden in das von der Python Packaging Authority gepflegte Python Packaging User Guide und die Dokumentation der einzelnen Projekte verschoben.

Da diese Migration derzeit noch unvollständig ist, sind die Legacy-Versionen dieser Anleitungen weiterhin als Erstellen von C- und C++-Erweiterungen mit setuptools und Erstellen von C- und C++-Erweiterungen mit setuptools verfügbar.

Siehe auch

PEP 453 – Explizites Bootstrapping von pip in Python-Installationen

PEP geschrieben von Donald Stufft und Nick Coghlan, implementiert von Donald Stufft, Nick Coghlan, Martin von Löwis und Ned Deily.

PEP 446: Neu erstellte Dateideskriptoren sind nicht vererbbar

PEP 446 macht neu erstellte Dateideskriptoren nicht vererbbar. Im Allgemeinen ist dies das gewünschte Verhalten einer Anwendung: Beim Starten eines neuen Prozesses können die aktuell geöffneten Dateien auch im neuen Prozess geöffnet sein, was zu allen möglichen schwer zu findenden Fehlern und potenziell zu Sicherheitsproblemen führen kann.

Es gibt jedoch Fälle, in denen eine Vererbung gewünscht ist. Um diese Fälle zu unterstützen, stehen die folgenden neuen Funktionen und Methoden zur Verfügung:

Siehe auch

PEP 446 – Neu erstellte Dateideskriptoren nicht vererbbar machen

PEP geschrieben und implementiert von Victor Stinner.

Verbesserungen bei der Codec-Verarbeitung

Seit seiner Einführung war das Modul codecs immer darauf ausgelegt, als typenneutrales, dynamisches Kodierungs- und Dekodierungssystem zu fungieren. Seine enge Kopplung mit dem Python-Textmodell, insbesondere die typspezifischen Komfortmethoden der integrierten Typen str, bytes und bytearray, hat dies jedoch historisch verschleiert.

Als wichtiger Schritt zur Klärung der Situation sind die Komfortfunktionen codecs.encode() und codecs.decode() jetzt in Python 2.7, 3.3 und 3.4 ordnungsgemäß dokumentiert. Diese Funktionen existieren seit Python 2.4 im Modul codecs (und wurden durch die Regressionstestsuite abgedeckt), waren aber zuvor nur durch Laufzeit-Introspektion auffindbar.

Im Gegensatz zu den Komfortmethoden von str, bytes und bytearray unterstützen die Komfortfunktionen von codecs beliebige Codecs sowohl in Python 2 als auch in Python 3, anstatt auf Unicode-Textkodierungen (in Python 3) oder basestring <-> basestring-Konvertierungen (in Python 2) beschränkt zu sein.

In Python 3.4 ist der Interpreter in der Lage, die bekannten Nicht-Text-Kodierungen der Standardbibliothek zu identifizieren und Benutzer bei Bedarf auf diese allgemeinen Komfortfunktionen zu verweisen

>>> b"abcdef".decode("hex")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.decode() to handle arbitrary codecs

>>> "hello".encode("rot13")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: 'rot13' is not a text encoding; use codecs.encode() to handle arbitrary codecs

>>> open("foo.txt", encoding="hex")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.open() to handle arbitrary codecs

In einer verwandten Änderung werden, wann immer dies ohne Bruch der Rückwärtskompatibilität möglich ist, Ausnahmen, die bei Kodierungs- und Dekodierungsoperationen auftreten, in eine verkettete Ausnahme desselben Typs eingehüllt, die den Namen des für den Fehler verantwortlichen Codecs angibt.

>>> import codecs

>>> codecs.decode(b"abcdefgh", "hex")
Traceback (most recent call last):
  File "/usr/lib/python3.4/encodings/hex_codec.py", line 20, in hex_decode
    return (binascii.a2b_hex(input), len(input))
binascii.Error: Non-hexadecimal digit found

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

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
binascii.Error: decoding with 'hex' codec failed (Error: Non-hexadecimal digit found)

>>> codecs.encode("hello", "bz2")
Traceback (most recent call last):
  File "/usr/lib/python3.4/encodings/bz2_codec.py", line 17, in bz2_encode
    return (bz2.compress(input), len(input))
  File "/usr/lib/python3.4/bz2.py", line 498, in compress
    return comp.compress(data) + comp.flush()
TypeError: 'str' does not support the buffer interface

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

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: encoding with 'bz2' codec failed (TypeError: 'str' does not support the buffer interface)

Schließlich haben diese Verbesserungen, wie die obigen Beispiele zeigen, die Wiederherstellung der Komfort-Aliase für die Nicht-Unicode-Codecs ermöglicht, die selbst in Python 3.2 wiederhergestellt wurden. Das bedeutet, dass die Kodierung von Binärdaten in und aus ihrer hexadezimalen Darstellung (z. B.) jetzt wie folgt geschrieben werden kann:

>>> from codecs import encode, decode
>>> encode(b"hello", "hex")
b'68656c6c6f'
>>> decode(b"68656c6c6f", "hex")
b'hello'

Die in der Standardbibliothek bereitgestellten Binär- und Texttransformationen werden in Binäre Transformationen und Texttransformationen beschrieben.

(Beigetragen von Nick Coghlan in bpo-7475, bpo-17827, bpo-17828 und bpo-19619.)

PEP 451: Ein ModuleSpec-Typ für das Importsystem

PEP 451 bietet eine Kapselung der Informationen über ein Modul, die die Importmaschinerie zum Laden des Moduls verwendet (d. h. eine Modulspezifikation). Dies vereinfacht sowohl die Importimplementierung als auch mehrere Import-bezogene APIs. Die Änderung ist auch ein wichtiger Schritt für mehrere zukünftige Import-bezogene Verbesserungen.

Die öffentlich sichtbaren Änderungen der PEP sind vollständig abwärtskompatibel. Darüber hinaus sollten sie für alle außer den Importer-Autoren transparent sein. Wichtige Finder- und Loader-Methoden sind veraltet, funktionieren aber weiterhin. Neue Importer sollten die neuen Methoden verwenden, die in der PEP beschrieben sind. Sehen Sie im Abschnitt Veraltet nach einer Liste der Methoden, die ersetzt werden sollten, und deren Ersatz.

Andere Sprachänderungen

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

  • Unicode-Datenbank aktualisiert auf UCD Version 6.3.

  • min() und max() akzeptieren jetzt ein *keyword-only* Argument *default*, das verwendet werden kann, um den Wert anzugeben, den sie zurückgeben, wenn das ausgewertete Iterable leer ist. (Beigetragen von Julian Berman in bpo-18111.)

  • Modulobjekte sind jetzt schwache Referenzierung möglich.

  • Modul-Attribute __file__ (und verwandte Werte) sollten jetzt standardmäßig immer absolute Pfade enthalten, mit der einzigen Ausnahme von __main__.__file__, wenn ein Skript direkt über einen relativen Pfad ausgeführt wurde. (Beigetragen von Brett Cannon in bpo-18416.)

  • Alle UTF-\* Codecs (außer UTF-7) lehnen jetzt Surrogate sowohl beim Kodieren als auch beim Dekodieren ab, es sei denn, der Fehlerhandler surrogatepass wird verwendet, mit der Ausnahme des UTF-16-Dekoders (der gültige Surrogate-Paare akzeptiert) und des UTF-16-Kodierers (der sie beim Kodieren von Nicht-BMP-Zeichen erzeugt). (Beigetragen von Victor Stinner, Kang-Hao (Kenny) Lu und Serhiy Storchaka in bpo-12892.)

  • Neuer deutscher EBCDIC Codec cp273. (Beigetragen von Michael Bierenfeld und Andrew Kuchling in bpo-1097797.)

  • Neuer ukrainischer Codec cp1125. (Beigetragen von Serhiy Storchaka in bpo-19668.)

  • bytes.join() und bytearray.join() akzeptieren jetzt beliebige Pufferobjekte als Argumente. (Beigetragen von Antoine Pitrou in bpo-15958.)

  • Der Konstruktor int akzeptiert jetzt jedes Objekt, das eine __index__-Methode für sein *base*-Argument hat. (Beigetragen von Mark Dickinson in bpo-16772.)

  • Frame-Objekte haben jetzt eine Methode clear(), die alle Referenzen auf lokale Variablen aus dem Frame löscht. (Beigetragen von Antoine Pitrou in bpo-17934.)

  • memoryview ist jetzt als Sequence registriert und unterstützt die integrierte Funktion reversed(). (Beigetragen von Nick Coghlan und Claudiu Popa in bpo-18690 und bpo-19078.)

  • Die von help() gemeldeten Signaturen wurden aufgrund der Einführung von Argument Clinic und anderer Änderungen an den Modulen inspect und pydoc in mehreren Fällen modifiziert und verbessert.

  • __length_hint__() ist jetzt Teil der formalen Sprachenspezifikation (siehe PEP 424). (Beigetragen von Armin Ronacher in bpo-16148.)

Neue Module

asyncio

Das neue Modul asyncio (definiert in PEP 3156) bietet ein standardmäßiges, modulares Event-Loop-Modell für Python, bietet solide asynchrone I/O-Unterstützung in der Standardbibliothek und erleichtert anderen Event-Loop-Implementierungen die Interaktion mit der Standardbibliothek und untereinander.

Für Python 3.4 gilt dieses Modul als provisorische API.

Siehe auch

PEP 3156 – Asynchronous IO Support Rebooted: das „asyncio“ Modul

PEP geschrieben und Implementierung geleitet von Guido van Rossum.

ensurepip

Das neue Modul ensurepip ist die primäre Infrastruktur für die Implementierung von PEP 453. Im normalen Verlauf müssen Endbenutzer nicht mit diesem Modul interagieren, aber es kann verwendet werden, um pip manuell zu bootstrappen, wenn das automatisierte Bootstrapping in eine Installation oder virtuelle Umgebung abgelehnt wurde.

ensurepip enthält eine gebündelte Kopie von pip, die auf dem neuesten Stand ist, wie zum Zeitpunkt der ersten Release Candidate der CPython-Version, mit der es ausgeliefert wird (dies gilt sowohl für Wartungs- als auch für Funktions-Releases). ensurepip greift nicht auf das Internet zu. Wenn die Installation über Internetzugang verfügt, kann das gebündelte pip nach der Ausführung von ensurepip verwendet werden, um pip auf eine neuere Version als die gebündelte zu aktualisieren. (Beachten Sie, dass eine solche aktualisierte Version von pip als separat installiertes Paket gilt und nicht entfernt wird, wenn Python deinstalliert wird.)

Das Modul heißt ensurepip, weil es nichts tut, wenn es aufgerufen wird, während pip bereits installiert ist. Es verfügt auch über eine Option --upgrade, die dazu führt, dass die gebündelte Kopie von pip installiert wird, wenn die vorhandene installierte Version von pip älter ist als die gebündelte Kopie.

enum

Das neue Modul enum (definiert in PEP 435) bietet eine Standardimplementierung von Aufzählungstypen, die es anderen Modulen (wie socket) ermöglicht, informativere Fehlermeldungen und eine bessere Debugging-Unterstützung bereitzustellen, indem undurchsichtige Ganzzahlkonstanten durch abwärtskompatible Aufzählungswerte ersetzt werden.

Siehe auch

PEP 435 – Hinzufügen eines Enum-Typs zur Python-Standardbibliothek

PEP geschrieben von Barry Warsaw, Eli Bendersky und Ethan Furman, implementiert von Ethan Furman.

pathlib

Das neue Modul pathlib bietet Klassen, die Dateisystempfade mit Semantiken darstellen, die für verschiedene Betriebssysteme geeignet sind. Pfadklassen sind unterteilt in reine Pfade, die rein rechnerische Operationen ohne E/A bieten, und konkrete Pfade, die von reinen Pfaden erben, aber auch E/A-Operationen anbieten.

Für Python 3.4 gilt dieses Modul als provisorische API.

Siehe auch

PEP 428 – Das pathlib-Modul – objektorientierte Dateisystempfade

PEP geschrieben und implementiert von Antoine Pitrou.

selectors

Das neue Modul selectors (erstellt als Teil der Implementierung von PEP 3156) ermöglicht ein High-Level- und effizientes E/A-Multiplexing, das auf den select-Modul-Primitiven aufbaut.

statistics

Das neue Modul statistics (definiert in PEP 450) bietet einige Kernfunktionen für Statistiken direkt in der Standardbibliothek. Dieses Modul unterstützt die Berechnung von Mittelwert, Median, Modus, Varianz und Standardabweichung einer Datenreihe.

Siehe auch

PEP 450 – Hinzufügen eines Statistikmoduls zur Standardbibliothek

PEP geschrieben und implementiert von Steven D’Aprano

tracemalloc

Das neue Modul tracemalloc (definiert in PEP 454) ist ein Debugging-Tool zum Nachverfolgen von von Python zugewiesenen Speicherblöcken. Es liefert folgende Informationen

  • Nachverfolgung, wo ein Objekt zugewiesen wurde

  • Statistiken über zugewiesene Speicherblöcke pro Dateiname und pro Zeilennummer: Gesamtgröße, Anzahl und Durchschnittsgröße zugewiesener Speicherblöcke

  • Berechnung der Unterschiede zwischen zwei Snapshots zur Erkennung von Speicherlecks

Siehe auch

PEP 454 – Hinzufügen eines neuen tracemalloc-Moduls zum Nachverfolgen von Python-Speicherzuweisungen

PEP geschrieben und implementiert von Victor Stinner

Verbesserte Module

abc

Die neue Funktion abc.get_cache_token() kann verwendet werden, um zu wissen, wann Caches, die von Änderungen im Objektgraphen betroffen sind, ungültig gemacht werden müssen. (Beigetragen von Łukasz Langa in bpo-16832.)

Die neue Klasse ABC hat ABCMeta als Metaklasse. Die Verwendung von ABC als Basisklasse hat im Wesentlichen den gleichen Effekt wie die Angabe von metaclass=abc.ABCMeta, ist aber einfacher zu tippen und leichter zu lesen. (Beigetragen von Bruno Dupuis in bpo-16049.)

aifc

Die Methode getparams() gibt nun ein Namedtuple anstelle eines einfachen Tupels zurück. (Beigetragen von Claudiu Popa in bpo-17818.)

aifc.open() unterstützt jetzt das Context-Management-Protokoll: Wenn es in einem with-Block verwendet wird, wird die Methode close() des zurückgegebenen Objekts automatisch am Ende des Blocks aufgerufen. (Beigetragen von Serhiy Storchacha in bpo-16486.)

Die Methoden writeframesraw() und writeframes() akzeptieren nun jedes bytes-ähnliches Objekt. (Beigetragen von Serhiy Storchaka in bpo-8311.)

argparse

Die Klasse FileType akzeptiert nun die Argumente encoding und errors, die an open() weitergegeben werden. (Beigetragen von Lucas Maystre in bpo-11175.)

audioop

audioop unterstützt nun 24-Bit-Samples. (Beigetragen von Serhiy Storchaka in bpo-12866.)

Die neue Funktion byteswap() konvertiert Big-Endian-Samples in Little-Endian und umgekehrt. (Beigetragen von Serhiy Storchaka in bpo-19641.)

Alle audioop-Funktionen akzeptieren nun jedes bytes-ähnliche Objekt. Zeichenketten werden nicht akzeptiert: sie funktionierten vorher nicht, jetzt lösen sie sofort einen Fehler aus. (Beigetragen von Serhiy Storchaka in bpo-16685.)

base64

Die Kodierungs- und Dekodierungsfunktionen in base64 akzeptieren nun jedes bytes-ähnliche Objekt in Fällen, in denen zuvor eine Instanz von bytes oder bytearray erforderlich war. (Beigetragen von Nick Coghlan in bpo-17839.)

Die neuen Funktionen a85encode(), a85decode(), b85encode() und b85decode() bieten die Möglichkeit, Binärdaten aus und in die Formate Ascii85 und die git/mercurial Base85 zu kodieren und zu dekodieren. Die a85-Funktionen verfügen über Optionen, die verwendet werden können, um sie mit Varianten der Ascii85-Kodierung kompatibel zu machen, einschließlich der Adobe-Variante. (Beigetragen von Martin Morrison, dem Mercurial-Projekt, Serhiy Storchaka und Antoine Pitrou in bpo-17618.)

collections

Die Methode ChainMap.new_child() akzeptiert nun ein Argument m, das die Kind-Map angibt, die der Kette hinzugefügt werden soll. Dies ermöglicht die Verwendung einer vorhandenen Abbildung und/oder eines benutzerdefinierten Abbildungstyps für das Kind. (Beigetragen von Vinay Sajip in bpo-16613.)

colorsys

Die Anzahl der Nachkommastellen in den Koeffizienten für die RGB — YIQ-Konvertierungen wurde erweitert, sodass sie den FCC NTSC-Versionen entsprechen. Die Änderung der Ergebnisse sollte weniger als 1 % betragen und möglicherweise besser mit anderswo gefundenen Ergebnissen übereinstimmen. (Beigetragen von Brian Landers und Serhiy Storchaka in bpo-14323.)

contextlib

Der neue Kontextmanager contextlib.suppress hilft, die Absicht von Code zu verdeutlichen, der Ausnahmen absichtlich von einer einzelnen Anweisung unterdrückt. (Beigetragen von Raymond Hettinger in bpo-15806 und Zero Piraeus in bpo-19266.)

Der neue Kontextmanager contextlib.redirect_stdout() erleichtert es Dienstprogrammen, mit unflexiblen APIs umzugehen, die ihre Ausgabe nach sys.stdout schreiben und keine Optionen zur Umleitung bieten. Mit dem Kontextmanager kann die Ausgabe von sys.stdout in jeden anderen Stream oder, in Verbindung mit io.StringIO, in eine Zeichenkette umgeleitet werden. Letzteres kann besonders nützlich sein, um beispielsweise die Ausgabe einer Funktion zu erfassen, die zur Implementierung einer Kommandozeilenschnittstelle geschrieben wurde. Es wird nur für Dienstprogramme empfohlen, da es den globalen Zustand von sys.stdout beeinflusst. (Beigetragen von Raymond Hettinger in bpo-15805.)

Die Dokumentation für contextlib wurde ebenfalls aktualisiert, um eine Diskussion der Unterschiede zwischen einmalig verwendbaren, wiederverwendbaren und reentranten Kontextmanagern zu enthalten.

dbm

dbm.open()-Objekte unterstützen nun das Kontext-Management-Protokoll. Wenn sie in einer with-Anweisung verwendet werden, wird die Methode close des Datenbankobjekts am Ende des Blocks automatisch aufgerufen. (Beigetragen von Claudiu Popa und Nick Coghlan in bpo-19282.)

dis

Die Funktionen show_code(), dis(), distb() und disassemble() akzeptieren nun ein schlüsselwort-only file-Argument, das steuert, wohin sie ihre Ausgabe schreiben.

Das Modul dis ist nun um eine Klasse Instruction aufgebaut, die einen objektorientierten Zugriff auf die Details jedes einzelnen Bytecode-Vorgangs bietet.

Eine neue Methode, get_instructions(), bietet einen Iterator, der den Instruction-Stream für einen gegebenen Python-Code ausgibt. Daher ist es nun möglich, ein Programm zu schreiben, das ein Bytecode-Objekt auf andere Weise inspiziert und manipuliert als die vom Modul dis selbst bereitgestellten. Zum Beispiel

>>> import dis
>>> for instr in dis.get_instructions(lambda x: x + 1):
...     print(instr.opname)
LOAD_FAST
LOAD_CONST
BINARY_ADD
RETURN_VALUE

Die verschiedenen Anzeige-Tools im Modul dis wurden neu geschrieben, um diese neuen Komponenten zu verwenden.

Zusätzlich bietet eine neue anwendungsfreundliche Klasse Bytecode eine objektorientierte API zur Inspektion von Bytecode sowohl in menschenlesbarer Form als auch zur Iteration über Anweisungen. Der Konstruktor von Bytecode nimmt die gleichen Argumente wie get_instructions() entgegen (plus ein optionales current_offset), und das resultierende Objekt kann iteriert werden, um Instruction-Objekte zu erzeugen. Es hat aber auch eine Methode dis, die äquivalent zum Aufruf von dis auf dem Konstruktorargument ist, aber als mehrzeilige Zeichenkette zurückgegeben wird

>>> bytecode = dis.Bytecode(lambda x: x + 1, current_offset=3)
>>> for instr in bytecode:
...     print('{} ({})'.format(instr.opname, instr.opcode))
LOAD_FAST (124)
LOAD_CONST (100)
BINARY_ADD (23)
RETURN_VALUE (83)
>>> bytecode.dis().splitlines()
['  1           0 LOAD_FAST                0 (x)',
 '      -->     3 LOAD_CONST               1 (1)',
 '              6 BINARY_ADD',
 '              7 RETURN_VALUE']

Bytecode hat auch eine Klassenmethode, from_traceback(), die die Möglichkeit bietet, einen Traceback zu manipulieren (d. h. print(Bytecode.from_traceback(tb).dis()) ist äquivalent zu distb(tb)).

(Beigetragen von Nick Coghlan, Ryan Kelly und Thomas Kluyver in bpo-11816 und Claudiu Popa in bpo-17916.)

Die neue Funktion stack_effect() berechnet die Auswirkung eines gegebenen Opcodes und Arguments auf den Python-Stack, eine Information, die sonst nicht verfügbar ist. (Beigetragen von Larry Hastings in bpo-19722.)

doctest

Eine neue Optionsflagge, FAIL_FAST, stoppt die Testausführung, sobald der erste Fehler erkannt wird. (Beigetragen von R. David Murray und Daniel Urban in bpo-16522.)

Die Kommandozeilenschnittstelle von doctest verwendet nun argparse und verfügt über zwei neue Optionen, -o und -f. -o erlaubt die Angabe von doctest-Optionen auf der Kommandozeile, und -f ist eine Abkürzung für -o FAIL_FAST (um die ähnliche Option der unittest CLI zu parallelisieren). (Beigetragen von R. David Murray in bpo-11390.)

doctest findet nun Doctests in Docstrings von Erweiterungsmodulen. (Beigetragen von Zachary Ware in bpo-3158.)

email

Die Methode as_string() akzeptiert nun ein Argument policy, um die Standardrichtlinie der Nachricht bei der Erzeugung einer Zeichenkettenrepräsentation zu überschreiben. Dies bedeutet, dass as_string nun in mehr Fällen verwendet werden kann, anstatt ein generator erstellen und verwenden zu müssen, um Formatierungsparameter an dessen Methode flatten zu übergeben. (Beigetragen von R. David Murray in bpo-18600.)

Die neue Methode as_bytes() wurde hinzugefügt, um eine Byte-Repräsentation der Nachricht zu erzeugen, ähnlich wie as_string eine Zeichenkettenrepräsentation erzeugt. Sie akzeptiert nicht das Argument maxheaderlen, aber die Argumente unixfrom und policy. Die Methode Message __bytes__() ruft sie auf, was bedeutet, dass bytes(mymsg) nun das intuitive Ergebnis liefert: ein Bytes-Objekt, das die vollständig formatierte Nachricht enthält. (Beigetragen von R. David Murray in bpo-18600.)

Die Nachricht Message.set_param() akzeptiert nun ein Schlüsselwortargument replace. Wenn dies angegeben ist, wird der zugehörige Header aktualisiert, ohne seine Position in der Headerliste zu ändern. Aus Gründen der Abwärtskompatibilität ist der Standardwert False. (Beigetragen von R. David Murray in bpo-18891.)

Ein Paar neuer Unterklassen von Message wurden hinzugefügt (EmailMessage und MIMEPart), zusammen mit einem neuen Untermodul, contentmanager und einem neuen Attribut für policy, content_manager. Die gesamte Dokumentation befindet sich derzeit im neuen Modul, das als Teil der neuen provisorischen API von E-Mail hinzugefügt wird. Diese Klassen bieten eine Reihe neuer Methoden, die das Extrahieren und Einfügen von Inhalten aus E-Mail-Nachrichten erheblich erleichtern. Details finden Sie in der Dokumentation zu contentmanager und den E-Mail: Beispiele. Diese API-Ergänzungen vervollständigen den Großteil der Arbeit, die im Rahmen des E-Mail6-Projekts geplant war. Die derzeit provisorische API soll in Python 3.5 endgültig werden (möglicherweise mit einigen geringfügigen Ergänzungen im Bereich der Fehlerbehandlung). (Beigetragen von R. David Murray in bpo-18891.)

filecmp

Eine neue Funktion clear_cache() bietet die Möglichkeit, den Vergleichscache von filecmp zu löschen, der Informationen von os.stat() verwendet, um festzustellen, ob die Datei seit dem letzten Vergleich geändert wurde. Dies kann beispielsweise verwendet werden, wenn die Datei möglicherweise geändert und erneut geprüft wurde, in weniger Zeit als die Auflösung des Zeitstempelfelds für Dateiänderungen eines bestimmten Dateisystems. (Beigetragen von Mark Levitt in bpo-18149.)

Das neue Modulattribut DEFAULT_IGNORES stellt die Liste der Verzeichnisse bereit, die als Standardwert für den Parameter ignore der Funktion dircmp() verwendet werden. (Beigetragen von Eli Bendersky in bpo-15442.)

functools

Der neue Deskriptor partialmethod() bringt die partielle Argumentanwendung auf Deskriptoren, so wie partial() für normale aufrufbare Objekte bietet. Der neue Deskriptor erleichtert es auch, beliebige aufrufbare Objekte (einschließlich Instanzen von partial()) wie normale Instanzmethoden zu behandeln, wenn sie in einer Klassendefinition enthalten sind. (Beigetragen von Alon Horev und Nick Coghlan in bpo-4331.)

Der neue Dekorator singledispatch() bringt Unterstützung für Single-Dispatch-Generic-Funktionen in die Python-Standardbibliothek. Während objektorientierte Programmierung sich darauf konzentriert, mehrere Operationen auf einem gemeinsamen Datensatz in einer Klasse zu gruppieren, konzentriert sich eine Generic-Funktion auf die Gruppierung mehrerer Implementierungen einer Operation, die es ermöglicht, mit verschiedenen Arten von Daten zu arbeiten.

Siehe auch

PEP 443 – Single-dispatch Generic-Funktionen

PEP geschrieben und implementiert von Łukasz Langa.

total_ordering() unterstützt nun einen Rückgabewert von NotImplemented von der zugrundeliegenden Vergleichsfunktion. (Beigetragen von Katie Miller in bpo-10042.)

Eine reine Python-Version der Funktion partial() ist jetzt in der Standardbibliothek enthalten; in CPython wird sie von der C-beschleunigten Version überschrieben, aber sie steht anderen Implementierungen zur Verfügung. (Beigesteuert von Brian Thorne in bpo-12428.)

gc

Die neue Funktion get_stats() gibt eine Liste von drei generierungsbezogenen Dictionaries zurück, die die Sammelstatistiken seit dem Start des Interpreters enthalten. (Beigesteuert von Antoine Pitrou in bpo-16351.)

glob

Eine neue Funktion escape() bietet eine Möglichkeit, Sonderzeichen in einem Dateinamen zu maskieren, damit sie nicht Teil der Globbing-Expansion werden, sondern stattdessen buchstäblich abgeglichen werden. (Beigesteuert von Serhiy Storchaka in bpo-8402.)

hashlib

Eine neue Funktion hashlib.pbkdf2_hmac() bietet die PKCS#5-Passwort-basierte Schlüsselableitungsfunktion 2. (Beigesteuert von Christian Heimes in bpo-18582.)

Das Attribut name von hashlib-Hash-Objekten ist nun eine formal unterstützte Schnittstelle. Es war in CPythons hashlib schon immer vorhanden (obwohl es für alle unterstützten Hashes keine Kleinbuchstaben zurückgab), aber es war keine öffentliche Schnittstelle, und daher haben einige andere Python-Implementierungen sie bisher nicht unterstützt. (Beigesteuert von Jason R. Coombs in bpo-18532.)

hmac

hmac akzeptiert jetzt bytearray sowie bytes für das Argument key der Funktion new(), und der Parameter msg sowohl für die Funktion new() als auch für die Methode update() akzeptiert nun jeden Typ, der vom hashlib-Modul unterstützt wird. (Beigesteuert von Jonas Borgström in bpo-18240.)

Das Argument digestmod für die Funktion hmac.new() kann nun jeder von hashlib erkannte Digest-Name sein. Zusätzlich wird das aktuelle Verhalten, bei dem der Wert von digestmod standardmäßig auf MD5 gesetzt wird, als veraltet markiert: In einer zukünftigen Python-Version wird es keinen Standardwert mehr geben. (Beigesteuert von Christian Heimes in bpo-17276.)

Mit der Hinzufügung der Attribute block_size und name (und der formellen Dokumentation des Attributs digest_size) entspricht das hmac-Modul nun vollständig der PEP 247 API. (Beigesteuert von Christian Heimes in bpo-18775.)

html

Die neue Funktion unescape() wandelt HTML5-Zeichenreferenzen in die entsprechenden Unicode-Zeichen um. (Beigesteuert von Ezio Melotti in bpo-2927.)

HTMLParser akzeptiert ein neues Schlüsselwortargument convert_charrefs, das, wenn es auf True gesetzt ist, automatisch alle Zeichenreferenzen umwandelt. Aus Gründen der Abwärtskompatibilität ist sein Standardwert False, aber er wird sich in einer zukünftigen Python-Version zu True ändern. Daher werden Sie aufgefordert, ihn explizit zu setzen und Ihren Code zu aktualisieren, um diese neue Funktion zu nutzen. (Beigesteuert von Ezio Melotti in bpo-13633.)

Das Argument strict von HTMLParser ist nun veraltet. (Beigesteuert von Ezio Melotti in bpo-15114.)

http

send_error() akzeptiert nun einen optionalen zusätzlichen Parameter explain, der verwendet werden kann, um eine erweiterte Fehlerbeschreibung bereitzustellen und die hartcodierten Standardwerte zu überschreiben, falls vorhanden. Diese erweiterte Fehlerbeschreibung wird mit dem Attribut error_message_format formatiert und als Body der Fehlerantwort gesendet. (Beigesteuert von Karl Cow in bpo-12921.)

Die http.server Kommandozeilenschnittstelle verfügt nun über eine Option -b/--bind, die dazu führt, dass der Server auf einer bestimmten Adresse lauscht. (Beigesteuert von Malte Swart in bpo-17764.)

idlelib und IDLE

Da idlelib die IDLE-Shell und den Editor implementiert und nicht für den Import durch andere Programme bestimmt ist, erhält es mit jeder Veröffentlichung Verbesserungen. Siehe Lib/idlelib/NEWS.txt für eine kumulative Liste der Änderungen seit 3.3.0 sowie der Änderungen, die in zukünftigen 3.4.x-Versionen vorgenommen wurden. Diese Datei ist auch im Dialog Hilfe ‣ Über IDLE von IDLE verfügbar.

importlib

Die InspectLoader ABC definiert eine neue Methode, source_to_code(), die Quelldaten und einen Pfad akzeptiert und ein Codeobjekt zurückgibt. Die Standardimplementierung ist äquivalent zu compile(data, path, 'exec', dont_inherit=True). (Beigesteuert von Eric Snow und Brett Cannon in bpo-15627.)

InspectLoader hat nun auch eine Standardimplementierung für die Methode get_code(). Es ist jedoch normalerweise wünschenswert, die Standardimplementierung aus Leistungsgründen zu überschreiben. (Beigesteuert von Brett Cannon in bpo-18072.)

Die Funktion reload() wurde als Teil der veralteten Kennzeichnung des imp-Moduls von imp nach importlib verschoben. (Beigesteuert von Berker Peksag in bpo-18193.)

importlib.util verfügt nun über ein Attribut MAGIC_NUMBER, das Zugriff auf die Bytecode-Versionsnummer bietet. Dies ersetzt die Funktion get_magic() im veralteten imp-Modul. (Beigesteuert von Brett Cannon in bpo-18192.)

Neue Funktionen in importlib.util, cache_from_source() und source_from_cache(), ersetzen die gleichnamigen Funktionen im veralteten imp-Modul. (Beigesteuert von Brett Cannon in bpo-18194.)

Der Bootstrap-NamespaceLoader von importlib entspricht nun der InspectLoader ABC. Das bedeutet, dass runpy und python -m nun mit Namespace-Paketen verwendet werden können. (Beigesteuert von Brett Cannon in bpo-18058.)

importlib.util verfügt über eine neue Funktion decode_source(), die Quellcode aus Bytes mit universeller Zeilenverarbeitung dekodiert. Dies ist nützlich für die Implementierung von InspectLoader.get_source()-Methoden.

importlib.machinery.ExtensionFileLoader verfügt nun über eine Methode get_filename(). Diese wurde in der ursprünglichen Implementierung versehentlich weggelassen. (Beigesteuert von Eric Snow in bpo-19152.)

inspect

Das inspect-Modul bietet nun eine grundlegende Kommandozeilenschnittstelle, um schnell Quellcode und andere Informationen für Module, Klassen und Funktionen anzuzeigen. (Beigesteuert von Claudiu Popa und Nick Coghlan in bpo-18626.)

unwrap() vereinfacht das Entwirren von Wrapper-Funktionsketten, die von functools.wraps() (und jeder anderen API, die das Attribut __wrapped__ auf einer Wrapper-Funktion setzt) erstellt wurden. (Beigesteuert von Daniel Urban, Aaron Iles und Nick Coghlan in bpo-13266.)

Als Teil der Implementierung des neuen enum-Moduls hat das inspect-Modul nun eine erheblich verbesserte Unterstützung für benutzerdefinierte __dir__-Methoden und dynamische Klassenattribute, die über Metaklassen bereitgestellt werden. (Beigesteuert von Ethan Furman in bpo-18929 und bpo-19030.)

getfullargspec() und getargspec() verwenden nun die signature() API. Dies ermöglicht ihnen die Unterstützung einer viel größeren Bandbreite von aufrufbaren Objekten, einschließlich solcher mit __signature__-Attributen, solcher mit Metadaten, die von Argument Clinic bereitgestellt werden, functools.partial()-Objekten und mehr. Beachten Sie, dass diese Funktionen im Gegensatz zu signature() immer noch __wrapped__-Attribute ignorieren und das bereits gebundene erste Argument für gebundene Methoden melden. Daher ist es immer noch notwendig, Ihren Code so zu aktualisieren, dass signature() direkt verwendet wird, wenn diese Funktionen gewünscht sind. (Beigesteuert von Yury Selivanov in bpo-17481.)

signature() unterstützt nun Duck-Typen von CPython-Funktionen, was die Unterstützung für mit Cython kompilierte Funktionen hinzufügt. (Beigesteuert von Stefan Behnel und Yury Selivanov in bpo-17159.)

ipaddress

Das Modul ipaddress wurde in Python 3.3 als vorläufige API zur Standardbibliothek hinzugefügt. Mit der Veröffentlichung von Python 3.4 wurde diese Qualifizierung aufgehoben: ipaddress gilt nun als stabile API, die unter den üblichen Anforderungen der Standardbibliothek für die Aufrechterhaltung der Abwärtskompatibilität steht.

Ein neues Attribut is_global ist True, wenn eine Adresse global routebar ist. (Beigesteuert von Peter Moody in bpo-17400.)

logging

Der TimedRotatingFileHandler hat einen neuen Parameter atTime, der verwendet werden kann, um die Tageszeit anzugeben, zu der ein Rollover stattfinden soll. (Beigesteuert von Ronald Oussoren in bpo-9556.)

SocketHandler und DatagramHandler unterstützen nun Unix-Domain-Sockets (durch Setzen von port auf None). (Beigesteuert von Vinay Sajip in Commit ce46195b56a9.)

fileConfig() akzeptiert nun eine Instanz einer Unterklasse von configparser.RawConfigParser für den Parameter fname. Dies erleichtert die Verwendung einer Konfigurationsdatei, wenn die Logging-Konfiguration nur ein Teil der gesamten Anwendungskonfiguration ist oder wenn die Anwendung die Konfiguration vor der Übergabe an fileConfig() modifiziert. (Beigesteuert von Vinay Sajip in bpo-16110.)

Logging-Konfigurationsdaten, die über einen Socket über die Funktion logging.config.listen() empfangen werden, können nun validiert werden, bevor sie verarbeitet werden. Dies geschieht durch Angabe einer Verifizierungsfunktion als Argument für das neue Schlüsselwortargument verify. (Beigesteuert von Vinay Sajip in bpo-15452.)

marshal

Die Standardversion von marshal wurde auf 3 hochgesetzt. Der Code, der die neue Version implementiert, stellt das Python2-Verhalten wieder her, nur eine Kopie von internen Zeichenketten aufzuzeichnen und die Internierung bei der Deserialisierung beizubehalten. Außerdem wird diese "Ein-Kopie"-Fähigkeit auf jeden Objekttyp erweitert (einschließlich der Behandlung von rekursiven Referenzen). Dies reduziert sowohl die Größe von .pyc-Dateien als auch den Speicherbedarf eines Moduls, wenn es aus einer .pyc- (oder .pyo-)Datei geladen wird. (Beigesteuert von Kristján Valur Jónsson in bpo-16475, mit zusätzlichen Geschwindigkeitssteigerungen von Antoine Pitrou in bpo-19219.)

mmap

mmap-Objekte sind nun schwach referenzierbar. (Beigesteuert von Valerie Lambert in bpo-4885.)

multiprocessing

Unter Unix wurden zwei neue Startmethoden, spawn und forkserver, hinzugefügt, um Prozesse mit multiprocessing zu starten. Diese machen die Mischung von Prozessen mit Threads robuster, und die spawn-Methode entspricht den Semantiken, die multiprocessing unter Windows immer verwendet hat. Die neue Funktion get_all_start_methods() meldet alle auf der Plattform verfügbaren Startmethoden, get_start_method() meldet die aktuelle Startmethode und set_start_method() setzt die Startmethode. (Beigesteuert von Richard Oudkerk in bpo-8713.)

multiprocessing hat nun auch das Konzept eines Kontexts, der bestimmt, wie Kindprozesse erstellt werden. Die neue Funktion get_context() gibt einen Kontext zurück, der eine angegebene Startmethode verwendet. Sie hat die gleiche API wie das multiprocessing-Modul selbst, sodass Sie es verwenden können, um Pools und andere Objekte zu erstellen, die innerhalb dieses Kontexts arbeiten. Dies ermöglicht es einem Framework und einer Anwendung oder verschiedenen Teilen derselben Anwendung, multiprocessing zu verwenden, ohne sich gegenseitig zu stören. (Beigesteuert von Richard Oudkerk in bpo-18999.)

Außer bei Verwendung der alten Startmethode fork erben Kindprozesse keine unnötigen Handles/Dateideskriptoren mehr von ihren Eltern (Teil von bpo-8713).

multiprocessing stützt sich nun auf runpy (das den Schalter -m implementiert), um __main__ in Kindprozessen ordnungsgemäß zu initialisieren, wenn die Startmethoden spawn oder forkserver verwendet werden. Dies löst einige Randfälle, bei denen die Kombination von multiprocessing, dem Kommandozeilenschalter -m und expliziten relativen Importen zu obskuren Fehlern in Kindprozessen führen konnte. (Beigesteuert von Nick Coghlan in bpo-19946.)

operator

Die neue Funktion length_hint() bietet eine Implementierung der Spezifikation, wie die spezielle Methode __length_hint__() verwendet werden sollte, als Teil der PEP 424 formalen Spezifikation dieser Sprachfunktion. (Beigesteuert von Armin Ronacher in bpo-16148.)

Es gibt jetzt eine reine Python-Version des Moduls operator, die als Referenz und zur Verwendung durch alternative Python-Implementierungen zur Verfügung steht. (Beigesteuert von Zachary Ware in bpo-16694.)

os

Es gibt neue Funktionen, um das vererbbare Flag eines Dateideskriptors (os.get_inheritable(), os.set_inheritable()) oder eines Windows-Handles (os.get_handle_inheritable(), os.set_handle_inheritable()) abzurufen und zu setzen.

Die neue Funktion cpu_count() meldet die Anzahl der auf der Plattform verfügbaren CPUs, auf der Python läuft (oder None, wenn die Anzahl nicht ermittelt werden kann). Die Funktion multiprocessing.cpu_count() wird nun auf Basis dieser Funktion implementiert). (Beigetragen von Trent Nelson, Yogesh Chaudhari, Victor Stinner und Charles-François Natali in bpo-17914.)

os.path.samestat() ist jetzt unter Windows verfügbar (und die Implementierung von os.path.samefile() wird jetzt zwischen Unix und Windows geteilt). (Beigetragen von Brian Curtin in bpo-11939.)

os.path.ismount() erkennt nun unter Windows Volumes, die unterhalb der Stammverzeichnisse von Laufwerken eingehängt sind. (Beigetragen von Tim Golden in bpo-9035.)

os.open() unterstützt auf Plattformen, die diese bereitstellen, zwei neue Flags: O_PATH (nicht geöffneter Dateideskriptor) und O_TMPFILE (unbenannte temporäre Datei; seit der Version 3.4.0 nur auf Linux-Systemen mit Kernelversion 3.11 oder neuer verfügbar, die UAPI-Header haben). (Beigetragen von Christian Heimes in bpo-18673 und Benjamin Peterson, bzw.)

pdb

pdb wurde erweitert, um Generatoren, yield und yield from nützlicher zu handhaben. Dies ist besonders hilfreich beim Debuggen von asyncio-basierten Programmen. (Beigetragen von Andrew Svetlov und Xavier de Gaye in bpo-16596.)

Der Befehl print wurde aus pdb entfernt, um den Zugriff auf die Python-Funktion print() von der PDB-Kommandozeile aus wiederherzustellen. Das Python2-pdb hatte keinen print-Befehl; stattdessen führte die Eingabe von print die print-Anweisung aus. In Python3 wurde print fälschlicherweise zu einem Alias für den PDB-Befehl p gemacht. p gibt jedoch die repr seines Arguments aus, nicht die str wie der Python2-print-Befehl. Schlimmer noch, der Python3-pdb print-Befehl überschattete die Python3-print()-Funktion, was sie an der PDB-Eingabeaufforderung unzugänglich machte. (Beigetragen von Connor Osborn in bpo-18764.)

pickle

pickle unterstützt jetzt (verwendet aber standardmäßig nicht) ein neues Pickle-Protokoll, Protokoll 4. Dieses neue Protokoll behebt eine Reihe von Problemen, die in früheren Protokollen vorhanden waren, wie z. B. die Serialisierung verschachtelter Klassen, sehr großer Zeichenketten und Container sowie Klassen, deren __new__()-Methode Keyword-only-Argumente entgegennimmt. Es bietet auch einige Effizienzverbesserungen.

Siehe auch

PEP 3154 – Pickle-Protokoll 4

PEP geschrieben von Antoine Pitrou und implementiert von Alexandre Vassalotti.

plistlib

plistlib hat jetzt eine API, die dem Standardmuster für Serialisierungsprotokolle der Standardbibliothek ähnelt, mit neuen Funktionen load(), dump(), loads() und dumps(). (Die ältere API ist jetzt veraltet.) Zusätzlich zum bereits unterstützten XML-Plist-Format (FMT_XML) unterstützt es jetzt auch das binäre Plist-Format (FMT_BINARY). (Beigetragen von Ronald Oussoren und anderen in bpo-14455.)

poplib

Zwei neue Methoden wurden zu poplib hinzugefügt: capa(), die die Liste der vom POP-Server angebotenen Fähigkeiten zurückgibt, und stls(), die eine Klartext-POP3-Sitzung in eine verschlüsselte POP3-Sitzung umwandelt, wenn der POP-Server dies unterstützt. (Beigetragen von Lorenzo Catucci in bpo-4473.)

pprint

Die Klasse PrettyPrinter und die Funktionen pformat() und pprint() des Moduls pprint haben eine neue Option, compact, die steuert, wie die Ausgabe formatiert wird. Derzeit bedeutet die Einstellung von compact auf True, dass Sequenzen mit so vielen Sequenzelementen wie möglich auf jeder (eingerückten) Zeile innerhalb der width gedruckt werden. (Beigetragen von Serhiy Storchaka in bpo-19132.)

Lange Zeichenketten werden jetzt mit der normalen Python-Syntax für Zeilenfortsetzung umgebrochen. (Beigetragen von Antoine Pitrou in bpo-17150.)

pty

pty.spawn() gibt nun den Statuswert von os.waitpid() für den Kindprozess zurück, anstatt None. (Beigetragen von Gregory P. Smith.)

pydoc

Das Modul pydoc basiert jetzt direkt auf der Introspektions-API inspect.signature(), was es ermöglicht, Signaturinformationen für eine breitere Palette von aufrufbaren Objekten bereitzustellen. Diese Änderung bedeutet auch, dass die Attribute __wrapped__ bei der Anzeige von Hilfeinformationen nun berücksichtigt werden. (Beigetragen von Larry Hastings in bpo-19674.)

Das Modul pydoc zeigt den Parameter self für bereits gebundene Methoden nicht mehr an. Stattdessen wird versucht, immer die exakte aktuelle Signatur des übergebenen Aufrufbaren anzuzeigen. (Beigetragen von Larry Hastings in bpo-20710.)

Zusätzlich zu den Änderungen, die direkt an pydoc vorgenommen wurden, wurde die Handhabung von benutzerdefinierten __dir__-Methoden und verschiedenen Deskriptor-Verhaltensweisen durch die zugrunde liegenden Änderungen im Modul inspect erheblich verbessert.

Da die integrierte Funktion help() auf pydoc basiert, wirken sich die oben genannten Änderungen auch auf das Verhalten von help() aus.

re

Die neue Funktion fullmatch() und die Methode Pattern.fullmatch() verankern das Muster an beiden Enden der Zeichenkette, um übereinzustimmen. Dies bietet eine Möglichkeit, das Ziel des Abgleichs explizit zu machen, was eine Klasse subtiler Fehler vermeidet, bei denen $-Zeichen bei Codeänderungen oder dem Hinzufügen von Alternativen zu einem bestehenden regulären Ausdruck verloren gehen. (Beigetragen von Matthew Barnett in bpo-16203.)

Die Darstellung von Regex-Objekten enthält jetzt das Muster und die Flags; die Darstellung von Match-Objekten enthält jetzt den Start, das Ende und den Teil der Zeichenkette, der übereinstimmte. (Beigetragen von Hugo Lopes Tavares und Serhiy Storchaka in bpo-13592 und bpo-17087.)

resource

Die neue Funktion prlimit(), verfügbar auf Linux-Plattformen mit Kernelversion 2.6.36 oder neuer und glibc 2.13 oder neuer, bietet die Möglichkeit, die Ressourcengrenzen für andere Prozesse als den aufrufenden abzufragen oder festzulegen. (Beigetragen von Christian Heimes in bpo-16595.)

Auf Linux-Kernelversion 2.6.36 oder neuer gibt es auch einige neue Linux-spezifische Konstanten: RLIMIT_MSGQUEUE, RLIMIT_NICE, RLIMIT_RTPRIO, RLIMIT_RTTIME und RLIMIT_SIGPENDING. (Beigetragen von Christian Heimes in bpo-19324.)

Auf FreeBSD Version 9 und neuer gibt es einige neue FreeBSD-spezifische Konstanten: RLIMIT_SBSIZE, RLIMIT_SWAP und RLIMIT_NPTS. (Beigetragen von Claudiu Popa in bpo-19343.)

select

epoll-Objekte unterstützen nun das Kontextverwaltungs-Protokoll. Wenn sie in einer with-Anweisung verwendet werden, wird die Methode close() am Ende des Blocks automatisch aufgerufen. (Beigetragen von Serhiy Storchaka in bpo-16488.)

devpoll-Objekte haben nun die Methoden fileno() und close() sowie ein neues Attribut closed. (Beigetragen von Victor Stinner in bpo-18794.)

shelve

Shelf-Instanzen können nun in with-Anweisungen verwendet werden und werden am Ende des with-Blocks automatisch geschlossen. (Beigetragen von Filip Gruszczyński in bpo-13896.)

shutil

copyfile() löst nun eine spezifische Error-Unterklasse, SameFileError, aus, wenn Quelle und Ziel dieselbe Datei sind. Dies ermöglicht es einer Anwendung, auf diesen spezifischen Fehler angemessen zu reagieren. (Beigetragen von Atsuo Ishimoto und Hynek Schlawack in bpo-1492704.)

smtpd

Die Klassen SMTPServer und SMTPChannel akzeptieren nun ein Schlüsselwortargument map, das, wenn es angegeben wird, an asynchat.async_chat als dessen map-Argument weitergegeben wird. Dies ermöglicht es einer Anwendung, die globale Socket-Map nicht zu beeinträchtigen. (Beigetragen von Vinay Sajip in bpo-11959.)

smtplib

SMTPException ist nun eine Unterklasse von OSError, was es ermöglicht, sowohl Socket-Fehler als auch SMTP-Protokollfehler in einer einzigen try/except-Anweisung abzufangen, wenn es nur darum geht, ob ein Fehler aufgetreten ist. (Beigetragen von Ned Jackson Lovely in bpo-2118.)

socket

Das Socket-Modul unterstützt nun das Protokoll CAN_BCM auf Plattformen, die es unterstützen. (Beigetragen von Brian Thorne in bpo-15359.)

Socket-Objekte haben neue Methoden, um ihr vererbbares Flag abzurufen oder festzulegen: get_inheritable() und set_inheritable().

Die Konstanten socket.AF_* und socket.SOCK_* sind nun Enumerationswerte, die das neue Modul enum verwenden. Dies ermöglicht die Ausgabe aussagekräftiger Namen während des Debuggings anstelle von ganzzahligen "magischen Zahlen".

Die Konstante AF_LINK ist nun unter BSD und OSX verfügbar.

inet_pton() und inet_ntop() werden nun unter Windows unterstützt. (Beigetragen von Atsuo Ishimoto in bpo-7171.)

sqlite3

Ein neuer boolescher Parameter für die Funktion connect(), uri, kann verwendet werden, um anzuzeigen, dass der Parameter database eine URI ist (siehe die SQLite URI-Dokumentation). (Beigetragen von poq in bpo-13773.)

ssl

PROTOCOL_TLSv1_1 und PROTOCOL_TLSv1_2 (TLSv1.1 und TLSv1.2 Unterstützung) wurden hinzugefügt; die Unterstützung für diese Protokolle ist nur verfügbar, wenn Python mit OpenSSL 1.0.1 oder neuer verknüpft ist. (Beigetragen von Michele Orrù und Antoine Pitrou in bpo-16692.)

Die neue Funktion create_default_context() bietet eine Standardmethode, um einen SSLContext zu erhalten, dessen Einstellungen darauf abzielen, eine vernünftige Balance zwischen Kompatibilität und Sicherheit zu bieten. Diese Einstellungen sind strenger als die Standardeinstellungen des Konstruktors SSLContext und können in Zukunft ohne vorherige Ankündigung angepasst werden, wenn sich die Best Practices für Sicherheit ändern. Die neue empfohlene Vorgehensweise für die Verwendung von Bibliotheken der Standardbibliothek, die SSL unterstützen, ist die Verwendung von create_default_context(), um ein SSLContext-Objekt zu erhalten, es bei Bedarf anzupassen und es dann als context-Argument der entsprechenden API der Standardbibliothek zu übergeben. (Beigetragen von Christian Heimes in bpo-19689.)

Die Methode load_verify_locations() von SSLContext akzeptiert ein neues optionales Argument cadata, das verwendet werden kann, um PEM- oder DER-kodierte Zertifikate direkt über Zeichenketten oder Bytes bereitzustellen. (Beigetragen von Christian Heimes in bpo-18138.)

Die neue Funktion get_default_verify_paths() gibt ein benanntes Tupel der Pfade und Umgebungsvariablen zurück, die die Methode set_default_verify_paths() verwendet, um die Standard-cafile und capath von OpenSSL festzulegen. Dies kann bei der Fehlersuche von Standard-Verifizierungsproblemen helfen. (Beigetragen von Christian Heimes in bpo-18143.)

SSLContext hat eine neue Methode, cert_store_stats(), die die Anzahl der geladenen X.509-Zertifikate, X.509 CA-Zertifikate und Zertifikatswiderrufslisten (crls) meldet, sowie eine Methode get_ca_certs(), die eine Liste der geladenen CA-Zertifikate zurückgibt. (Beigetragen von Christian Heimes in bpo-18147.)

Wenn OpenSSL 0.9.8 oder neuer verfügbar ist, verfügt SSLContext über ein neues Attribut verify_flags, das verwendet werden kann, um den Zertifikatsverifizierungsprozess zu steuern, indem es auf eine beliebige Kombination der neuen Konstanten VERIFY_DEFAULT, VERIFY_CRL_CHECK_LEAF, VERIFY_CRL_CHECK_CHAIN oder VERIFY_X509_STRICT gesetzt wird. OpenSSL führt standardmäßig keine CRL-Verifizierung durch. (Beigetragen von Christien Heimes in bpo-8813.)

Neue SSLContext-Methode load_default_certs() lädt eine Reihe von Standard-„Zertifizierungsstellen“- (CA) Zertifikaten aus Standard-Speicherorten, die je nach Plattform variieren. Sie kann verwendet werden, um sowohl TLS-Authentifizierungszertifikate für Webserver (purpose=SERVER_AUTH) für einen Client zur Überprüfung eines Servers zu laden, als auch Zertifikate für einen Server zur Überprüfung von Client-Zertifikaten (purpose=CLIENT_AUTH) zu laden. (Beigetragen von Christian Heimes in bpo-19292.)

Zwei neue, nur für Windows verfügbare Funktionen, enum_certificates() und enum_crls(), bieten die Möglichkeit, Zertifikate, Zertifikatsinformationen und CRLs aus dem Windows-Zertifikatsspeicher abzurufen. (Beigetragen von Christian Heimes in bpo-17134.)

Unterstützung für serverseitiges SNI (Server Name Indication) mit der neuen ssl.SSLContext.set_servername_callback() Methode. (Beigetragen von Daniel Black in bpo-8109.)

Das von SSLSocket.getpeercert() zurückgegebene Dictionary enthält zusätzliche X509v3-Erweiterungselemente: crlDistributionPoints, calIssuers und OCSP URIs. (Beigetragen von Christian Heimes in bpo-18379.)

stat

Das stat-Modul wird nun von einer C-Implementierung in _stat unterstützt. Eine C-Implementierung ist erforderlich, da die meisten Werte nicht standardisiert und plattformabhängig sind. (Beigetragen von Christian Heimes in bpo-11016.)

Das Modul unterstützt neue ST_MODE-Flags: S_IFDOOR, S_IFPORT und S_IFWHT. (Beigetragen von Christian Hiemes in bpo-11016.)

struct

Neue Funktion iter_unpack und eine neue Methode struct.Struct.iter_unpack() auf kompilierten Formaten ermöglichen das gestreamte Entpacken eines Puffers, der wiederholte Instanzen eines gegebenen Datenformats enthält. (Beigetragen von Antoine Pitrou in bpo-17804.)

subprocess

check_output() akzeptiert nun ein Argument input, das verwendet werden kann, um den Inhalt von stdin für den ausgeführten Befehl bereitzustellen. (Beigetragen von Zack Weinberg in bpo-16624.)

getoutput() und getstatusoutput() funktionieren jetzt unter Windows. Diese Änderung wurde tatsächlich versehentlich in 3.3.4 vorgenommen. (Beigetragen von Tim Golden in bpo-10197.)

sunau

Die Methode getparams() gibt nun ein benanntes Tupel anstelle eines einfachen Tupels zurück. (Beigetragen von Claudiu Popa in bpo-18901.)

sunau.open() unterstützt nun das Kontextmanagement-Protokoll: Wenn es in einem with-Block verwendet wird, wird die close-Methode des zurückgegebenen Objekts am Ende des Blocks automatisch aufgerufen. (Beigetragen von Serhiy Storchaka in bpo-18878.)

AU_write.setsampwidth() unterstützt nun 24-Bit-Samples und fügt damit die Unterstützung für das Schreiben von 24-Samples mit dem Modul hinzu. (Beigetragen von Serhiy Storchaka in bpo-19261.)

Die Methoden writeframesraw() und writeframes() akzeptieren nun jedes bytes-ähnliches Objekt. (Beigetragen von Serhiy Storchaka in bpo-8311.)

sys

Neue Funktion sys.getallocatedblocks() gibt die aktuelle Anzahl der vom Interpreter zugewiesenen Blöcke zurück. (In CPython mit der Standardeinstellung --with-pymalloc sind dies Zuweisungen, die über die API PyObject_Malloc() erfolgen.) Dies kann nützlich sein, um Speicherlecks zu verfolgen, insbesondere wenn dies über eine Testsuite automatisiert wird. (Beigetragen von Antoine Pitrou in bpo-13390.)

Wenn der Python-Interpreter im interaktiven Modus gestartet wird, prüft er auf ein Attribut __interactivehook__ im sys-Modul. Wenn das Attribut existiert, wird sein Wert ohne Argumente aufgerufen, kurz bevor der interaktive Modus gestartet wird. Die Prüfung erfolgt, nachdem die Datei PYTHONSTARTUP gelesen wurde, sodass sie dort gesetzt werden kann. Das site-Modul setzt es auf eine Funktion, die Tab-Vervollständigung und Verlaufspeicherung (in ~/.python-history) aktiviert, wenn die Plattform readline unterstützt. Wenn Sie dieses (neue) Verhalten nicht wünschen, können Sie es in PYTHONSTARTUP, sitecustomize oder usercustomize überschreiben, indem Sie dieses Attribut aus sys löschen (oder auf eine andere aufrufbare Funktion setzen). (Beigetragen von Éric Araujo und Antoine Pitrou in bpo-5845.)

tarfile

Das Modul tarfile unterstützt nun eine einfache Kommandozeilenschnittstelle, wenn es als Skript direkt oder über -m aufgerufen wird. Dies kann zum Erstellen und Extrahieren von Tarfile-Archiven verwendet werden. (Beigetragen von Berker Peksag in bpo-13477.)

textwrap

Die Klasse TextWrapper verfügt über zwei neue Attribute/Konstruktorargumente: max_lines, das die Anzahl der Zeilen in der Ausgabe begrenzt, und placeholder, eine Zeichenkette, die am Ende der Ausgabe erscheint, wenn sie aufgrund von max_lines gekürzt wurde. Aufbauend auf diesen Fähigkeiten erzeugt die neue Hilfsfunktion shorten() alle Leerzeichen in der Eingabe zu einzelnen Leerzeichen zusammen und erzeugt eine einzelne Zeile mit einer gegebenen width, die mit dem placeholder (standardmäßig [...]) endet. (Beigetragen von Antoine Pitrou und Serhiy Storchaka in bpo-18585 und bpo-18725.)

threading

Das Thread-Objekt, das den Hauptthread repräsentiert, kann über die neue Funktion main_thread() abgerufen werden. Unter normalen Bedingungen ist dies der Thread, von dem aus der Python-Interpreter gestartet wurde. (Beigetragen von Andrew Svetlov in bpo-18882.)

traceback

Eine neue Funktion traceback.clear_frames() nimmt ein Traceback-Objekt und löscht die lokalen Variablen in allen referenzierten Frames, wodurch der Speicherverbrauch reduziert wird. (Beigetragen von Andrew Kuchling in bpo-1565525.)

types

Ein neuer Deskriptor DynamicClassAttribute() bietet eine Möglichkeit, ein Attribut zu definieren, das sich bei der Suche über ein Instanzobjekt normal verhält, aber an die __getattr__ der *Klasse* weitergeleitet wird, wenn es über die Klasse gesucht wird. Dies ermöglicht es, Eigenschaften zu haben, die auf einer Klasse aktiv sind, und virtuelle Attribute auf der Klasse mit demselben Namen zu haben (siehe enum für ein Beispiel). (Beigetragen von Ethan Furman in bpo-19030.)

urllib

urllib.request unterstützt nun data:-URLs über die Klasse DataHandler. (Beigetragen von Mathias Panzenböck in bpo-16423.)

Die HTTP-Methode, die von einer Request-Klasse verwendet wird, kann nun durch Setzen eines Klassenattributs method in der Unterklasse angegeben werden. (Beigetragen von Jason R Coombs in bpo-18978.)

Request-Objekte sind nun wiederverwendbar: Wenn die Attribute full_url oder data geändert werden, werden alle relevanten internen Eigenschaften aktualisiert. Das bedeutet beispielsweise, dass es nun möglich ist, dasselbe Request-Objekt in mehr als einem OpenerDirector.open()-Aufruf mit unterschiedlichen data-Argumenten verwendet wird, oder dass die url eines Request geändert wird, anstatt sie von Grund auf neu zu berechnen. Es gibt auch eine neue Methode remove_header(), die verwendet werden kann, um Header aus einem Request zu entfernen. (Beigetragen von Alexey Kachayev in bpo-16464, Daniel Wozniak in bpo-17485 und Damien Brecht und Senthil Kumaran in bpo-17272.)

HTTPError-Objekte haben nun ein Attribut headers, das Zugriff auf die HTTP-Antwort-Header bietet, die mit dem Fehler verbunden sind. (Beigetragen von Berker Peksag in bpo-15701.)

unittest

Die Klasse TestCase hat eine neue Methode, subTest(), die einen Kontextmanager erzeugt, dessen with-Block zu einem „Subtest“ wird. Dieser Kontextmanager ermöglicht es einer Testmethode, dynamisch Subtests zu generieren, z. B. indem der Kontextmanager subTest in einer Schleife aufgerufen wird. Eine einzelne Testmethode kann dadurch eine unendliche Anzahl von separat identifizierten und separat gezählten Tests erzeugen, von denen alle ausgeführt werden, auch wenn einer oder mehrere davon fehlschlagen. Zum Beispiel

class NumbersTest(unittest.TestCase):
    def test_even(self):
        for i in range(6):
            with self.subTest(i=i):
                self.assertEqual(i % 2, 0)

führt zu sechs Subtests, die jeweils in der detaillierten Ausgabe von unittest mit einem Label gekennzeichnet sind, das aus dem Variablennamen i und einem bestimmten Wert für diese Variable besteht (i=0, i=1 usw.). Siehe Unterscheidung von Testiterationen mithilfe von Subtests für die vollständige Version dieses Beispiels. (Beigetragen von Antoine Pitrou in bpo-16997.)

unittest.main() akzeptiert nun ein Iterable von Testnamen für defaultTest, während es zuvor nur einen einzelnen Testnamen als String akzeptierte. (Beigetragen von Jyrki Pulliainen in bpo-15132.)

Wenn SkipTest während der Testfindung (d.h. auf Modulebene in der Testdatei) ausgelöst wird, wird dies nun als Skip und nicht als Fehler gemeldet. (Beigetragen von Zach Ware in bpo-16935.)

discover() sortiert nun die gefundenen Dateien, um eine konsistente Testreihenfolge zu gewährleisten. (Beigetragen von Martin Melin und Jeff Ramnani in bpo-16709.)

TestSuite verwirft nun Referenzen auf Tests, sobald der Test erfolgreich ausgeführt wurde. Bei Python-Interpretern, die Garbage Collection durchführen, ermöglicht dies, dass die Tests garbage collected werden, wenn nichts anderes eine Referenz auf den Test hält. Es ist möglich, dieses Verhalten zu überschreiben, indem eine Unterklasse von TestSuite erstellt wird, die eine benutzerdefinierte Methode _removeTestAtIndex definiert. (Beigetragen von Tom Wardill, Matt McClure und Andrew Svetlov in bpo-11798.)

Ein neuer Test-Assertion-Kontextmanager, assertLogs(), stellt sicher, dass ein gegebener Codeblock eine Log-Nachricht über das Modul logging ausgibt. Standardmäßig kann die Nachricht von jedem Logger stammen und eine Priorität von INFO oder höher haben, aber sowohl der Loggername als auch ein alternatives minimales Log-Level können angegeben werden. Das vom Kontextmanager zurückgegebene Objekt kann abgefragt werden, um die protokollierten LogRecords und/oder formatierten Nachrichten zu erhalten. (Beigetragen von Antoine Pitrou in bpo-18937.)

Die Testfindung funktioniert nun mit Namespace-Paketen (Beigetragen von Claudiu Popa in bpo-17457.)

unittest.mock-Objekte inspizieren nun ihre Spezifikationssignaturen bei der Abgleichung von Aufrufen, was bedeutet, dass ein Argument nun entweder nach Position oder nach Namen abgeglichen werden kann und nicht mehr nur nach Position. (Beigetragen von Antoine Pitrou in bpo-17015.)

mock_open()-Objekte haben nun die Methoden readline und readlines. (Beigetragen von Toshio Kuratomi in bpo-17467.)

venv

venv enthält nun Aktivierungsskripte für die csh- und fish-Shells. (Beigetragen von Andrew Svetlov in bpo-15417.)

EnvBuilder und die Hilfsfunktion create() nehmen ein neues Schlüsselwortargument with_pip entgegen, das standardmäßig auf False gesetzt ist und steuert, ob EnvBuilder sicherstellt, dass pip in der virtuellen Umgebung installiert ist oder nicht. (Beigetragen von Nick Coghlan in bpo-19552 als Teil der Implementierung von PEP 453.)

wave

Die Methode getparams() gibt nun ein benanntes Tupel anstelle eines einfachen Tupels zurück. (Beigetragen von Claudiu Popa in bpo-17487.)

wave.open() unterstützt nun das Kontextmanagement-Protokoll. (Beigetragen von Claudiu Popa in bpo-17616.)

wave kann nun Ausgaben in nicht-suchbare Dateien schreiben. (Beigetragen von David Jones, Guilherme Polo und Serhiy Storchaka in bpo-5202.)

Die Methoden writeframesraw() und writeframes() akzeptieren nun jedes bytes-ähnliche Objekt. (Beigetragen von Serhiy Storchaka in bpo-8311.)

weakref

Neue Klasse WeakMethod simuliert schwache Referenzen auf gebundene Methoden. (Beigetragen von Antoine Pitrou in bpo-14631.)

Neue Klasse finalize ermöglicht die Registrierung eines Rückrufs, der aufgerufen wird, wenn ein Objekt garbage collected wird, ohne die Lebensdauer der schwachen Referenz selbst sorgfältig verwalten zu müssen. (Beigetragen von Richard Oudkerk in bpo-15528.)

Der Rückruf, falls vorhanden, der mit einer ref verbunden ist, wird nun über das Attribut __callback__ verfügbar gemacht. (Beigetragen von Mark Dickinson in bpo-17643.)

xml.etree

Ein neuer Parser, XMLPullParser, ermöglicht nicht-blockierenden Anwendungen das Parsen von XML-Dokumenten. Ein Beispiel ist unter Pull-API für nicht-blockierendes Parsen zu sehen. (Beigetragen von Antoine Pitrou in bpo-17741.)

Die Funktionen tostring() und tostringlist() im Modul xml.etree.ElementTree sowie die Methode write() der Klasse ElementTree haben nun einen *nur-Schlüsselwort*-Parameter short_empty_elements, der die Kontrolle darüber ermöglicht, ob Elemente ohne Inhalt in abgekürzter (<tag />) oder erweiterter (<tag></tag>) Form geschrieben werden. (Beigetragen von Ariel Poliak und Serhiy Storchaka in bpo-14377.)

zipfile

Die writepy() Methode der PyZipFile Klasse hat eine neue filterfunc Option, die verwendet werden kann, um zu steuern, welche Verzeichnisse und Dateien dem Archiv hinzugefügt werden. Dies könnte zum Beispiel verwendet werden, um Testdateien aus dem Archiv auszuschließen. (Beigetragen von Christian Tismer in bpo-19274.)

Der Parameter allowZip64 für ZipFile und PyZipFile ist jetzt standardmäßig True. (Beigetragen von William Mallard in bpo-17201.)

CPython Implementierungsänderungen

PEP 445: Anpassung von CPython Speicherallokatoren

PEP 445 fügt neue Schnittstellen auf C-Ebene hinzu, um die Speicherzuweisung im CPython-Interpreter anzupassen.

Siehe auch

PEP 445 – Neue APIs zur Anpassung von Python Speicherallokatoren hinzufügen

PEP geschrieben und implementiert von Victor Stinner.

PEP 442: Sichere Objektfinalisierung

PEP 442 entfernt die aktuellen Einschränkungen und Eigenheiten der Objektfinalisierung in CPython. Damit können Objekte mit __del__() Methoden, sowie Generatoren mit finally Klauseln, wenn sie Teil eines Referenzzyklus sind, finalisiert werden.

Als Teil dieser Änderung werden Modul-Globals während der Interpreterabschaltung in den meisten Fällen nicht mehr zwangsweise auf None gesetzt, sondern verlassen sich auf den normalen Betrieb des zyklischen Garbage Collectors. Dies vermeidet eine ganze Klasse von Fehlern zur Zeit der Interpreterabschaltung, die meist __del__ Methoden betreffen und Python seit der Einführung des zyklischen GC plagen.

Siehe auch

PEP 442 – Sichere Objektfinalisierung

PEP geschrieben und implementiert von Antoine Pitrou.

PEP 456: Sicherer und austauschbarer Hash-Algorithmus

PEP 456 baut auf früheren Sicherheitskorrekturen am Hash-Algorithmus von Python auf, um bestimmte DOS-Angriffe zu beheben, denen öffentlich zugängliche APIs, die auf Dictionary-Lookups basieren, ausgesetzt sein können. (Siehe bpo-14621 für den Beginn der aktuellen Verbesserungsrunde.) Die PEP vereinheitlicht den CPython-Hash-Code, um es Paketierern zu erleichtern, einen anderen Hash-Algorithmus zu substituieren, und stellt auf Plattformen mit 64-Bit-Datentypen auf eine SipHash-Implementierung um. Jegliche Leistungsunterschiede im Vergleich zum älteren FNV-Algorithmus sind unerheblich.

Die PEP fügt der sys.hash_info benannten Tupel zusätzliche Felder hinzu, um den vom aktuell ausgeführten Binärprogramm verwendeten Hash-Algorithmus zu beschreiben. Ansonsten ändert die PEP keine bestehenden CPython APIs.

PEP 436: Argument Clinic

„Argument Clinic“ (PEP 436) ist jetzt Teil des CPython Build-Prozesses und kann verwendet werden, um den Prozess der Definition und Pflege genauer Signaturen für in C implementierte Builtins und Standardbibliotheks-Erweiterungsmodule zu vereinfachen.

Einige Standardbibliotheks-Erweiterungsmodule wurden in Python 3.4 auf die Verwendung von Argument Clinic umgestellt, und pydoc und inspect wurden entsprechend aktualisiert.

Es wird erwartet, dass Metadaten für Signaturen zur programmatischen Introspektion zu zusätzlichen aufrufbaren Objekten, die in C implementiert sind, im Rahmen von Python 3.4 Wartungs-Releases hinzugefügt werden.

Hinweis

Die Argument Clinic PEP ist nicht mehr vollständig auf dem neuesten Stand der Implementierung. Dies wurde vom Release Manager und dem Kernentwicklungsteam in diesem Fall als akzeptabel angesehen, da Argument Clinic in Python 3.4 nicht als öffentliche API für die Verwendung durch Dritte zur Verfügung stehen wird.

Siehe auch

PEP 436 – Die Argument Clinic DSL

PEP geschrieben und implementiert von Larry Hastings.

Andere Build- und C-API-Änderungen

  • Die neue Funktion PyType_GetSlot() wurde zur stabilen ABI hinzugefügt und ermöglicht den Abruf von Funktionszeigern aus benannten Typ-Slots bei Verwendung der begrenzten API. (Beigetragen von Martin von Löwis in bpo-17162.)

  • Die neue Pre-Initialisierungs-API Py_SetStandardStreamEncoding() ermöglicht Anwendungen, die den CPython-Interpreter einbetten, zuverlässig eine bestimmte Kodierung und einen Fehlerhandler für die Standard-Streams zu erzwingen. (Beigetragen von Bastien Montagne und Nick Coghlan in bpo-16129.)

  • Die meisten Python C-APIs, die keine String-Argumente verändern, sind nun korrekt als Akzeptanz von const char * statt char * markiert. (Beigetragen von Serhiy Storchaka in bpo-1772673.)

  • Eine neue Shell-Version von python-config kann auch dann verwendet werden, wenn kein Python-Interpreter verfügbar ist (z.B. in Cross-Compilation-Szenarien).

  • PyUnicode_FromFormat() unterstützt jetzt Breiten- und Präzisionsspezifikationen für %s, %A, %U, %V, %S und %R. (Beigetragen von Ysj Ray und Victor Stinner in bpo-7330.)

  • Die neue Funktion PyStructSequence_InitType2() ergänzt die bestehende Funktion PyStructSequence_InitType(). Der Unterschied besteht darin, dass sie bei Erfolg 0 und bei Fehler -1 zurückgibt.

  • Der CPython-Quellcode kann nun mit den Adress-Sanity-Checking-Funktionen aktueller GCC- und Clang-Versionen kompiliert werden: Die Fehlalarme im Small-Object-Allocator wurden zum Schweigen gebracht. (Beigetragen von Dhiru Kholia in bpo-18596.)

  • Der Windows-Build verwendet nun Address Space Layout Randomization und Data Execution Prevention. (Beigetragen von Christian Heimes in bpo-16632.)

  • Die neue Funktion PyObject_LengthHint() ist das C-API-Äquivalent von operator.length_hint(). (Beigetragen von Armin Ronacher in bpo-16148.)

Weitere Verbesserungen

  • Das python Kommando hat eine neue Option, -I, die dazu führt, dass es im „isolierten Modus“ läuft. Das bedeutet, dass sys.path weder das Verzeichnis des Skripts noch das site-packages Verzeichnis des Benutzers enthält, und alle PYTHON* Umgebungsvariablen ignoriert werden (es impliziert sowohl -s als auch -E). Andere Beschränkungen könnten in Zukunft angewendet werden, mit dem Ziel, die Ausführung eines Skripts von der Umgebung des Benutzers zu isolieren. Dies ist zum Beispiel geeignet, wenn Python zum Ausführen eines Systemskripts verwendet wird. Auf den meisten POSIX-Systemen kann und sollte es in der #! Zeile von Systemskripten verwendet werden. (Beigetragen von Christian Heimes in bpo-16499.)

  • Die Tab-Vervollständigung ist nun standardmäßig im interaktiven Interpreter auf Systemen aktiviert, die readline unterstützen. Die Historie ist ebenfalls standardmäßig aktiviert und wird in die Datei ~/.python-history geschrieben (und von dort gelesen). (Beigetragen von Antoine Pitrou und Éric Araujo in bpo-5845.)

  • Das Aufrufen des Python-Interpreters mit --version gibt die Version nun auf die Standardausgabe statt auf die Standardfehlerausgabe aus (bpo-18338). Ähnliche Änderungen wurden an argparse (bpo-18920) und anderen Modulen mit Skript-ähnlichen Aufruf capabilities vorgenommen (bpo-18922).

  • Der CPython Windows-Installer fügt .py zur PATHEXT Variable hinzu, wenn Erweiterungen registriert werden. Dies ermöglicht es Benutzern, ein Python-Skript an der Windows-Kommandozeile auszuführen, indem sie einfach seinen Namen ohne die .py Erweiterung eingeben. (Beigetragen von Paul Moore in bpo-18569.)

  • Ein neues make Target coverage-report baut Python, führt die Testsuite aus und generiert einen HTML-Coverage-Bericht für die C-Codebasis unter Verwendung von gcov und lcov.

  • Die -R Option für die Python Regression Test Suite prüft jetzt auch auf Speicherleckagen, indem sys.getallocatedblocks() verwendet wird. (Beigetragen von Antoine Pitrou in bpo-13390.)

  • python -m funktioniert jetzt mit Namensraum-Paketen.

  • Das stat Modul wird jetzt in C implementiert, was bedeutet, dass es die Werte für seine Konstanten aus den C-Header-Dateien bezieht, anstatt die Werte im Python-Modul fest zu codieren, wie es zuvor der Fall war.

  • Das Laden mehrerer Python-Module aus einem einzigen OS-Modul (.so, .dll) funktioniert jetzt korrekt (zuvor wurde stillschweigend das erste Python-Modul in der Datei zurückgegeben). (Beigetragen von Václav Šmilauer in bpo-16421.)

  • Ein neuer Opcode, LOAD_CLASSDEREF, wurde hinzugefügt, um einen Fehler beim Laden von freien Variablen in Klassen-Bodies zu beheben, der durch bestimmte Verwendungen von __prepare__ ausgelöst werden konnte. (Beigetragen von Benjamin Peterson in bpo-17853.)

  • Eine Reihe von Abstürzen im Zusammenhang mit MemoryError wurden von Victor Stinner mit seinem PEP 445-basierten pyfailmalloc Tool identifiziert und behoben (bpo-18408, bpo-18520).

  • Der Befehl pyvenv akzeptiert nun die Option --copies, um Kopien anstelle von Symlinks zu verwenden, auch auf Systemen, auf denen Symlinks der Standard sind. (Beigetragen von Vinay Sajip in bpo-18807.)

  • Der Befehl pyvenv akzeptiert auch die Option --without-pip, um das ansonsten automatische Bootstrapping von pip in die virtuelle Umgebung zu unterdrücken. (Beigetragen von Nick Coghlan in bpo-19552 als Teil der PEP 453 Implementierung.)

  • Der Name der Kodierung ist nun optional im Wert, der für die Umgebungsvariable PYTHONIOENCODING festgelegt wird. Dies ermöglicht es, nur den Fehlerhandler festzulegen, ohne die Standardkodierung zu ändern. (Beigetragen von Serhiy Storchaka in bpo-18818.)

  • Die open Funktionen der Module bz2, lzma und gzip unterstützen nun den Modus x (exklusives Erstellen). (Beigetragen von Tim Heaney und Vajrasky Kok in bpo-19201, bpo-19222, und bpo-19223.)

Signifikante Optimierungen

  • Der UTF-32-Decoder ist jetzt 3x bis 4x schneller. (Beigetragen von Serhiy Storchaka in bpo-14625.)

  • Die Kosten von Hash-Kollisionen für Sets wurden reduziert. Jeder Hash-Tabellen-Probe prüft nun eine Reihe von aufeinanderfolgenden, benachbarten Schlüssel/Hash-Paaren, bevor sie mit zufälligen Suchen durch die Hash-Tabelle fortfährt. Dies nutzt die Cache-Lokalität, um die Kollisionsauflösung günstiger zu machen. Das Kollisionsauflösungsverfahren kann als Hybrid aus linearer Sondierung und offenem Adressieren beschrieben werden. Die Anzahl der zusätzlichen linearen Sonden beträgt standardmäßig neun. Dies kann zur Kompilierzeit durch Definition von LINEAR_PROBES auf einen beliebigen Wert geändert werden. Setzen Sie LINEAR_PROBES=0, um die lineare Sondierung vollständig zu deaktivieren. (Beigetragen von Raymond Hettinger in bpo-18771.)

  • Der Interpreter startet etwa 30 % schneller. Eine Reihe von Maßnahmen führen zu dieser Beschleunigung. Der Interpreter lädt weniger Module beim Start, z.B. werden die Module re, collections und locale und ihre Abhängigkeiten nicht mehr standardmäßig importiert. Das Marshal-Modul wurde verbessert, um kompilierte Python-Code schneller zu laden. (Beigetragen von Antoine Pitrou, Christian Heimes und Victor Stinner in bpo-19219, bpo-19218, bpo-19209, bpo-19205 und bpo-9548.)

  • bz2.BZ2File ist jetzt in den meisten Fällen genauso schnell oder schneller als die Python2-Version. lzma.LZMAFile wurde ebenfalls optimiert. (Beigetragen von Serhiy Storchaka und Nadeem Vawda in bpo-16034.)

  • random.getrandbits() ist für kleine Ganzzahlen (der häufigste Anwendungsfall) 20 % bis 40 % schneller. (Beigetragen von Serhiy Storchaka in bpo-16674.)

  • Durch die Nutzung des neuen Speicherformats für Strings ist das Pickling von Strings jetzt deutlich schneller. (Beigetragen von Victor Stinner und Antoine Pitrou in bpo-15596.)

  • Ein Performance-Problem in io.FileIO.readall() wurde behoben. Dies betrifft insbesondere Windows und beschleunigt den Fall, dass große Datenmengen über subprocess geleitet werden, erheblich. (Beigetragen von Richard Oudkerk in bpo-15758.)

  • html.escape() ist jetzt 10x schneller. (Beigetragen von Matt Bryant in bpo-18020.)

  • Unter Windows wird nun die native Funktion VirtualAlloc anstelle von CRT malloc in obmalloc verwendet. Künstliche Benchmarks zeigen eine Speicherersparnis von etwa 3 %.

  • os.urandom() verwendet nun einen lazy geöffneten persistenten Dateideskriptor, um die Verwendung vieler Dateideskriptoren bei parallelem Aufruf aus mehreren Threads zu vermeiden. (Beigetragen von Antoine Pitrou in bpo-18756.)

Veraltet

Dieser Abschnitt behandelt verschiedene APIs und andere Features, die in Python 3.4 als veraltet markiert wurden und in Python 3.5 oder später entfernt werden. In den meisten (aber nicht allen) Fällen wird die Verwendung der veralteten APIs eine DeprecationWarning erzeugen, wenn der Interpreter mit aktivierten Deprecation-Warnungen ausgeführt wird (z.B. durch Verwendung von -Wd).

Veralterungen in der Python API

  • Wie in PEP 451: Ein ModuleSpec Typ für das Import-System erwähnt, sind eine Reihe von importlib Methoden und Funktionen veraltet: importlib.find_loader() wird durch importlib.util.find_spec() ersetzt; importlib.machinery.PathFinder.find_module() wird durch importlib.machinery.PathFinder.find_spec() ersetzt; importlib.abc.MetaPathFinder.find_module() wird durch importlib.abc.MetaPathFinder.find_spec() ersetzt; importlib.abc.PathEntryFinder.find_loader() und find_module() werden durch importlib.abc.PathEntryFinder.find_spec() ersetzt; alle xxxLoader ABC load_module Methoden (importlib.abc.Loader.load_module(), importlib.abc.InspectLoader.load_module(), importlib.abc.FileLoader.load_module(), importlib.abc.SourceLoader.load_module()) sollten nicht mehr implementiert werden, stattdessen sollten Loader eine exec_module Methode implementieren (importlib.abc.Loader.exec_module(), importlib.abc.InspectLoader.exec_module() importlib.abc.SourceLoader.exec_module()) und das Importsystem den Rest erledigen lassen; und importlib.abc.Loader.module_repr(), importlib.util.module_for_loader(), importlib.util.set_loader(), und importlib.util.set_package() werden nicht mehr benötigt, da ihre Funktionen nun automatisch vom Importsystem übernommen werden.

  • Das imp Modul ist zur Veralterung vorgesehen. Um die Kompatibilität mit Python 2/3 Codebasen zu gewährleisten, ist die Entfernung des Moduls derzeit nicht geplant.

  • Das formatter Modul ist zur Veralterung vorgesehen und soll in Python 3.6 entfernt werden.

  • MD5 als Standard-digestmod für die Funktion hmac.new() ist veraltet. Python 3.6 wird einen expliziten Digestnamen oder Konstruktor als digestmod Argument erfordern.

  • Die interne Netrc Klasse im ftplib Modul wurde seit langem in ihrer Docstring als veraltet dokumentiert. Sie gibt jetzt eine DeprecationWarning aus und wird in Python 3.5 vollständig entfernt.

  • Das undokumentierte endtime Argument für subprocess.Popen.wait() hätte nicht verfügbar sein sollen und wird hoffentlich nicht verwendet; es ist veraltet und wird höchstwahrscheinlich in Python 3.5 entfernt.

  • Das strict Argument von HTMLParser ist veraltet.

  • Die Funktionen plistlib readPlist(), writePlist(), readPlistFromBytes() und writePlistToBytes() sind zugunsten der entsprechenden neuen Funktionen load(), dump(), loads() und dumps() veraltet. Data() ist zugunsten der direkten Verwendung des bytes Konstruktors veraltet.

  • Der sysconfig Schlüssel SO ist veraltet, er wurde durch EXT_SUFFIX ersetzt.

  • Der Modus U, der von verschiedenen open Funktionen akzeptiert wird, ist veraltet. In Python 3 tut er nichts Nützliches und sollte durch geeignete Verwendungen von io.TextIOWrapper (falls erforderlich) und dessen newline Argument ersetzt werden.

  • Das parser Argument von xml.etree.ElementTree.iterparse() ist veraltet, ebenso wie das html Argument von XMLParser(). Um sich auf die Entfernung letzterer vorzubereiten, sollten alle Argumente für XMLParser als Schlüsselwortargumente übergeben werden.

Veraltete Features

  • Das Ausführen von IDLE — Python Editor und Shell mit der Flagge -n (kein Subprozess) ist veraltet. Das Feature wird jedoch nicht entfernt, bis bpo-18823 gelöst ist.

  • Das Hinzufügen eines „site-python“-Verzeichnisses zu sys.path durch das site-Modul ist veraltet (bpo-19375).

Entfernt

Betriebssysteme, die nicht mehr unterstützt werden

Die Unterstützung für die folgenden Betriebssysteme wurde aus den Quell- und Build-Tools entfernt

  • OS/2 (bpo-16135).

  • Windows 2000 (Änderungssatz e52df05b496a).

  • Windows-Systeme, auf denen COMSPEC auf command.com zeigt (bpo-14470).

  • VMS (bpo-16136).

Entfernung von APIs und Features

Die folgenden veralteten und zuvor als veraltet markierten APIs und Features wurden entfernt

  • Die unverwalteten Verzeichnisse Misc/TextMate und Misc/vim wurden entfernt (siehe devguide für Vorschläge, was stattdessen verwendet werden soll).

  • Die SO Makefile-Makro wurde entfernt (es wurde durch die Makros SHLIB_SUFFIX und EXT_SUFFIX ersetzt) (bpo-16754).

  • Das Feld PyThreadState.tick_counter wurde entfernt; sein Wert war seit Python 3.2, als der „neue GIL“ eingeführt wurde, bedeutungslos (bpo-19199).

  • PyLoader und PyPycLoader wurden aus importlib entfernt. (Beigetragen von Taras Lyapun in bpo-15641.)

  • Das strikte Argument für HTTPConnection und HTTPSConnection wurde entfernt. HTTP 0.9-„Simple Responses“ werden nicht mehr unterstützt.

  • Die veralteten Getter- und Setter-Methoden add_data, has_data, get_data, get_type, get_host, get_selector, set_proxy, get_origin_req_host und is_unverifiable von urllib.request.Request wurden entfernt (verwenden Sie stattdessen direkten Attributzugriff).

  • Die Unterstützung für das Laden des veralteten TYPE_INT64 wurde aus marshal entfernt. (Beigetragen von Dan Riti in bpo-15480.)

  • inspect.Signature: Positionsgebundene Parameter erfordern nun einen gültigen Namen.

  • object.__format__() akzeptiert keine nicht-leeren Formatzeichenketten mehr; stattdessen wird ein TypeError ausgelöst. Die Verwendung einer nicht-leeren Zeichenkette ist seit Python 3.2 veraltet. Diese Änderung wurde vorgenommen, um eine Situation zu verhindern, in der zuvor funktionierender (aber fehlerhafter) Code fehlschlägt, wenn ein Objekt eine `__format__`-Methode erhält. Ihr Code kann nun einen TypeError auslösen, wenn Sie einen 's'-Formatcode mit Objekten verwenden, die keine `__format__`-Methode haben, die ihn verarbeitet. Siehe bpo-7994 für Hintergründe.

  • difflib.SequenceMatcher.isbjunk() und difflib.SequenceMatcher.isbpopular() waren in 3.2 veraltet und wurden nun entfernt: Verwenden Sie x in sm.bjunk und x in sm.bpopular, wobei sm ein SequenceMatcher-Objekt ist (bpo-13248).

Codebereinigung

  • Die ungenutzte und undokumentierte interne Klasse Scanner wurde aus dem Modul pydoc entfernt.

  • Das private und praktisch ungenutzte Modul _gestalt wurde entfernt, zusammen mit den privaten Funktionen _mac_ver_lookup, _mac_ver_gstalt und _bcd2str des Moduls platform, die nur auf stark fehlerhaften OSX-Systemen aufgerufen worden wären (siehe bpo-18393).

  • Die fest kodierten Kopien bestimmter stat-Konstanten, die im Namensraum des Moduls tarfile enthalten waren, wurden entfernt.

Portierung auf Python 3.4

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

Änderungen im Verhalten des Befehls „python“

  • In einer POSIX-Shell ist das Setzen der Umgebungsvariable PATH auf einen leeren Wert gleichbedeutend damit, sie gar nicht zu setzen. Das Setzen von PYTHONPATH auf einen leeren Wert war jedoch nicht gleichbedeutend damit, sie gar nicht zu setzen: Das Setzen von PYTHONPATH auf einen leeren Wert war gleichbedeutend mit dem Setzen auf ., was zu Verwirrung führt, wenn man nach Analogie zum Verhalten von PATH argumentiert. Das Verhalten entspricht nun der POSIX-Konvention für PATH.

  • Die Ausgabe „[X refs, Y blocks]“ eines Debug-Builds (--with-pydebug) des CPython-Interpreters ist standardmäßig deaktiviert. Sie kann mit der Option -X showrefcount wieder aktiviert werden. (Beigetragen von Ezio Melotti in bpo-17323.)

  • Der Befehl `python` und die meisten Skripte der Standardbibliothek (sowie argparse) geben nun die `--version`-Informationen nach stdout statt nach stderr aus (siehe Andere Verbesserungen oben für die Liste der Probleme).

Änderungen in der Python-API

  • Die in importlib.abc definierten ABCs lösen nun entweder die entsprechende Ausnahme aus oder geben einen Standardwert zurück, anstatt blind NotImplementedError auszulösen. Dies wirkt sich nur auf Code aus, der super() aufruft und bis zu den ABCs durchfällt. Aus Kompatibilitätsgründen fangen Sie bei Bedarf sowohl NotImplementedError als auch die entsprechende Ausnahme ab.

  • Der Modultyp initialisiert nun die Attribute __package__ und __loader__ standardmäßig auf None. Um zu bestimmen, ob diese Attribute abwärtskompatibel gesetzt wurden, verwenden Sie z. B. getattr(module, '__loader__', None) is not None. (bpo-17115.)

  • importlib.util.module_for_loader() setzt nun bedingungslos __loader__ und __package__, um das erneute Laden korrekt zu unterstützen. Wenn dies nicht erwünscht ist, müssen Sie diese Attribute manuell setzen. Sie können importlib.util.module_to_load() für die Modulverwaltung verwenden.

  • Import setzt nun relevante Attribute (z. B. __name__, __loader__, __package__, __file__, __cached__) beim erneuten Laden bedingungslos zurück. Beachten Sie, dass dies ein Verhalten vor Version 3.3 wiederherstellt, da ein Modul beim erneuten Laden neu gefunden wird (bpo-19413).

  • Eingefrorene Pakete setzen __path__ nicht mehr auf eine Liste, die den Paketnamen enthält, sondern auf eine leere Liste. Das frühere Verhalten konnte dazu führen, dass das Importsystem bei Unterpaketimporten falsch reagierte, wenn es auch ein Verzeichnis mit demselben Namen wie das eingefrorene Paket gab. Der richtige Weg, um festzustellen, ob ein Modul ein Paket ist oder nicht, ist die Verwendung von hasattr(module, '__path__') (bpo-18065).

  • Eingefrorene Module definieren kein __file__-Attribut mehr. Es ist semantisch falsch für eingefrorene Module, das Attribut zu setzen, da sie nicht von einem expliziten Ort geladen werden. Wenn Sie wissen müssen, dass ein Modul aus eingefrorenem Code stammt, können Sie prüfen, ob __spec__.location des Moduls auf 'frozen' gesetzt ist, prüfen, ob der Loader eine Unterklasse von importlib.machinery.FrozenImporter ist, oder wenn Python 2-Kompatibilität erforderlich ist, können Sie imp.is_frozen() verwenden.

  • py_compile.compile() löst nun FileExistsError aus, wenn der Dateipfad, zu dem geschrieben werden soll, ein Symlink oder eine nicht-reguläre Datei ist. Dies dient als Warnung, dass Import diese Dateien unabhängig von ihrem ursprünglichen Dateityp mit einer regulären Datei überschreiben wird.

  • importlib.abc.SourceLoader.get_source() löst nun keine ImportError mehr aus, wenn der zu ladende Quellcode einen SyntaxError oder UnicodeDecodeError auslöst. Da ImportError nur ausgelöst werden sollte, wenn Quellcode nicht gefunden werden kann, wurde dies als übertriebene Bedeutung angesehen, wenn der Quellcode gefunden, aber falsch strukturiert ist. Wenn Sie zuvor ImportError abgefangen haben und Syntax- oder Dekodierungsprobleme weiterhin ignorieren möchten, fangen Sie nun alle drei Ausnahmen ab.

  • functools.update_wrapper() und functools.wraps() setzen nun korrekt das Attribut __wrapped__ auf die zu verpackende Funktion, auch wenn diese Funktion ebenfalls ihr __wrapped__-Attribut gesetzt hatte. Das bedeutet, dass __wrapped__-Attribute nun einen Stapel dekorierter Funktionen korrekt verknüpfen, anstatt dass jedes __wrapped__-Attribut in der Kette auf die innerste Funktion verweist. Introspektionsbibliotheken, die vom früheren Verhalten als beabsichtigt ausgegangen sind, können inspect.unwrap() verwenden, um auf die erste Funktion in der Kette zuzugreifen, die kein __wrapped__-Attribut hat.

  • inspect.getfullargspec() wurde aufbauend auf inspect.signature() neu implementiert und verarbeitet daher eine viel größere Vielfalt von aufrufbaren Objekten als zuvor. Es wird erwartet, dass im Laufe der Python 3.4-Serie weitere integrierte und Erweiterungsmodul-Aufrufe Signaturmetadaten erhalten werden. Code, der davon ausgeht, dass inspect.getfullargspec() bei nicht-pythonischen Aufrufern fehlschlägt, muss möglicherweise entsprechend angepasst werden.

  • importlib.machinery.PathFinder übergibt nun das aktuelle Arbeitsverzeichnis an Objekte in sys.path_hooks für den leeren String. Dies führt dazu, dass sys.path_importer_cache niemals '' enthält. Daher findet die Iteration durch sys.path_importer_cache basierend auf sys.path nicht alle Schlüssel. Der __file__ eines Moduls wird nun, wenn es im aktuellen Arbeitsverzeichnis importiert wird, ebenfalls einen absoluten Pfad haben, einschließlich der Verwendung von -m mit dem Interpreter (außer für __main__.__file__, wenn ein Skript direkt mit einem relativen Pfad ausgeführt wurde) (Beigetragen von Brett Cannon in bpo-18416). wird auf der Kommandozeile angegeben) (bpo-18416).

  • Die Entfernung des strikten Arguments für HTTPConnection und HTTPSConnection ändert die Bedeutung der verbleibenden Argumente, wenn Sie diese positionell und nicht benannt übergeben. Wenn Sie auf Deprecation-Warnungen geachtet haben, sollten Sie zusätzliche Argumente bereits benannt übergeben.

  • Zeichenketten zwischen from __future__ import ...-Anweisungen lösen nun immer einen SyntaxError aus. Zuvor wurde eine eingeschobene Zeichenkette manchmal ignoriert, wenn kein führender Docstring vorhanden war. Dies bringt CPython in Einklang mit der Sprachspezifikation; Jython und PyPy waren bereits konform. (bpo-17434).

  • ssl.SSLSocket.getpeercert() und ssl.SSLSocket.do_handshake() lösen nun eine OSError mit ENOTCONN aus, wenn der SSLSocket nicht verbunden ist, anstatt der früheren Verhaltensweise, eine AttributeError auszulösen. Zusätzlich wird getpeercert() einen ValueError auslösen, wenn der Handshake noch nicht durchgeführt wurde.

  • base64.b32decode() löst nun einen binascii.Error aus, wenn die Eingabezeichenkette Nicht-B32-Alphabet-Zeichen enthält, anstatt eines TypeError. Dieser spezielle TypeError wurde übersehen, als die anderen TypeErrors konvertiert wurden. (Beigetragen von Serhiy Storchaka in bpo-18011.) Hinweis: Diese Änderung wurde auch versehentlich in Python 3.3.3 angewendet.

  • Das Attribut file wird nun automatisch geschlossen, wenn die erstellende cgi.FieldStorage-Instanz garbage collected wird. Wenn Sie das Dateiobjekt separat von der cgi.FieldStorage-Instanz extrahiert und die Instanz nicht am Leben erhalten haben, sollten Sie entweder die gesamte cgi.FieldStorage-Instanz speichern oder den Inhalt der Datei lesen, bevor die cgi.FieldStorage-Instanz garbage collected wird.

  • Das Aufrufen von read oder write auf einem geschlossenen SSL-Socket löst nun einen informativen ValueError aus, anstatt des früheren, mysteriöseren AttributeError (bpo-9177).

  • slice.indices() erzeugt für sehr große Werte keine OverflowError mehr. Als Konsequenz dieser Korrektur löst slice.indices() nun einen ValueError aus, wenn ein negativer Längenwert übergeben wird; zuvor wurden unsinnige Werte zurückgegeben (bpo-14794).

  • Der complex-Konstruktor akzeptierte im Gegensatz zu den Funktionen von cmath fälschlicherweise float-Werte, wenn die spezielle `__complex__`-Methode eines Objekts einen solchen zurückgab. Dies löst nun einen TypeError aus. (bpo-16290.)

  • Der int-Konstruktor in 3.2 und 3.3 akzeptiert fälschlicherweise float-Werte für den Parameter base. Es ist unwahrscheinlich, dass jemand dies getan hat, aber falls doch, wird nun ein TypeError ausgelöst (bpo-16772).

  • Standardwerte für schlüsselwort-only Argumente werden nun nach den Standardwerten für reguläre Schlüsselwortargumente ausgewertet, anstatt davor. Hoffentlich hat niemand Code geschrieben, der auf dem früheren fehlerhaften Verhalten basiert (bpo-16967).

  • Verwaiste Thread-Zustände werden nun nach fork() gelöscht. Dies kann dazu führen, dass einige Systemressourcen freigegeben werden, die zuvor fälschlicherweise ewig vorgehalten wurden (z. B. Datenbankverbindungen im Thread-lokalen Speicher). (bpo-17094.)

  • Parameternamen in __annotations__-Dictionaries werden nun ordnungsgemäß mangled, ähnlich wie bei __kwdefaults__. (Beigetragen von Yury Selivanov in bpo-20625.)

  • hashlib.hash.name gibt nun immer den Bezeichner in Kleinbuchstaben zurück. Zuvor hatten einige integrierte Hashes Großbuchstaben, aber da dies nun eine formale öffentliche Schnittstelle ist, wurde die Benennung konsistent gestaltet (bpo-18532).

  • Da unittest.TestSuite nun Referenzen auf Tests nach deren Ausführung fallen lässt, können Test-Frameworks, die eine TestSuite wiederverwenden, um eine Reihe von Tests erneut auszuführen, fehlschlagen. Test-Suiten sollten nicht auf diese Weise wiederverwendet werden, da dies bedeutet, dass der Zustand zwischen Testläufen beibehalten wird, was die Testisolation untergräbt, die unittest bietet. Wenn die fehlende Isolation jedoch akzeptabel ist, kann das alte Verhalten wiederhergestellt werden, indem eine Unterklasse von TestSuite erstellt wird, die eine Methode _removeTestAtIndex definiert, die nichts tut (siehe TestSuite.__iter__()) (bpo-11798).

  • unittest verwendet nun argparse für die Kommandozeilenanalyse. Es gibt bestimmte ungültige Kommandoformen, die früher funktioniert haben und nun nicht mehr erlaubt sind; theoretisch sollte dies keine Rückwärtskompatibilitätsprobleme verursachen, da die nicht erlaubten Kommandoformen keinen Sinn ergaben und unwahrscheinlich im Gebrauch waren.

  • Die Funktionen re.split(), re.findall() und re.sub() sowie die Methoden group() und groups() von `match`-Objekten geben nun immer ein bytes-Objekt zurück, wenn die zu vergleichende Zeichenkette ein bytes-ähnliches Objekt ist. Zuvor entsprach der Rückgabetyp dem Eingabetyp, so dass Ihr Code, wenn er davon abhing, dass der Rückgabewert z. B. ein bytearray ist, geändert werden muss.

  • audioop-Funktionen lösen nun sofort einen Fehler aus, wenn Zeichenketten als Eingabe übergeben werden, anstatt zufällig später fehlzuschlagen (bpo-16685).

  • Das neue Argument convert_charrefs für HTMLParser ist aus Gründen der Abwärtskompatibilität standardmäßig False, wird aber schließlich auf True geändert werden. Es wird empfohlen, dieses Schlüsselwort mit dem entsprechenden Wert zu allen HTMLParser-Aufrufen in Ihrem Code hinzuzufügen (bpo-13633).

  • Da das Argument digestmod für die Funktion hmac.new() in Zukunft keinen Standardwert mehr haben wird, sollten alle Aufrufe von hmac.new() so geändert werden, dass explizit ein digestmod angegeben wird (bpo-17276).

  • Das Aufrufen von sysconfig.get_config_var() mit dem Schlüssel SO oder das Nachschlagen von SO in den Ergebnissen eines Aufrufs von sysconfig.get_config_vars() ist veraltet. Dieser Schlüssel sollte durch EXT_SUFFIX oder SHLIB_SUFFIX ersetzt werden, je nach Kontext (bpo-19555).

  • Alle Aufrufe von `open`-Funktionen, die U angeben, sollten geändert werden. U ist in Python3 unwirksam und wird schließlich einen Fehler auslösen, wenn es verwendet wird. Je nach Funktion kann das Äquivalent des alten Python2-Verhaltens durch ein newline-Argument erreicht werden, oder falls erforderlich, durch Umhüllen des Streams mit TextIOWrapper, um dessen newline-Argument zu verwenden (bpo-15204).

  • Wenn Sie pyvenv in einem Skript verwenden und wünschen, dass pip nicht installiert wird, müssen Sie --without-pip zu Ihrem Befehlsaufruf hinzufügen.

  • Das Standardverhalten von json.dump() und json.dumps() bei Angabe einer Einrückung hat sich geändert: Es werden keine nachgestellten Leerzeichen mehr nach den Kommas, die Elemente trennen, am Ende von Zeilen erzeugt. Dies ist nur relevant, wenn Sie Tests haben, die weißraumempfindliche Vergleiche dieser Ausgabe durchführen (bpo-16333).

  • doctest sucht nun nach Doctests in den __doc__-Strings von Erweiterungsmodulen. Wenn Ihre Doctest-Entdeckungserweiterungsmodule einschließt, die Elemente enthalten, die wie Doctests aussehen, sehen Sie möglicherweise Testfehler, die Sie zuvor nicht gesehen haben, wenn Sie Ihre Tests ausführen (bpo-3158).

  • Das Modul collections.abc wurde im Rahmen der Verbesserungen beim Python-Start leicht umstrukturiert. Als Folge davon ist es nicht mehr der Fall, dass der Import von collections automatisch collections.abc importiert. Wenn Ihr Programm auf dem (undokumentierten) impliziten Import basierte, müssen Sie nun einen expliziten import collections.abc hinzufügen (bpo-20784).

Änderungen in der C-API

  • PyEval_EvalFrameEx(), PyObject_Repr() und PyObject_Str() sowie einige andere interne C-APIs enthalten nun eine Debugging-Assertion, die sicherstellt, dass sie nicht in Situationen verwendet werden, in denen sie eine aktuell aktive Ausnahme stillschweigend verwerfen könnten. In Fällen, in denen das Verwerfen der aktiven Ausnahme erwartet und erwünscht ist (z. B. weil sie bereits lokal mit PyErr_Fetch() gespeichert wurde oder absichtlich durch eine andere Ausnahme ersetzt wird), ist ein expliziter Aufruf von PyErr_Clear() erforderlich, um das Auslösen der Assertion zu vermeiden, wenn diese Operationen (direkt oder indirekt) aufgerufen werden und gegen eine Version von Python ausgeführt werden, die mit aktivierten Assertions kompiliert wurde.

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

  • Das Ergebnis des PyOS_ReadlineFunctionPointer-Callbacks muss nun ein von PyMem_RawMalloc() oder PyMem_RawRealloc() zugewiesener String sein oder NULL, wenn ein Fehler aufgetreten ist, anstatt eines von PyMem_Malloc() oder PyMem_Realloc() zugewiesener String (bpo-16742).

  • PyThread_set_key_value() setzt nun immer den Wert. In Python 3.3 tat die Funktion nichts, wenn der Schlüssel bereits existierte (wenn der aktuelle Wert ein Zeiger ungleich NULL war).

  • Das Feld f_tstate (Thread-Status) der Struktur PyFrameObject wurde entfernt, um einen Fehler zu beheben: siehe bpo-14432 für die Begründung.

Geändert in 3.4.3

PEP 476: Standardmäßige Aktivierung der Zertifikatsverifizierung für HTTP-Clients der Standardbibliothek

http.client und Module, die es verwenden, wie z. B. urllib.request und xmlrpc.client, überprüfen nun standardmäßig, ob der Server ein von einer CA im vertrauenswürdigen Speicher der Plattform signiertes Zertifikat vorlegt und dessen Hostname mit dem angeforderten Hostnamen übereinstimmt. Dies verbessert die Sicherheit für viele Anwendungen erheblich.

Für Anwendungen, die das alte Verhalten benötigen, kann ein alternativer Kontext übergeben werden

import urllib.request
import ssl

# This disables all verification
context = ssl._create_unverified_context()

# This allows using a specific certificate for the host, which doesn't need
# to be in the trust store
context = ssl.create_default_context(cafile="/path/to/file.crt")

urllib.request.urlopen("https://invalid-cert", context=context)