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 |
|
Tabelle 43.1 Entwicklung von Python
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 2Tabelle 43.2 print ist jetzt eine Funktion.
Nähere Informationen, insbesondere zu den Schlüsselwortparametern der Built-in Function print, finden Sie in Abschnitt 19.8, »Eingebaute Funktionen« - 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: ") |
Tabelle 43.3 input vs. raw_input
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)) |
Tabelle 43.4 range gibt jetzt einen Iterator zurück.
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" |
Tabelle 43.5 Strings
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 |
Tabelle 43.6 Integer-Division
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: |
Tabelle 43.7 Exception Handling
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 |
Tabelle 43.8 Umbenannte Module der Standardbibliothek
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 |
Tabelle 43.9 Verschobene Module der Standardbibliothek
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 |
Tabelle 43.10 Neue Sprachelemente