Open Source im professionellen Einsatz

Neues in Python 2.5

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 hat sich in der Rangliste der beliebtesten Skriptsprachen still und leise nach vorn gearbeitet. Bei Ubuntu ist es neben C die offizielle Entwicklungssprache, auch bei Red Hat gilt Python als Standard zum Skripten. Gründe dafür sind sicherlich die hohe Stabilität der Releases und die große Rückwärtskompatibilität. Die Entwicklung, immer noch gesteuert von Python-Erfinder Guido van Rossum, vollzieht sich vorwiegend evolutionär, nur gelegentlich gibt es größere Änderungen am Sprachkern.

Die letzte größere Python-Release ist mit Version 2.4 beinahe zwei Jahre alt. Jetzt ist mit Python 2.5 eine neue Ausgabe mit interessanten Neuerungen erschienen, von kleineren über größere Spracherweiterungen bis hin zu neuen Modulen [1].

Neue Bedingung

Für die einen leicht entbehrlich, von anderen lange vermisst, hat Python nun auch einen Bedingungsausdruck, ähnlich dem C-Idiom »Bedingung ? Falls_wahr : Falls_falsch«. In Python schreibt sich das Konstrukt so: »Falls_wahr if Bedingung else Falls_falsch«. Der Ausdruck, der im Fall einer wahren Bedingung zu ermitteln ist, steht also vor der Bedingung. Das folgende Beispiel bildet die eingebaute Funktion »max« für zwei Werte a und b nach:

maximum = (a if a > b else b)

Die Klammern sind nur optional, sie machen die Anweisung aber leichter verständlich.

Manche Programmierer finden, dass der ternäre Ausdruck generell überflüssig sei, da er sich auch anders ausdrücken lässt. Zum Beispiel funktioniert statt des obigen Code auch »maximum = (b, a)[a > b]«. Sind »a« und »b« allerdings Ausdrücke, wertet der Interpreter im Gegensatz zum neuen Konstrukt immer beide aus, was zu unerwarteten Seiteneffekten führen kann. Laut [2] kam der ternäre Operator vor allem deshalb hinzu, weil viele Programmierer bei seiner Nachbildung so oft Fehler machen.

Schon seit langem gibt es in Python »try ... except ... else« zur Ausnahmebehandlung sowie »try ... finally« für das sichere Aufräumen, zum Beispiel das Schließen einer Datei. Oft treten beide Varianten kombiniert auf, zum Beispiel um beim Lesen einer Datei unterschiedliche Exceptions abzufangen (Listing 1). Python 2.5 führt eine kompaktere Schreibweise ein, die verschachtelte Try-Anweisungen erspart (Listing 2).

Listing 1: Verschachtelte
Try-Anweisung

01 datei = open("zahlen.dat")
02 try:
03     try:
04         zahlen = [int(zeile) for zeile in datei]
05     except ValueError:
06         print "Nicht alle Zeilen sind Zahlen."
07     else:
08         print "Alle Zeilen erfolgreich eingelesen."
09 finally:
10     datei.close()

Listing 2: Kombinierte
Try-Anweisung

01 datei = open("zahlen.dat")
02 try:
03     zahlen = [int(zeile) for zeile in datei]
04 except ValueError:
05     print "Nicht alle Zeilen enthalten Zahlen."
06 else:
07     print "Alle Zeilen erfolgreich eingelesen."
08 finally:
09     datei.close()

Heimlich aufräumen

Wie bereits angesprochen, dient »try ... finally« zum Aufräumen von Ressourcen, zum Beispiel dem Freigeben von Locks. Die neue »with«-Anweisung [3] hilft dabei, oft wiederkehrende Aufräumarbeiten zu verstecken (Listing 3). Den logischen Ablauf zeigt das UML-Diagramm in Abbildung 1.

Abbildung 1: Die neue With-Anweisung in Python 2.5 nimmt dem Programmierer manuelle Aufräumarbeiten ab: Am Ende eines entsprechenden Blocks (»__exit__«) schließt der Interpreter beispielsweise offene Dateien.

Abbildung 1: Die neue With-Anweisung in Python 2.5 nimmt dem Programmierer manuelle Aufräumarbeiten ab: Am Ende eines entsprechenden Blocks (»__exit__«) schließt der Interpreter beispielsweise offene Dateien.

Listing 3:
»with«-Anweisung

01 from __future__ import with_statement
02 
03 with open("zahlen.dat") as datei:
04     try:
05         zahlen = [int(zeile) for zeile in datei]
06     except ValueError:
07         print "Nicht alle Zeilen enthalten Zahlen."
08     else:
09         print "Alle Zeilen erfolgreich eingelesen."

Wie bei »try ... finally« schließt Python die Datei nach dem »with«-Block, egal ob ein Fehler auftrat oder nicht. Objekte, die nach dem »with«-Schlüsselwort folgen, müssen das so genannte Kontextmanager-Protokoll unterstützen. Standardmäßig trifft dies auf Datei- und verschiedene Lock-Objekte aus dem »threading«-Modul zu.

Eigene Kontextmanager lassen sich mit einer Klasse erstellen, die über die speziellen Methoden »__enter__« und »__exit__« verfügt. In einfacheren Fällen hilft das »contextlib«-Modul bei der Erzeugung eines Kontextmanagers.

Diesen Artikel als PDF kaufen

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook