26.02.2014 Aufrufe

LinuxUser Python-CODE, Embedded-Einstieg, Crosscompiling (Vorschau)

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 Ganzzahl­Objekt 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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!