Was ist neu in Python 3.0¶
- Autor:
Guido van Rossum
Dieser Artikel erklärt die neuen Funktionen in Python 3.0 im Vergleich zu 2.6. Python 3.0, auch bekannt als „Python 3000“ oder „Py3K“, ist die erste absichtlich rückwärts inkompatible Python-Version überhaupt. Python 3.0 wurde am 3. Dezember 2008 veröffentlicht. Es gibt mehr Änderungen als in einer typischen Version, und mehr, die für alle Python-Benutzer wichtig sind. Nichtsdestotrotz werden Sie feststellen, dass sich Python nach Verdauung der Änderungen eigentlich nicht so stark verändert hat – wir beheben größtenteils bekannte Ärgernisse und Schönheitsfehler und entfernen viel alten Ballast.
Dieser Artikel versucht nicht, eine vollständige Spezifikation aller neuen Funktionen zu liefern, sondern gibt stattdessen einen praktischen Überblick. Für vollständige Details sollten Sie die Dokumentation für Python 3.0 und/oder die vielen im Text referenzierten PEPs konsultieren. Wenn Sie die vollständige Implementierung und Design-Begründung für eine bestimmte Funktion verstehen möchten, enthalten PEPs normalerweise mehr Details als die reguläre Dokumentation; beachten Sie jedoch, dass PEPs normalerweise nicht auf dem neuesten Stand gehalten werden, sobald eine Funktion vollständig implementiert ist.
Aufgrund von Zeitmangel ist dieses Dokument nicht so vollständig, wie es sein sollte. Wie immer bei einer neuen Version enthält die Datei Misc/NEWS in der Quellcode-Distribution eine Fülle von detaillierten Informationen zu jeder noch so kleinen Änderung.
Häufige Stolpersteine¶
Dieser Abschnitt listet die wenigen Änderungen auf, die Sie am wahrscheinlichsten stolpern lassen, wenn Sie an Python 2.5 gewöhnt sind.
Print ist eine Funktion¶
Die print-Anweisung wurde durch eine print()-Funktion ersetzt, mit Schlüsselwortargumenten, um die meisten speziellen Syntaxen der alten print-Anweisung zu ersetzen (PEP 3105). Beispiele
Old: print "The answer is", 2*2
New: print("The answer is", 2*2)
Old: print x, # Trailing comma suppresses newline
New: print(x, end=" ") # Appends a space instead of a newline
Old: print # Prints a newline
New: print() # You must call the function!
Old: print >>sys.stderr, "fatal error"
New: print("fatal error", file=sys.stderr)
Old: print (x, y) # prints repr((x, y))
New: print((x, y)) # Not the same as print(x, y)!
Sie können auch den Trenner zwischen Elementen anpassen, z. B.
print("There are <", 2**32, "> possibilities!", sep="")
was erzeugt
There are <4294967296> possibilities!
Hinweis
Die
print()-Funktion unterstützt nicht das „softspace“-Feature der altenprint-Anweisung. Zum Beispiel würde in Python 2.xprint "A\n", "B"schreiben"A\nB\n"; aber in Python 3.0 schreibtprint("A\n", "B")"A\n B\n".Anfänglich werden Sie im interaktiven Modus oft die alte Syntax
print xtippen. Zeit, Ihre Finger umzutrainieren, um stattdessenprint(x)zu tippen!Bei der Verwendung des
2to3-Tools zur Quellcode-Konvertierung werden alleprint-Anweisungen automatisch inprint()-Funktionsaufrufe umgewandelt, sodass dies für größere Projekte größtenteils kein Problem darstellt.
Views und Iteratoren statt Listen¶
Einige bekannte APIs geben keine Listen mehr zurück
dict-Methodendict.keys(),dict.items()unddict.values()geben „Views“ statt Listen zurück. Zum Beispiel funktioniert Folgendes nicht mehr:k = d.keys(); k.sort(). Verwenden Sie stattdessenk = sorted(d)(dies funktioniert auch in Python 2.5 und ist genauso effizient).Außerdem werden die Methoden
dict.iterkeys(),dict.iteritems()unddict.itervalues()nicht mehr unterstützt.map()undfilter()geben Iteratoren zurück. Wenn Sie wirklich eine Liste benötigen und die Eingabesequenzen alle gleich lang sind, ist eine schnelle Lösung,map()inlist()einzubinden, z. B.list(map(...)), aber eine bessere Lösung ist oft die Verwendung einer Listen-Komprehension (insbesondere wenn der Originalcodelambdaverwendet) oder das Umschreiben des Codes, sodass er keine Liste benötigt. Besonders knifflig istmap(), das für die Seiteneffekte der Funktion aufgerufen wird; die richtige Transformation ist die Verwendung einer regulärenfor-Schleife (da das Erstellen einer Liste nur Verschwendung wäre).Wenn die Eingabesequenzen nicht gleich lang sind, stoppt
map()beim Ende der kürzesten Sequenz. Für vollständige Kompatibilität mitmap()aus Python 2.x binden Sie die Sequenzen auch initertools.zip_longest()ein, z. B.map(func, *sequences)wird zulist(map(func, itertools.zip_longest(*sequences))).range()verhält sich jetzt so, wie sichxrange()früher verhalten hat, außer dass es mit Werten beliebiger Größe arbeitet. Letzteres existiert nicht mehr.zip()gibt jetzt einen Iterator zurück.
Ordnungsvergleiche¶
Python 3.0 hat die Regeln für Ordnungsvergleiche vereinfacht
Die Ordnungsvergleichsoperatoren (
<,<=,>=,>) lösen eineTypeError-Ausnahme aus, wenn die Operanden keine sinnvolle natürliche Ordnung haben. Daher sind Ausdrücke wie1 < '',0 > Noneoderlen <= lennicht mehr gültig, und z. B.None < Nonelöst eineTypeErroraus, anstattFalsezurückzugeben. Eine Folge davon ist, dass das Sortieren einer heterogenen Liste keinen Sinn mehr ergibt – alle Elemente müssen miteinander vergleichbar sein. Beachten Sie, dass dies nicht für die Operatoren==und!=gilt: Objekte unterschiedlicher inkompatibler Typen sind immer ungleich.sorted()undlist.sort()akzeptieren das Argument cmp, das eine Vergleichsfunktion bereitstellt, nicht mehr. Verwenden Sie stattdessen das Argument key. Beachten Sie, dass die Argumente key und reverse jetzt „keyword-only“ sind.Die Funktion
cmp()sollte als nicht mehr existent behandelt werden, und die spezielle Methode__cmp__()wird nicht mehr unterstützt. Verwenden Sie stattdessen__lt__()zum Sortieren,__eq__()mit__hash__()und bei Bedarf andere Rich-Comparisons. (Wenn Sie die Funktionalität voncmp()wirklich benötigen, könnten Sie den Ausdruck(a > b) - (a < b)als Äquivalent fürcmp(a, b)verwenden.)
Ganzzahlen¶
PEP 237: Im Wesentlichen wurde
longinintumbenannt. Das heißt, es gibt nur einen integrierten integralen Typ, derintheißt; aber er verhält sich meistens wie der altelong-Typ.PEP 238: Ein Ausdruck wie
1/2gibt einen Float zurück. Verwenden Sie1//2, um das Abschneiden zu erhalten. (Die letztere Syntax existiert seit Jahren, mindestens seit Python 2.2.)Die Konstante
sys.maxintwurde entfernt, da es keine Begrenzung mehr für den Wert von Ganzzahlen gibt. Allerdings kannsys.maxsizeals eine Ganzzahl verwendet werden, die größer ist als jeder praktische Listen- oder String-Index. Sie entspricht der „natürlichen“ Ganzzahlgröße der Implementierung und ist typischerweise dieselbe wiesys.maxintin früheren Versionen auf derselben Plattform (unter der Annahme gleicher Build-Optionen).Die
repr()einer langen Ganzzahl enthält nicht mehr das nachgestellteL, sodass Code, der dieses Zeichen bedingungslos entfernt, stattdessen die letzte Ziffer abschneidet. (Verwenden Sie stattdessenstr().)Oktale Literale haben nicht mehr das Format
0720; verwenden Sie stattdessen0o720.
Text vs. Daten statt Unicode vs. 8-Bit¶
Alles, was Sie über Binärdaten und Unicode wussten, hat sich geändert.
Python 3.0 verwendet die Konzepte von Text und (binären) Daten anstelle von Unicode-Strings und 8-Bit-Strings. Jeder Text ist Unicode; kodiertes Unicode wird jedoch als Binärdaten dargestellt. Der Typ für Text ist
str, der Typ für Daten istbytes. Der größte Unterschied zur Situation in 2.x ist, dass jeder Versuch, Text und Daten in Python 3.0 zu mischen, eineTypeErrorauslöst, während in Python 2.x das Mischen von Unicode und 8-Bit-Strings funktionierte, wenn der 8-Bit-String nur 7-Bit-ASCII-Bytes enthielt, aber eineUnicodeDecodeErrorausgelöst wurde, wenn er Nicht-ASCII-Werte enthielt. Dieses wertspezifische Verhalten hat im Laufe der Jahre zu zahlreichen traurigen Gesichtern geführt.Als Konsequenz dieser geänderten Philosophie muss praktisch jeder Code, der Unicode, Kodierungen oder Binärdaten verwendet, wahrscheinlich geändert werden. Die Änderung ist zum Besseren, da in der 2.x-Welt zahlreiche Fehler im Zusammenhang mit dem Mischen von kodiertem und unkodiertem Text auftraten. Um in Python 2.x vorbereitet zu sein, beginnen Sie damit,
unicodefür allen unkodierten Text undstrnur für binäre oder kodierte Daten zu verwenden. Dann erledigt das2to3-Tool die meiste Arbeit für Sie.Sie können keine
u"..."-Literale mehr für Unicode-Text verwenden. Sie müssen jedochb"..."-Literale für Binärdaten verwenden.Da die Typen
strundbytesnicht gemischt werden können, müssen Sie immer explizit zwischen ihnen konvertieren. Verwenden Siestr.encode(), um vonstrzubyteszu gelangen, undbytes.decode(), um vonbyteszustrzu gelangen. Sie können auchbytes(s, encoding=...)undstr(b, encoding=...)verwenden.Wie
strist auch der Typbytesunveränderlich. Es gibt einen separaten veränderlichen Typ für gepufferte Binärdaten,bytearray. Fast alle APIs, diebytesakzeptieren, akzeptieren auchbytearray. Die veränderliche API basiert aufcollections.MutableSequence.Alle Backslashes in Raw-String-Literalen werden wörtlich interpretiert. Das bedeutet, dass
'\U'- und'\u'-Escapes in Raw-Strings nicht speziell behandelt werden. Zum Beispiel istr'\u20ac'in Python 3.0 ein String aus 6 Zeichen, während in 2.6ur'\u20ac'das einzelne „Euro“-Zeichen war. (Natürlich betrifft diese Änderung nur Raw-String-Literale; das Euro-Zeichen ist in Python 3.0'\u20ac'.)Der eingebaute abstrakte Typ
basestringwurde entfernt. Verwenden Sie stattdessenstr. Die Typenstrundbyteshaben nicht genügend Gemeinsamkeiten, um eine gemeinsame Basisklasse zu rechtfertigen. Das2to3-Tool (siehe unten) ersetzt jedebasestringdurchstr.Dateien, die als Textdateien geöffnet werden (immer noch der Standardmodus für
open()), verwenden immer eine Kodierung, um zwischen Strings (im Speicher) und Bytes (auf der Festplatte) zu übersetzen. Binärdateien (geöffnet mit einembim Modusargument) verwenden immer Bytes im Speicher. Das bedeutet, dass, wenn eine Datei mit einem falschen Modus oder einer falschen Kodierung geöffnet wird, die I/O wahrscheinlich laut fehlschlägt, anstatt stillschweigend falsche Daten zu erzeugen. Es bedeutet auch, dass selbst Unix-Benutzer den richtigen Modus (Text oder Binär) beim Öffnen einer Datei angeben müssen. Es gibt eine plattformabhängige Standardkodierung, die auf Unix-Systemen mit der UmgebungsvariableLANG(und manchmal auch mit anderen plattformspezifischen, locale-bezogenen Umgebungsvariablen) eingestellt werden kann. In vielen Fällen, aber nicht allen, ist die Systemstandardkodierung UTF-8; Sie sollten sich niemals auf diese Standardkodierung verlassen. Jede Anwendung, die mehr als reines ASCII liest oder schreibt, sollte wahrscheinlich eine Möglichkeit haben, die Kodierung zu überschreiben. Es ist nicht mehr notwendig, die kodierungsabhängigen Streams imcodecs-Modul zu verwenden.Die Anfangswerte von
sys.stdin,sys.stdoutundsys.stderrsind jetzt reine Unicode-Textdateien (d. h. sie sind Instanzen vonio.TextIOBase). Um Binärdaten mit diesen Streams zu lesen und zu schreiben, müssen Sie ihr Attributio.TextIOBase.bufferverwenden.Dateinamen werden als (Unicode-)Strings an und von APIs übergeben. Dies kann plattformspezifische Probleme mit sich bringen, da auf einigen Plattformen Dateinamen beliebige Byte-Strings sind. (Auf Windows werden Dateinamen nativ als Unicode gespeichert.) Als Workaround akzeptieren die meisten APIs (z. B.
open()und viele Funktionen imos-Modul), die Dateinamen akzeptieren, sowohlbytes-Objekte als auch Strings, und einige wenige APIs bieten eine Möglichkeit, einenbytes-Rückgabewert zu erhalten. So gibtos.listdir()eine Liste vonbytes-Instanzen zurück, wenn das Argument einebytes-Instanz ist, undos.getcwdb()gibt das aktuelle Arbeitsverzeichnis alsbytes-Instanz zurück. Beachten Sie, dassos.listdir(), wenn es eine Liste von Strings zurückgibt, Dateinamen, die nicht korrekt dekodiert werden können, weglässt, anstatt eineUnicodeErrorauszulösen.Einige System-APIs wie
os.environundsys.argvkönnen ebenfalls Probleme verursachen, wenn die vom System bereitgestellten Bytes nicht mit der Standardkodierung interpretiert werden können. Das Setzen derLANG-Variable und das erneute Ausführen des Programms ist wahrscheinlich der beste Ansatz.PEP 3138: Die
repr()eines Strings maskiert nicht mehr Nicht-ASCII-Zeichen. Sie maskiert jedoch weiterhin Steuerzeichen und Codepunkte mit nicht druckbarem Status gemäß dem Unicode-Standard.PEP 3120: Die Standard-Quellcode-Kodierung ist jetzt UTF-8.
PEP 3131: Nicht-ASCII-Buchstaben sind jetzt in Bezeichnern erlaubt. (Die Standardbibliothek bleibt jedoch ASCII-orientiert, mit Ausnahme von Mitwirkendennamen in Kommentaren.)
Die Module
StringIOundcStringIOsind verschwunden. Importieren Sie stattdessen dasio-Modul und verwenden Sieio.StringIOoderio.BytesIOfür Text bzw. Daten.Siehe auch das Unicode HOWTO, das für Python 3.0 aktualisiert wurde.
Übersicht über Syntaxänderungen¶
Dieser Abschnitt gibt einen kurzen Überblick über jede syntaktische Änderung in Python 3.0.
Neue Syntax¶
PEP 3107: Anmerkungen für Funktionsargumente und Rückgabewerte. Dies bietet eine standardisierte Methode zur Annotation von Parametern und Rückgabewerten einer Funktion. Diesen Anmerkungen sind keine Semantiken zugeordnet, außer dass sie zur Laufzeit über das Attribut
__annotations__ausgelesen werden können. Die Absicht ist, Experimente durch Metaklassen, Dekoratoren oder Frameworks zu fördern.PEP 3102: Keyword-only arguments. Benannte Parameter, die nach
*argsin der Parameterliste stehen, *müssen* mit Schlüsselwortsyntax im Aufruf angegeben werden. Sie können auch ein bloßes*in der Parameterliste verwenden, um anzuzeigen, dass Sie keine variable Liste von Argumenten akzeptieren, aber Keyword-only arguments haben.Schlüsselwortargumente sind nach der Liste der Basisklassen in einer Klassendefinition zulässig. Dies wird durch die neue Konvention zur Angabe einer Metaklasse verwendet (siehe nächster Abschnitt), kann aber auch für andere Zwecke verwendet werden, solange die Metaklasse dies unterstützt.
PEP 3104:
nonlocal-Anweisung. Mitnonlocal xkönnen Sie jetzt direkt eine Variable in einem äußeren (aber nicht globalen) Gültigkeitsbereich zuweisen.nonlocalist ein neues reserviertes Wort.PEP 3132: Erweitertes Entpacken von Iterables. Sie können jetzt Dinge schreiben wie
a, b, *rest = some_sequence. Und sogar*rest, a = stuff. Dasrest-Objekt ist immer eine (möglicherweise leere) Liste; die rechte Seite kann ein beliebiges Iterable sein. Beispiel(a, *rest, b) = range(5)
Dies setzt a auf
0, b auf4und rest auf[1, 2, 3].Dictionary Comprehensions:
{k: v for k, v in stuff}bedeutet dasselbe wiedict(stuff), ist aber flexibler. (Dies ist PEP 274 bestätigt. :-)Set-Literale, z. B.
{1, 2}. Beachten Sie, dass{}ein leeres Dictionary ist; verwenden Sieset()für ein leeres Set. Set Comprehensions werden ebenfalls unterstützt; z. B. bedeutet{x for x in stuff}dasselbe wieset(stuff), ist aber flexibler.Neue Oktal-Literale, z. B.
0o720(bereits in 2.6). Die alten Oktal-Literale (0720) sind weggefallen.Neue Binär-Literale, z. B.
0b1010(bereits in 2.6), und es gibt eine neue entsprechende eingebaute Funktion,bin().Byte-Literale werden mit einem führenden
boderBeingeführt, und es gibt eine neue entsprechende eingebaute Funktion,bytes().
Geänderte Syntax¶
PEP 3109 und PEP 3134: neue
raise-Anweisungssyntax:raise [expr [from expr]]. Siehe unten.asundwithsind jetzt reservierte Wörter. (Tatsächlich bereits seit 2.6.)True,FalseundNonesind reservierte Wörter. (2.6 hat die Einschränkungen fürNonebereits teilweise durchgesetzt.)Änderung von
exceptexc, var zuexceptexcasvar. Siehe PEP 3110.PEP 3115: Neue Metaklassen-Syntax. Anstatt
class C: __metaclass__ = M ...
müssen Sie jetzt
class C(metaclass=M): ...
verwenden. Die Modul-globale Variable
__metaclass__wird nicht mehr unterstützt. (Sie war eine Krücke, um die Standardverwendung von Klassen im neuen Stil zu erleichtern, ohne jede Klasse vonobjectabzuleiten.)List Comprehensions unterstützen nicht mehr die syntaktische Form
[... for var in item1, item2, ...]. Verwenden Sie stattdessen[... for var in (item1, item2, ...)]. Beachten Sie auch, dass List Comprehensions andere Semantiken haben: Sie sind eher syntaktischer Zucker für einen Generator-Ausdruck innerhalb eineslist()-Konstruktors, und insbesondere die Schleifensteuerungsvariablen werden nicht mehr in den umgebenden Gültigkeitsbereich geleckt.Das Auslassungszeichen (
...) kann überall als atomarer Ausdruck verwendet werden. (Zuvor war es nur in Slices zulässig.) Außerdem muss es jetzt als...geschrieben werden. (Zuvor konnte es auch als. . .geschrieben werden, durch einen bloßen Zufall der Grammatik.)
Entfernte Syntax¶
PEP 3113: Tupel-Parameter-Entpacken entfernt. Sie können nicht mehr
def foo(a, (b, c)): ...schreiben. Verwenden Sie stattdessendef foo(a, b_c): b, c = b_c.Backticks entfernt (verwenden Sie stattdessen
repr()).Entfernt
<>(verwenden Sie stattdessen!=).Entferntes Schlüsselwort:
exec()ist kein Schlüsselwort mehr; es bleibt als Funktion. (Glücklicherweise wurde die Funktionssyntax auch in 2.x akzeptiert.) Beachten Sie auch, dassexec()keinen Stream-Argument mehr annimmt; anstelle vonexec(f)können Sieexec(f.read())verwenden.Ganzzahl-Literale unterstützen kein nachgestelltes
loderLmehr.Zeichenketten-Literale unterstützen kein führendes
uoderUmehr.Die Syntax
frommoduleimport*ist nur auf Modulebene zulässig, nicht mehr innerhalb von Funktionen.Die einzig akzeptable Syntax für relative Importe ist
from .[module] import name. Alleimport-Formen, die nicht mit.beginnen, werden als absolute Importe interpretiert. (PEP 328)Klassische Klassen sind weggefallen.
Änderungen, die bereits in Python 2.6 vorhanden sind¶
Da viele Benutzer wahrscheinlich direkt von Python 2.5 auf Python 3.0 umsteigen, erinnert dieser Abschnitt den Leser an neue Funktionen, die ursprünglich für Python 3.0 entwickelt wurden, aber nach Python 2.6 zurückportiert wurden. Die entsprechenden Abschnitte in Was ist neu in 2.6 sollten für längere Beschreibungen konsultiert werden.
PEP 343: Die ‚with‘-Anweisung. Die
with-Anweisung ist nun eine Standardfunktion und muss nicht mehr aus__future__importiert werden. Schauen Sie auch unter Kontextmanager schreiben und Das Modul contextlib nach.PEP 366: Explizite relative Importe aus einem Hauptmodul. Dies erhöht die Nützlichkeit der Option
-m, wenn sich das referenzierte Modul in einem Paket befindet.PEP 3101: Erweiterte String-Formatierung. Hinweis: Die 2.6-Beschreibung erwähnt die
format()-Methode sowohl für 8-Bit- als auch für Unicode-Strings. In 3.0 unterstützt nur der Typstr(Text-Strings mit Unicode-Unterstützung) diese Methode; der Typbytesnicht. Der Plan ist, dies schließlich zur einzigen API für String-Formatierung zu machen und den%-Operator in Python 3.1 als veraltet zu kennzeichnen.PEP 3105: print als Funktion. Dies ist nun eine Standardfunktion und muss nicht mehr aus
__future__importiert werden. Weitere Details finden Sie oben.PEP 3110: Änderungen an der Ausnahmebehandlung. Die Syntax
exceptexcasvar ist nun Standard undexceptexc, var wird nicht mehr unterstützt. (Natürlich ist derasvar Teil immer noch optional.)PEP 3112: Byte-Literale. Die Zeichenketten-Literalnotation
b"..."(und ihre Varianten wieb'...',b"""..."""undbr"...") erzeugt nun ein Literal vom Typbytes.PEP 3116: Neue I/O-Bibliothek. Das Modul
ioist nun die Standardmethode für die Datei-E/A. Die eingebaute Funktionopen()ist nun ein Alias fürio.open()und hat zusätzliche Schlüsselwortargumente encoding, errors, newline und closefd. Beachten Sie auch, dass ein ungültiges mode-Argument nunValueErrorund nichtIOErrorauslöst. Das binäre Dateiobjekt unter dem Textdateiobjekt kann alsf.bufferzugegriffen werden (aber Vorsicht, das Textobjekt behält einen Puffer von sich selbst bei, um die Kodierungs- und Dekodierungsoperationen zu beschleunigen).PEP 3118: Überarbeitetes Pufferprotokoll. Die alte eingebaute Funktion
buffer()ist nun wirklich weg; die neue eingebaute Funktionmemoryview()bietet (hauptsächlich) ähnliche Funktionalität.PEP 3119: Abstrakte Basisklassen. Das Modul
abcund die im Modulcollectionsdefinierten ABCs spielen nun eine etwas prominentere Rolle in der Sprache, und eingebaute Sammlungstypen wiedictundlistentsprechen den ABCscollections.MutableMappingundcollections.MutableSequence.PEP 3127: Unterstützung und Syntax für Ganzzahl-Literale. Wie oben erwähnt, wird die neue Oktal-Literalnotation als einzige unterstützt, und Binär-Literale wurden hinzugefügt.
PEP 3141: Eine Typenhierarchie für Zahlen. Das Modul
numbersist ein weiterer neuer Anwendungsfall für ABCs, der den „numerischen Turm“ von Python definiert. Beachten Sie auch das neue Modulfractions, dasnumbers.Rationalimplementiert.
Änderungen in der Bibliothek¶
Aus Zeitgründen deckt dieses Dokument die sehr umfangreichen Änderungen an der Standardbibliothek nicht erschöpfend ab. PEP 3108 ist die Referenz für die wichtigsten Änderungen an der Bibliothek. Hier ist eine kurze Übersicht
Viele alte Module wurden entfernt. Einige, wie
gopherlib(nicht mehr verwendet) undmd5(ersetzt durchhashlib), wurden bereits durch PEP 4 als veraltet gekennzeichnet. Andere wurden aufgrund der Entfernung der Unterstützung für verschiedene Plattformen wie Irix, BeOS und Mac OS 9 entfernt (siehe PEP 11). Einige Module wurden auch für die Entfernung in Python 3.0 ausgewählt, da sie wenig genutzt wurden oder ein besserer Ersatz existiert. Siehe PEP 3108 für eine vollständige Liste.Das Paket
bsddb3wurde entfernt, da seine Präsenz in der Kernstandardbibliothek im Laufe der Zeit aufgrund von Testinstabilitäten und dem Veröffentlichungsplan von Berkeley DB eine besondere Belastung für die Kernentwickler darstellte. Das Paket ist jedoch lebendig und gut gepflegt und wird extern unter https://www.jcea.es/programacion/pybsddb.htm gepflegt.Einige Module wurden umbenannt, weil ihr alter Name gegen PEP 8 verstieß oder aus verschiedenen anderen Gründen. Hier ist die Liste
Alter Name
Neuer Name
_winreg
winreg
ConfigParser
configparser
copy_reg
copyreg
Queue
queue
SocketServer
socketserver
markupbase
_markupbase
repr
reprlib
test.test_support
test.support
Ein gängiges Muster in Python 2.x ist, eine Version eines Moduls in reinem Python zu haben, mit einer optionalen beschleunigten Version, die als C-Erweiterung implementiert ist; zum Beispiel
pickleundcPickle. Dies legt die Last des Imports der beschleunigten Version und des Zurückfallens auf die reine Python-Version auf jeden Benutzer dieser Module. In Python 3.0 werden die beschleunigten Versionen als Implementierungsdetails der reinen Python-Versionen betrachtet. Benutzer sollten immer die Standardversion importieren, die versucht, die beschleunigte Version zu importieren und auf die reine Python-Version zurückzufallen. Das Paarpickle/cPicklehat diese Behandlung erhalten. Das Modulprofilesteht für 3.1 auf der Liste. Das ModulStringIOwurde in eine Klasse im Modulioumgewandelt.Einige verwandte Module wurden zu Paketen zusammengefasst, und normalerweise wurden die Modulnamen vereinfacht. Die resultierenden neuen Pakete sind
dbm(anydbm,dbhash,dbm,dumbdbm,gdbm,whichdb).html(HTMLParser,htmlentitydefs).http(httplib,BaseHTTPServer,CGIHTTPServer,SimpleHTTPServer,Cookie,cookielib).tkinter(alleTkinter-bezogenen Module außerturtle). Die Zielgruppe vonturtlekümmert sich nicht wirklich umtkinter. Beachten Sie auch, dass seit Python 2.6 die Funktionalität vonturtlestark erweitert wurde.urllib(urllib,urllib2,urlparse,robotparse).xmlrpc(xmlrpclib,DocXMLRPCServer,SimpleXMLRPCServer).
Einige weitere Änderungen an Standardbibliotheksmodulen, die nicht von PEP 3108 abgedeckt sind
Modul
setsentfernt. Verwenden Sie die eingebaute Klasseset().Bereinigung des Moduls
sys: entferntsys.exitfunc(),sys.exc_clear(),sys.exc_type,sys.exc_value,sys.exc_traceback. (Beachten Sie, dasssys.last_typeusw. bestehen bleiben.)Bereinigung des Typs
array.array: die Methodenread()undwrite()sind weg; verwenden Sie stattdessenfromfile()undtofile(). Auch der Typcode'c'für Arrays ist weg – verwenden Sie entweder'b'für Bytes oder'u'für Unicode-Zeichen.Bereinigung des Moduls
operator: entferntsequenceIncludes()undisCallable().Bereinigung des Moduls
thread:acquire_lock()undrelease_lock()sind weg; verwenden Sie stattdessenacquire()undrelease().Bereinigung des
random-Moduls: Die APIjumpahead()wurde entfernt.Das Modul
newist weggefallen.Die Funktionen
os.tmpnam(),os.tempnam()undos.tmpfile()wurden zugunsten des Modulstempfileentfernt.Das Modul
tokenizewurde so geändert, dass es mit Bytes arbeitet. Der Haupteinstiegspunkt ist nuntokenize.tokenize()anstelle von generate_tokens.string.lettersund seine Freunde (string.lowercaseundstring.uppercase) sind weggefallen. Verwenden Sie stattdessenstring.ascii_lettersusw. (Der Grund für die Entfernung ist, dassstring.lettersund Freunde ein lokalabhängiges Verhalten hatten, was für solch attraktiv benannte globale „Konstanten“ eine schlechte Idee ist.)Das Modul
__builtin__wurde inbuiltinsumbenannt (Unterstriche entfernt, ein „s“ hinzugefügt). Die Variable__builtins__, die in den meisten globalen Namensräumen gefunden wird, ist unverändert. Um eine eingebaute Funktion zu ändern, sollten Siebuiltinsund nicht__builtins__verwenden!
PEP 3101: Ein neuer Ansatz für die Formatierung von Zeichenketten¶
Ein neues System für integrierte Zeichenkettenformatierungsoperationen ersetzt den Zeichenkettenformatierungsoperator
%. (Der%-Operator wird jedoch weiterhin unterstützt; er wird in Python 3.1 als veraltet gelten und später aus der Sprache entfernt werden.) Lesen Sie PEP 3101 für alle Details.
Änderungen an Ausnahmen¶
Die APIs zum Auslösen und Abfangen von Ausnahmen wurden bereinigt und neue leistungsstarke Funktionen hinzugefügt.
PEP 352: Alle Ausnahmen müssen von
BaseExceptionabgeleitet sein (direkt oder indirekt). Dies ist die Wurzel der Ausnahmenhierarchie. Dies ist keine neue Empfehlung mehr, aber die *Anforderung*, vonBaseExceptionzu erben, ist neu. (Python 2.6 erlaubte immer noch die Auslösung von klassischen Klassen und schränkte nicht ein, was aufgefangen werden kann.) Infolgedessen sind Zeichenkettenausnahmen endlich wirklich und vollständig tot.Fast alle Ausnahmen sollten tatsächlich von
Exceptionabgeleitet werden;BaseExceptionsollte nur als Basisklasse für Ausnahmen verwendet werden, die nur auf oberster Ebene behandelt werden sollen, wie z. B.SystemExitoderKeyboardInterrupt. Das empfohlene Idiom zum Behandeln aller Ausnahmen außer der letztgenannten Kategorie ist die Verwendung vonexceptException.StandardErrorwurde entfernt.Ausnahmen verhalten sich nicht mehr wie Sequenzen. Verwenden Sie stattdessen das Attribut
args.PEP 3109: Auslösen von Ausnahmen. Sie müssen nun
raise Exception(args)anstelle vonraise Exception, argsverwenden. Außerdem können Sie keinen Traceback mehr explizit angeben; wenn Sie dies tun müssen, können Sie direkt dem Attribut__traceback__zuweisen (siehe unten).PEP 3110: Abfangen von Ausnahmen. Sie müssen nun
except SomeException as variableanstelle vonexcept SomeException, variableverwenden. Darüber hinaus wird die *Variable* explizit gelöscht, wenn derexcept-Block verlassen wird.PEP 3134: Ausnahmeverkettung. Es gibt zwei Fälle: implizite Verkettung und explizite Verkettung. Implizite Verkettung tritt auf, wenn eine Ausnahme in einem
except- oderfinally-Handler-Block ausgelöst wird. Dies geschieht normalerweise aufgrund eines Fehlers im Handler-Block; wir nennen dies eine *sekundäre* Ausnahme. In diesem Fall wird die ursprüngliche Ausnahme (die gerade behandelt wurde) als Attribut__context__der sekundären Ausnahme gespeichert. Explizite Verkettung wird mit dieser Syntax aufgerufenraise SecondaryException() from primary_exception
(wobei primary_exception ein beliebiger Ausdruck ist, der ein Ausnahmeobjekt erzeugt, wahrscheinlich eine zuvor abgefangene Ausnahme). In diesem Fall wird die primäre Ausnahme im Attribut
__cause__der sekundären Ausnahme gespeichert. Der Traceback, der gedruckt wird, wenn eine unbehandelte Ausnahme auftritt, durchläuft die Kette von__cause__- und__context__-Attributen und gibt für jede Komponente der Kette einen separaten Traceback aus, mit der primären Ausnahme oben. (Java-Benutzer erkennen dieses Verhalten möglicherweise.)PEP 3134: Ausnahmeobjekte speichern nun ihren Traceback als Attribut
__traceback__. Das bedeutet, dass ein Ausnahmeobjekt nun alle Informationen enthält, die sich auf eine Ausnahme beziehen, und es gibt weniger Gründe,sys.exc_info()zu verwenden (obwohl letzteres nicht entfernt wurde).Einige Fehlermeldungen werden verbessert, wenn Windows ein Erweiterungsmodul nicht laden kann. Zum Beispiel ist
error code 193jetzt%1 ist keine gültige Win32 Anwendung. Zeichenketten gehen nun mit Nicht-englischen Lokalen um.
Sonstige Änderungen¶
Operatoren und spezielle Methoden¶
!=gibt nun das Gegenteil von==zurück, es sei denn,==gibtNotImplementedzurück.Das Konzept der „ungebundenen Methoden“ wurde aus der Sprache entfernt. Wenn auf eine Methode als Klassenattribut verwiesen wird, erhalten Sie nun ein einfaches Funktionsobjekt.
__getslice__(),__setslice__()und__delslice__()wurden entfernt. Die Syntaxa[i:j]wird nun zua.__getitem__(slice(i, j))(oder__setitem__()oder__delitem__(), wenn als Zuweisungs- oder Löschziel verwendet).PEP 3114: Die Standardmethode
next()wurde in__next__()umbenannt.Die speziellen Methoden
__oct__()und__hex__()wurden entfernt –oct()undhex()verwenden nun__index__(), um das Argument in eine Ganzzahl umzuwandeln.Unterstützung für
__members__und__methods__entfernt.Die Funktionsattribute mit dem Namen
func_Xwurden in die Form__X__umbenannt, wodurch diese Namen im Namensraum für Funktionsattribute für benutzerdefinierte Attribute frei werden. Genauer gesagt, wurdenfunc_closure,func_code,func_defaults,func_dict,func_doc,func_globals,func_namein__closure__,__code__,__defaults__,__dict__,__doc__,__globals__,__name__, umbenannt.__nonzero__()ist nun__bool__().
Builtins¶
PEP 3135: Neues
super(). Sie können nunsuper()ohne Argumente aufrufen und (vorausgesetzt, dies geschieht in einer regulären Instanzmethode, die innerhalb einerclass-Anweisung definiert ist) werden die richtige Klasse und Instanz automatisch ausgewählt. Mit Argumenten ist das Verhalten vonsuper()unverändert.PEP 3111:
raw_input()wurde ininput()umbenannt. Das heißt, die neue Funktioninput()liest eine Zeile vonsys.stdinund gibt sie mit entferntem Zeilenumbruch zurück. Sie löstEOFErroraus, wenn die Eingabe vorzeitig beendet wird. Um das alte Verhalten voninput()zu erhalten, verwenden Sieeval(input()).Eine neue integrierte Funktion
next()wurde hinzugefügt, um die Methode__next__()für ein Objekt aufzurufen.Die Rundungsstrategie und der Rückgabetyp der Funktion
round()haben sich geändert. Exakte Halbwerte werden nun zum nächsten geraden Ergebnis gerundet statt vom Nullpunkt weg. (Zum Beispiel gibtround(2.5)nun2statt3zurück.)round(x[, n])delegiert nun anx.__round__([n]), anstatt immer einen Float zurückzugeben. Es gibt im Allgemeinen eine Ganzzahl zurück, wenn es mit einem Argument aufgerufen wird, und einen Wert vom Typ vonx, wenn es mit zwei Argumenten aufgerufen wird.intern()wurde nachsys.intern()verschoben.Entfernt:
apply(). Anstelle vonapply(f, args)verwenden Sief(*args).Entfernt:
callable(). Anstelle voncallable(f)können Sieisinstance(f, collections.Callable)verwenden. Die Funktionoperator.isCallable()ist ebenfalls weggefallen.Entfernt:
coerce(). Diese Funktion dient nun keinem Zweck mehr, da klassische Klassen weggefallen sind.Entfernt:
execfile(). Anstelle vonexecfile(fn)verwenden Sieexec(open(fn).read()).Den Typ
fileentfernt. Verwenden Sie stattdessenopen(). Es gibt nun mehrere verschiedene Arten von Streams, die `open` im Moduliozurückgeben kann.Entfernt:
reduce(). Verwenden Siefunctools.reduce(), wenn Sie es unbedingt benötigen. In 99 % der Fälle ist jedoch eine explizitefor-Schleife lesbarer.Entfernt:
reload(). Verwenden Sieimp.reload().Entfernt.
dict.has_key()– verwenden Sie stattdessen den Operatorin.
Build- und C-API-Änderungen¶
Aus Zeitgründen ist dies eine *sehr* unvollständige Liste der Änderungen an der C-API.
Die Unterstützung für mehrere Plattformen wurde eingestellt, darunter unter anderem Mac OS 9, BeOS, RISCOS, Irix und Tru64.
PEP 3118: Neue Buffer-API.
PEP 3121: Initialisierung & Finalisierung von Erweiterungsmodulen.
PEP 3123: Anpassung von
PyObject_HEADan Standard-C.Keine C-API-Unterstützung mehr für eingeschränkte Ausführung.
Die C-API-Funktionen
PyNumber_Coerce(),PyNumber_CoerceEx(),PyMember_Get()undPyMember_Set()wurden entfernt.Neue C-API
PyImport_ImportModuleNoBlock(), funktioniert wiePyImport_ImportModule(), blockiert aber nicht beim Import-Lock (gibt stattdessen einen Fehler zurück).Der boolesche Konvertierungs-Slot und die Methode auf C-Ebene wurden umbenannt:
nb_nonzeroist nunnb_bool.METH_OLDARGSundWITH_CYCLE_GCwurden aus der C-API entfernt.
Leistung¶
Das Nettoergebnis der 3.0-Generalisierungen ist, dass Python 3.0 den Pystone-Benchmark etwa 10 % langsamer ausführt als Python 2.5. Wahrscheinlich ist die Entfernung der Sonderbehandlung für kleine Ganzzahlen die Hauptursache. Es gibt Raum für Verbesserungen, aber diese werden nach der Veröffentlichung von 3.0 erfolgen!
Portierung auf Python 3.0¶
Für die Portierung bestehenden Python 2.5- oder 2.6-Quellcodes auf Python 3.0 ist die beste Strategie die folgende:
(Voraussetzung:) Beginnen Sie mit einer ausgezeichneten Testabdeckung.
Portieren Sie auf Python 2.6. Dies sollte nicht mehr Aufwand erfordern als die durchschnittliche Portierung von Python 2.x auf Python 2.(x+1). Stellen Sie sicher, dass alle Ihre Tests erfolgreich sind.
(Immer noch mit 2.6:) Aktivieren Sie den Kommandozeilenschalter
-3. Dies aktiviert Warnungen zu Funktionen, die in 3.0 entfernt (oder geändert) werden. Führen Sie Ihre Testsuite erneut aus und beheben Sie Code, für den Sie Warnungen erhalten, bis keine Warnungen mehr angezeigt werden und alle Ihre Tests immer noch erfolgreich sind.Führen Sie den Quellcode-zu-Quellcode-Übersetzer
2to3über Ihren Quellcodepfad aus. Führen Sie das Ergebnis der Übersetzung unter Python 3.0 aus. Korrigieren Sie manuell alle verbleibenden Probleme, bis alle Tests wieder erfolgreich sind.
Es wird nicht empfohlen, Quellcode zu schreiben, der unverändert unter Python 2.6 und 3.0 läuft; Sie müssten einen sehr verdrehten Programmierstil verwenden, z. B. print-Anweisungen, Metaklassen und vieles mehr vermeiden. Wenn Sie eine Bibliothek pflegen, die sowohl Python 2.6 als auch 3.0 unterstützen muss, ist der beste Ansatz, Schritt 3 oben zu ändern, indem Sie die 2.6-Version des Quellcodes bearbeiten und den 2to3-Übersetzer erneut ausführen, anstatt die 3.0-Version des Quellcodes zu bearbeiten.
Für die Portierung von C-Erweiterungen auf Python 3.0 siehe Portierung von Erweiterungsmodulen auf Python 3.