43 Von Python 2 nach Python 3
Die Programmiersprache Python befindet sich in fortlaufender Entwicklung und hat seit der Veröffentlichung der Version 1.0 im Januar 1994 viele Veränderungen erfahren. In diesem Kapitel werden wir die Entwicklung der Sprache Python beschreiben. Dabei beginnen wir mit der Version 2.0, die im Jahr 2000 veröffentlicht wurde.
Im Anschluss daran wird der große Sprung auf Version 3.0 im Detail besprochen. Python 2 ist auch heute noch im Einsatz, weswegen Sie sich über die bestehenden Unterschiede im Klaren sein sollten.
Tabelle 43.1 nennt die wichtigen Neuerungen der einzelnen Python-Versionen. Diese Liste ist nicht vollständig, die Änderungen sind zu zahlreich, um sie hier vollständig wiederzugeben.
Eine umfassende Auflistung aller Änderungen einer Python-Version finden Sie in der entsprechenden Dokumentation unter dem Titel »What’s New in Python x.y«.
Version | Jahr | Wesentliche Neuerungen |
---|---|---|
2.0 | 2000 |
|
2.1 | 2001 |
|
2.2 | 2001 |
|
2.3 | 2003 |
|
2.4 | 2004 |
|
2.5 | 2006 |
|
2.6 | 2008 |
Die Version 2.6 wurde zeitgleich zu 3.0 entwickelt und enthält die Neuerungen aus Version 3.0, die die Abwärtskompatibilität der Sprache nicht beeinträchtigen:
|
2.7 | 2010 |
Die Version 2.7 ist die letzte Version von Python 2 und beinhaltet einige der Neuerungen von Python 3.1 bzw. 3.2:
|
3.0 | 2008 |
Änderungen, die nicht auch in Version 2.6 enthalten sind:
|
3.1 | 2009 |
|
3.2 | 2011 |
|
3.3 | 2012 |
|
3.4 | 2014 |
|
3.5 | 2015 |
|
3.6 | 2016 |
|
Im Folgenden wird der einschneidende Versionssprung von Python 2 auf Python 3 besprochen. Das Besondere an der Version 3.0 ist, dass sie nicht mehr abwärtskompatibel mit älteren Python-Versionen ist. Das bedeutet, dass ein Programm, das für Python 2 geschrieben wurde, mit großer Wahrscheinlichkeit nicht unter Python 3 lauffähig ist. Der Bruch mit der Abwärtskompatibilität erlaubte es den Python-Entwicklern, lange mitgeschleppte Unschönheiten und Inkonsequenzen aus der Sprache zu entfernen und so eine rundum erneuerte Version von Python zu veröffentlichen.
Alles in allem sind die mit Python 3.0 eingeführten Änderungen nicht dramatisch, es bedarf jedoch einer gewissen Umgewöhnung, um von Python 2 auf Python 3 umzusteigen. Aus diesem Grund besprechen wir in diesem Kapitel übersichtlich die wichtigsten Unterschiede zwischen Python 2 und 3.
Python 3 beinhaltet ein Tool namens 2to3, das das Umstellen eines größeren Projekts von Python 2 auf 3 erleichtert, indem es den Quellcode zu großen Teilen automatisch konvertiert. Die Handhabung dieses Programms erklären wir im zweiten Abschnitt.
43.1 Die wichtigsten Unterschiede
Im Folgenden sind die wichtigsten Unterschiede zwischen den Python-Versionen 2 und 3 aufgeführt.
[»] Hinweis
Mit Python 3 wurden auch viele subtile Änderungen, beispielsweise an den Schnittstellen vieler Module der Standardbibliothek, vorgenommen, die hier aus naheliegenden Gründen nicht alle erläutert werden können. Antworten auf solch detaillierte Fragen finden Sie in den Onlinedokumentationen auf der Python-Website http://www.python.org.
43.1.1 Ein-/Ausgabe
In puncto Ein-/Ausgabe gab es zwei auffällige, aber schnell erklärte Änderungen:
-
Das Schlüsselwort print aus Python 2 ist einer Built-in Function gleichen Namens gewichen. In der Regel brauchen hier also nur Klammern um den auszugebenden Ausdruck ergänzt zu werden:
Python 2 Python 3 >>> print "Hallo Welt"
Hallo Welt>>> print("Hallo Welt")
Hallo Welt>>> print "ABC", "DEF", 2+2
ABC DEF 4>>> print("ABC", "DEF", 2+2)
ABC DEF 4>>> print >>f, "Dateien"
>>> print("Dateien", file=f)
>>> for i in range(3):
... print i,
...
0 1 2>>> for i in range(3):
... print(i, end=" ")
...
0 1 2 - Die zweite auffällige Änderung hinsichtlich der Ein-/Ausgabe betrifft die Built-in Function input. Die input-Funktion aus Python 3 entspricht der raw_input-Funktion aus Python 2. Eine Entsprechung für die input-Funktion aus Python 2 gibt es in Python 3 als Built-in Function nicht, doch ihr Verhalten kann mithilfe von eval nachgebildet werden:
Python 2 | Python 3 |
---|---|
>>> input("Ihr Wert: ") |
>>> eval(input("Ihr Wert: ")) |
>>> raw_input("Ihr Wert: ") |
>>> input("Ihr Wert: ") |
Dies waren die beiden gewöhnungsbedürftigsten Änderungen, was die Bildschirmausgabe bzw. Tastatureingabe betrifft.
43.1.2 Iteratoren
Obwohl Python 2 das Iterator-Konzept bereits unterstützt, geben viele Funktionen, die für gewöhnlich zum Iterieren über eine bestimmte Menge verwendet werden, eine Liste der Elemente dieser Menge zurück, so beispielsweise die prominente Funktion range. Üblicherweise wird diese Liste aber nur in einer for-Schleife durchlaufen. Dies kann durch Verwendung von Iteratoren eleganter und speicherschonender durchgeführt werden.
Aus diesem Grund geben viele der Funktionen und Methoden, die in Python 2 eine Liste zurückgeben, in Python 3 einen auf die Gegebenheiten zugeschnittenen Iterator zurück. Um diese Objekte in eine Liste zu überführen, können sie einfach der Built-in Function list übergeben werden.
Damit verhält sich zum Beispiel die range-Funktion aus Python 3 gerade so wie die xrange-Funktion aus Python 2. Ein Aufruf von list(range()) in Python 3 ist äquivalent zur range-Funktion aus Python 2.
Python 2 | Python 3 |
---|---|
>>> xrange(5) |
>>> range(5) |
>>> range(5) |
>>> list(range(5)) |
Abgesehen von range sind von dieser Änderung die Built-in Functions map, filter und zip betroffen, die nun einen Iterator zurückgeben. Die Methoden keys, items und values eines Dictionarys geben jetzt ein sogenanntes view-Objekt zurück, das ebenfalls iterierbar ist. Die Methoden iterkeys, iteritems und itervalues eines Dictionarys sowie die Built-in Function xrange aus Python 2 existieren in Python 3 nicht mehr.
43.1.3 Strings
Die wohl grundlegendste Änderung in Python 3 ist die Umdeutung des Datentyps str. In Python 2 existieren zwei Datentypen für Strings: str und unicode. Während Ersterer zum Speichern beliebiger Byte-Folgen verwendet werden kann, war Letzterer für Unicode-Text zuständig.
In Python 3 ist der Datentyp str ausschließlich für Text zuständig und mit dem unicode-Datentyp aus Python 2 vergleichbar. Zum Speichern von byte-Folgen gibt es in Python 3 die Datentypen bytes und bytearray, wobei es sich bei bytes um einen unveränderlichen und bei bytearray um einen veränderlichen Datentyp handelt. In Python 3 existiert weder das u-Literal für Unicode-Strings noch der Datentyp unicode.
Die Datentypen bytes und str sind in Python 3 klarer voneinander abgegrenzt, als es bei den Datentypen str und unicode in Python 2 der Fall ist. So ist es beispielsweise nicht mehr möglich, einen String und einen bytes-String ohne explizites Codieren bzw. Decodieren zusammenzufügen.
Tabelle 43.5 weist die Unterschiede zwischen str in Python 2 und str in Python 3 exemplarisch auf.
Python 2 | Python 3 |
---|---|
>>> u = u"Ich bin Unicode" |
>>> u = "Ich bin Unicode" |
>>> a = "Ich bin ASCII" |
>>> a = b"Ich bin ASCII" |
>>> "abc" + u"def" |
>>> b"abc" + "def" |
Die stärkere Abgrenzung von str und bytes in Python 3 hat Auswirkungen auf die Standardbibliothek. So dürfen Sie beispielsweise zur Netzwerkkommunikation nur bytes-Strings verwenden. Wichtig ist auch, dass der Typ der aus einer Datei eingelesenen Daten nun vom Modus abhängt, in dem die Datei geöffnet wurde. Der Unterschied zwischen Binär- und Textmodus ist in Python 3 also auch unter Betriebssystemen von Interesse, die diese beiden Modi von sich aus gar nicht unterscheiden.
[»] Hinweis
Um den Aufwand zum Konvertieren von Code zwischen Python 2.x und Python 3.x zu verringern, ist die Schreibweise u"Hallöchen" für Strings seit Python 3.3 wieder erlaubt. Sie hat allerdings keine besondere Bedeutung, sondern ist äquivalent zu "Hallöchen".
43.1.4 Ganze Zahlen
In Python 2 existieren zwei Datentypen zum Speichern ganzer Zahlen: int für Zahlen im 32- bzw. 64-Bit-Zahlenbereich und long für Zahlen beliebiger Größe. In Python 3 gibt es nur noch einen solchen Datentyp namens int, der sich aber wie long aus Python 2 verhält. Die Unterscheidung zwischen int und long ist auch in Python 2 für den Programmierer im Wesentlichen schon uninteressant, da die beiden Datentypen automatisch ineinander konvertiert werden.
Eine zweite Änderung erfolgt in Bezug auf die Division ganzer Zahlen. In Python 2 wird in diesem Fall eine ganzzahlige Division (Integer-Division) durchgeführt, das Ergebnis ist also wieder eine ganze Zahl. In Python 3 ist das Ergebnis der Division zweier Ganzzahlen eine Gleitkommazahl. Für die Integer-Division existiert hier der Operator //:
Python 2 | Python 3 |
---|---|
>>> 10 / 4 |
>>> 10 / 4 |
>>> 10 // 4 |
>>> 10 // 4 |
>>> 10.0 / 4 |
>>> 10.0 / 4 |
43.1.5 Exception Handling
Beim Werfen und Fangen von Exceptions wurden kleinere syntaktische Änderungen durchgeführt. Die alte und die neue Syntax werden in Tabelle 43.7 anhand eines Beispiels einander gegenübergestellt.
Python 2 | Python 3 |
---|---|
try: |
try: |
Dabei ist anzumerken, dass die im oben genannte Beispiel unter Python 3 für das Werfen der Exception verwendete Syntax unter Python 2 auch funktioniert. Die unter Python 2 angegebene Syntax ist aber mit Python 3 aus der Sprache entfernt worden.
43.1.6 Standardbibliothek
Mit Python 3 wurde auch in der Standardbibliothek gründlich aufgeräumt. Viele Module, die kaum verwendet wurden, sind entfernt worden, andere umbenannt oder mit anderen zu Paketen zusammengefasst. Tabelle 43.8 listet die wichtigsten Module auf, die in Python 3 umbenannt wurden.
Python 2 | Python 3 |
---|---|
ConfigParser | configparser |
cPickle | _pickle |
Queue | queue |
SocketServer | socketserver |
repr | reprlib |
thread | _thread |
Die meisten der oben aufgeführten Module werden in diesem Buch nicht thematisiert, da sie sehr speziell sind. Nähere Informationen zu ihnen finden Sie aber in der Onlinedokumentation von Python.
Neben umbenannten Modulen wurden auch einige thematisch zusammengehörige Module zu Paketen zusammengefasst. Diese sind in Tabelle 43.9 aufgelistet.
Paket in Python 3 | Module aus Python 2 |
---|---|
html | HTMLParser, htmlentitydefs |
http | httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib |
tkinter | abgesehen von turtle alle Module, die etwas mit Tkinter zu tun haben |
urllib | urllib, urllib2, urlparse, robotparse |
xmlrpc | xmlrpclib, DocXMLRPCServer, SimpleXMLRPCServer |
43.1.7 Neue Sprachelemente in Python 3
Mit Python 3 wurde eine Reihe neuer Sprachelemente in die Sprache aufgenommen, die wir in Tabelle 43.10 kurz auflisten möchten. In der zweiten Spalte finden Sie einen Verweis, in welchem Abschnitt dieses Buchs die Neuerung besprochen wird.
Sprachelement | Abschnitt |
---|---|
Literal für Oktal- und Binärzahlen | 12.4.1 |
Literal für Mengen | 15.1 |
nonlocal-Anweisung | 19.3.4 |
Dict- und Set Comprehensions | 23.1 |
with-Anweisung | 24.1 |
Function Annotations | 19.6 |