Open Source im professionellen Einsatz
Linux-Magazin 09/2009
© .marqs, Photocase.com

© .marqs, Photocase.com

Umstieg auf Python 3

Im Zeichen der Drei

Mit Python 3.0 hat Sprachschöpfer Guido van Rossum seine Skriptsprache ausgemistet. Nun bringt Python 3.1 noch die Performance in Ordnung. Was muss ein Programmierer beim Umstieg von Python 2.x wissen? Wie und wann portiert er bestehende Skripte auf die neue Sprachversion?

485

Die Python-Version 3.0, auch als Python 3000 oder Py3k bekannt, bricht mit einer alten Tradition: Sie ist nicht abwärtskompatibel. Guido von Rossum, der Erfinder von Python, bringt es auf den Punkt: "Python 3 erhebt nicht den Anspruch, dass unmodifizierter Python-2.6-Code darauf läuft."

Was schon immer störte

Manche Details von Python stören Guido van Rossum bereits seit Anfang des Jahrtausends. Offenbar hat er sich entschlossen die Kompatibilität zu opfern, um diese Stolpersteine auszuräumen. Den Versionssprung nicht so groß werden zu lassen, das ist die Hauptaufgabe von Python 2.6. Viele Features von Python 3.0 wurden nach Python 2.6 rückportiert. Zu der kürzlich erschienenen Python-Release 3.1 wird es entsprechend auch ein Python 2.7 geben. Daneben unterstützt das Kommandozeilentool »2to3« den Programmierer bei der Codemigration von Python 2.x nach 3.x, was dieser Artikel später vorexerziert.

Der offensichtlichste Bruch mit Python 2 ist die syntaktische Veränderung von »print()«. Es mutiert vom Statement zur Funktion und muss daher mit Klammern aufgerufen werden. Der Programmierer ruft Parameter jetzt mit Schlüsselwörtern auf, gemäß dem "The Zen of Python" [1] von Tim Peters: "Explizit ist besser als implizit."

Die neue Syntax von Print ist allgemein »print(*args, sep=\' \', end=\'n\', file=sys.stdout)«, wobei »args« die Argumente, »sep« den Separator zwischen den Argumenten, »end« das Zeilenendzeichen und »file« das Ausgabemedium bezeichnen. Tabelle 1 stellt die syntaktischen Veränderungen der Print-Funktion inklusive ihrer Defaultwerte gegenüber. Der Vorteil der neuen Version offenbart sich aber erst auf den zweiten Blick, denn die Print-Funktion lässt sich jetzt überladen: Listing 1 zeigt eine Print-Funktion, die sowohl in die Standardausgabe als auch in eine Logdatei schreibt. Dazu instrumentalisiert sie die Built-in-Funktion »__builtins__.print«.

Listing 1: Überladen der
Print-Funktion

01 import sys
02 def print(*args,sep='',end="n",file=sys.stdout):
03   __builtins__.print(*args)
04   __builtins__.print(*args,file=open("log.file","a"))

Lob der Faulheit

Nur das Nötigste tun, das ist bei Programmiersprachen durchaus eine Tugend. In Python 3 erhält Lazy Evaluation deutlich mehr Gewicht. Listen, Dictionaries oder die funktionalen Bausteine von Python erzeugen jetzt nicht mehr die gesamte Liste, sondern eben nur noch so viel, wie für die Auswertung des Ausdrucks notwendig ist. Diese Bedarfsauswertung spart kostbaren Speicherplatz und Zeit. Das erreicht der Python-Interpreter dadurch, dass er nur noch einen iterierbaren Kontext zurückgibt, der auf Anfrage die Werte erzeugt. Dies war schon in Python 2 der feine Unterschied zwischen den Funktionen »range()« und »xrange()«. Mit Python 3 verhält sich nun »range()« wie »xrange()«, weshalb die zweite Funktion überflüssig wird.

Entsprechend liegt der Fall bei den funktionalen Bausteinen »map()«, »filter()« und »zip()«. Diese Funktionen wurden durch ihre Äquivalente aus der Bibliothek »itertools« ersetzt. Bei Dictionaries heißen die resultierenden iterierbaren Kontexte Views. Benötigt der Programmierer hingegen die voll expandierte Liste, hilft ein einfaches Kapseln des iterierbaren Kontexts durch einen »list()«-Konstruktor, wie das folgende Beispiel zeigt: »list(range(11))« ergibt »[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]«.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 5 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Countdown zu Python 2.6 und Python 3.0

    Die letzten geplanten Beta-Releases von Python 2.6 und Python 3.0 sind erschienen. Die Python-Entwickler planen die finalen Versionen nach zwei Release Candidates am 1. Oktober zu veröffentlichen.

  • Online-Artikel: Funktionale Programmierung in Python

    Python gilt vielen als objektorientierte Sprache, doch unterstützt es auch andere Paradigmen. Rainer Grimm demonstriert in seinem kostenlosen Online-Artikel das funktionale Programmieren in Python.

  • Alles frisch

    Im September erschien Version 2.5 der Skriptsprache Python. Dieser Artikel verrät, welche Veränderungen die neue Ausgabe bringt und ob sich der Umstieg lohnt.

  • Python 3.4

    Die Entwickler haben Python 3.4 an zahlreichen Ecken optimiert und die Standardbibliothek um einige interessante Module erweitert, findet Python-Experte Mike Müller.

  • Snapshot

    Auf Amazons Lambda-Service laufen selbst geschriebene Python-Skripte in Containerumgebungen – demonstriert im Snapshot am Beispiel eines AI-Programms zur Bewegungsanalyse in Überwachungsvideos.

comments powered by Disqus

Ausgabe 10/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.