Die Tage sind gezählt: End of Life für Python 2

Python 3: Die neuen Features

Freilich birgt die Migration von Python 2 nach Python 3 Fallstricke und Schwächen. Im Rahmen der Portierung sollten Entwickler sich mit den neuen Features von Python 3 vertraut machen.

print ist mit Python 3 eine Funktion. Die neue Syntax ist allgemein folgende:

print(*args, sep = " ", 
end = "\n",
file = sys.stdout,
flush = True)

Dabei bezeichnet args die Argumente, sep den dazwischen liegenden Separator, end das Zeilenendzeichen, file das Ausgabemedium und flush den Puffer. Die folgende Tabelle stellt die syntaktischen Veränderungen der print-Funktion inklusive ihrer Standardwerte gegenüber.

Folgende Tabelle zeigt die Unterschiede für print in Python 2 und Python 3:

Beispiel Python 2.x Python 3.x
Allgemeine Form print "x= ", 5 print("x= ", 5)
Zeilenumbruch print print()
Unterdürcken des Zeilenumbruchs print x, print(x, end="")
Unterdrücken des Zeilenumbruchs ohne Leerzeichen print(1, 2, 3, 4, 5, sep = "")
Umleitung der Ausgabe print >> sys.stderr, "error" print("error", file = sys.stderr)

Der Vorteil der neuen Version offenbart sich aber erst auf den zweiten Blick, denn die print-Funktion lässt sich neuerdings überladen: Das Listing zeigt eine print-Funktion, die sowohl in die Standardausgabe als auch in eine Logdatei schreibt. Dazu instrumentalisiert sie die Built-in-Funktion __builtins__.print.

import sys 

def print(*args, sep = " ", end = "\n",
file = sys.stdout, flush = True):
__builtins__.print(*args, sep = sep, end = end,
file = file, flush = flush)
__builtins__.print(*args, sep = sep, end = end,
file = open("log.txt", "a"))

Der größte Unterschied von Python 2 zu Python 3 findet sich in den Strings. Mussten Programmierer in Python 2 Strings noch explizit als Unicode deklarieren (u"unicode string"), bestehen Strings in Python 3 automatisch aus Unicode-Zeichen ("unicode string"). Python 3 kennt Text und (binäre) Daten anstelle von Unicode-Strings und 8-Bit Strings. Binäre Daten werden in Python 3 explizit durch "binary data" definiert. Text ist Unicode, enkodierter Unicode steht hingegen für binäre Daten. Der Datentyp, der Text beinhaltet, ist "str", der Datentyp, der Daten beinhaltet ist "bytes".

Die genauen Details zu Strings in Python 2 und Python 3 lassen sich im Unicode-How-to nachlesen.

Um Datentypen zu konvertieren, existieren die Funktionen str.encode() und bytes.decode(). Die Umwandlung benötigen Entwickler in Python 3, wenn sie beide Datentypen verwenden, da keine implizite Typkonvertierung mehr stattfindet.

Umwandlung von Text zu Daten (Abb. 4)

Mit sogenannten Function Annotations lassen sich in Python 3 die Metadaten an eine Funktion binden. Letztere lässt sich im zweiten Schritt zusätzlich mit Dekoratoren versehen, die automatisch aus den Metadaten eine Dokumentation erzeugen oder die Typen zur Laufzeit prüfen. Die äquivalenten Funktionen sumOrig() und sumMeta() zeigen die Funktionsdeklaration mit und ohne Metadaten. Letztere finden sich in der zweiten Funktion zur Signatur und zum Rückgabewert. Die Metadaten lassen sich mit dem Funktionsattribut __annotations__ referenzieren.