Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Robuste <strong>Python</strong>-Programme<br />
schwerpunkt<br />
einen Tabulator, den der Editor<br />
mit vier Zeichen Breite darstellt.<br />
Auf den ersten Blick scheint <strong>Python</strong><br />
die Anweisung b = h(b) auf<br />
jeden Fall auszuführen. Da ein Tabulatorzeichen<br />
aber acht Leerzeichen<br />
entspricht, bearbeitet der<br />
Interpreter diese Zeile wie die<br />
vorherige, aber nur im Fall a > b.<br />
Glück im Unglück: Das Mischen<br />
von Leerzeichen und Tabulatoren<br />
führt eher zu Syntaxfehlern als<br />
zu falsch funktionierendem Code.<br />
Ein Beispiel zeigt Listing 2. Hier<br />
ist aus Sicht von <strong>Python</strong> das<br />
Schlüsselwort else genauso weit<br />
eingerückt wie die Zuweisungen<br />
an a und b – ein Syntaxfehler.<br />
Um die potenzielle Verwirrung<br />
durch einen Mix von Leerzeichen<br />
und Tabulatoren von vornherein<br />
zu vermeiden, lassen Sie den Editor<br />
auch bei Drücken der Tabulatortaste<br />
immer mit vier Stellen<br />
pro logischer Ebene einrücken.<br />
Natürlich wären auch andere Regeln<br />
denkbar, aber vier Leerzeichen<br />
sind wie gesagt die im „Style<br />
Guide“ empfohlene Variante und<br />
daher in den allermeisten <strong>Python</strong><br />
Projekten üblich.<br />
Haben Sie Code im Verdacht, inkonsistent<br />
eingerückt zu sein, machen<br />
Sie mittels des Kommandos<br />
$ find . -name "*.py" -exec grepU<br />
-EnH "\t" {} \;<br />
alle <strong>Python</strong>Dateien im und unterhalb<br />
des aktuellen Verzeichnisses<br />
ausfindig, die Tabulatoren enthalten.<br />
Geht es nur um wenige Dateien,<br />
ist es praktikabel, im Editor<br />
Tabulatorzeichen explizit anzuzeigen.<br />
In Vim geht das mit dem Befehl<br />
:set list (Abbildung ). Viele<br />
Programmiereditoren bieten<br />
ähnliche Möglichkeiten.<br />
Objekte und Namen:<br />
Who is who?<br />
In <strong>Python</strong> gibt es keine Variablen<br />
wie bei C oder Pascal, die einen<br />
bestimmten Speicherbereich<br />
kennzeichnen. Die <strong>Python</strong>Zuweisung<br />
a = 1 verknüpft lediglich<br />
das GanzzahlObjekt 1 mit dem<br />
Namen a. Ein und dasselbe Objekt<br />
lässt sich prinzipiell unter beliebig<br />
vielen Namen erreichen. Es<br />
gibt auch anonyme (namenlose)<br />
Objekte, wie die Zahl 2 in der Anweisung<br />
L = [1, 2, 3].<br />
Wichtig zum Verständnis von<br />
<strong>Python</strong> sind die Konzepte der<br />
Identität und der Gleichheit.<br />
Identität bedeutet, dass es sich<br />
um ein und dasselbe Objekt handelt,<br />
während Gleichheit zweier<br />
Objekte aussagt, dass diese den<br />
gleichen Wert haben. Ob zwei Objekte<br />
identisch sind, stellen Sie<br />
mithilfe des Operators is fest<br />
(Listing 3).<br />
Für von Ihnen definierte Datentypen<br />
legen Sie selbst fest, wie<br />
Gleichheit zwischen deren Instanzen<br />
definiert ist. Wie Listing 4 auf<br />
der nächsten Seite verdeutlicht,<br />
könnten Sie auf diese Weise sogar<br />
dafür sorgen, dass zwei Objekte<br />
zwar identisch, aber dennoch ungleich<br />
sind!<br />
In <strong>Python</strong>Code bedeutet der<br />
Wert None üblicherweise, dass ein<br />
Name keinen „richtigen“ Wert<br />
hat, zum Beispiel weil er bisher<br />
nicht explizit initialisiert wurde.<br />
Prüfungen eines Namens auf None<br />
sollten Sie immer mit is vornehmen,<br />
nicht mit ==. Analog zu Listing<br />
4 kann eine Klasse ja den Vergleichsoperator<br />
so definieren, dass<br />
alle Vergleiche einen wahren Wert<br />
liefern (Listing 5, nächste Seite).<br />
Nur die Operation in der letzten<br />
Zeile des Listings, die is verwendet,<br />
funktioniert zuverlässig.<br />
Wie schon erwähnt, führt eine<br />
Zuweisung nur zur Verknüpfung<br />
von Namen und Objekten. Objekte<br />
werden dabei nicht kopiert.<br />
Das erklärt auch das Ergebnis in<br />
Listing 6 (nächste Seite), das bei<br />
<strong>Python</strong>Einsteigern immer wieder<br />
für Überraschungen sorgt.<br />
Die erste Zuweisung erzeugt<br />
eine Liste mit den Elementen 1<br />
und 2, die zweite Zuweisung gibt<br />
der derart erzeugten Liste einen<br />
zweiten Namen L2. L1 und L2 stehen<br />
nun für ein und dasselbe<br />
Objekt. Die dritte Anweisung<br />
hängt die Zahl 3 ans Ende der Liste.<br />
Da L2 nur ein anderer Name<br />
für dieselbe Liste ist, bekommen<br />
Sie bei der Ausgabe von L1 und L2<br />
auch ein identisches Ergebnis.<br />
Die letzte Zeile bestätigt das vorher<br />
Gesagte: L1 und L2 bezeichnen<br />
ein und dieselbe Liste.<br />
Objektverknüpfungen können<br />
natürlich auch komplexer ausfallen.<br />
So greifen Sie nach den ersten<br />
drei Anweisungen in Listing 7<br />
(nächste Seite) auf die erzeugte<br />
Liste sowohl unter dem zuerst<br />
vergebenen Namen L als auch<br />
über das Tupel t zu.<br />
Unveränderliche und<br />
veränderliche Objekte<br />
Die Veränderbarkeit von Objekten<br />
stellt ein wichtiges Konzept<br />
von <strong>Python</strong> dar. Erst wenn man<br />
es verstanden hat, ergeben vermeintlich<br />
seltsame Verhaltensweisen<br />
von <strong>Python</strong> einen Sinn.<br />
Sogenannte unveränderliche<br />
Objekte wie zum Beispiel Zahlen<br />
oder Zeichenketten kann man –<br />
wie der Begriff schon sagt – nicht<br />
verändern. Mitunter entsteht je<br />
Zwei Ansichten der<br />
gleichen fehlerhaften<br />
Datei in Vim, oben<br />
ohne, unten mit gesetzter<br />
list-Option.<br />
Diese macht Tabulator-<br />
und Zeilenende-<br />
Zeichen sichtbar.<br />
gLossar<br />
Traceback: Folge der<br />
Funktionsaufrufe bis<br />
zum Auftreten eines<br />
Fehlers. <strong>Python</strong> gibt<br />
die se Aufruf-Folge, auch<br />
Stacktrace genannt, bei<br />
bestimmten Fehlern<br />
aus. Diese Ausgabe hilft<br />
oft sehr bei der Eingrenzung<br />
der Fehlerursache.<br />
x = 1.0<br />
y = x # Das Objekt 1.0 mit dem Namen x ist<br />
# jetzt auch über den Namen y erreichbar.<br />
print x is y # True<br />
print x == y # True<br />
y = 1<br />
print x is y # False<br />
print x == y # True, 1.0 bezeichnet den gleichen<br />
# Wert wie 1<br />
Listing 3<br />
www.linux-user.de<br />
02 | 11 29