Seite 1 von 1

Name Error

Verfasst: Donnerstag 13. Februar 2014, 23:05
von Stephan12
hallo,

Beim Durchlauf eines Skripts bekam ich folgenden Fehler:

NameError: global name 'is_Verfallsamstag_aus_timestamp' is not defined

is_Verfallsamstag_aus_timestamp ist eine Funktion, die aufgerufen wurde
und weiter unten im Skript definiert ist.
Müssen die Funktionsdefinitionen vor dem Funktionsaufruf kommen,
damit es keinen Fehler gibt? Ich meinte, das mal ausprobiert zu haben und da gab es mal nen Fehler
und mal nicht. Kann man diesen Fehler sicher vermeiden, ohne Funktionsaufrufe immer unterhalb der Funktionsdefinitionen
zu schreiben? (Voraussetzung immer, dass alles in einem Skript steht)

Re: Name Error

Verfasst: Donnerstag 13. Februar 2014, 23:12
von cofi
Ja, Funktionen (und alles andere auch) muessen immer vor ihrer Benutzung definiert werden. Fuer Funktionen gelten dieselben Lookup-Regeln wie fuer alles andere und die Namen koennen auch jederzeit neu gebunden werden (also stell mal fest was ueberhaupt eine Funktion ist!).

Der uebliche Ansatz ist alles in Funktionen zu kapseln und keinen Toplevel Code zu haben. Oder aber das ifmain Idiom am Ende der Datei, wenn das Skritp ausfuehrbar ist - wenn nicht solltest du dir dreimal ueberlegen ob du ueberhaupt Toplevel Code haben solltest.

Re: Name Error

Verfasst: Freitag 14. Februar 2014, 00:46
von Stephan12
Hallo,
danke für die Info.
Ich teste momentan Funktionen gern Top Level,
bevor ich sie in eine Funktion packe,
weil dann das Fehlerfinden einfacher ist, die Variablen
sind ja alle noch im Speicher.
Wenn alles passt, verpacke ich das erst in die Funktion.
vermutlich gibts da auch noch nen besseren Ansatz zum Entwickeln und Debuggen,
aber ich kenne und beherrsche ihn noch nicht...

Re: Name Error

Verfasst: Freitag 14. Februar 2014, 01:47
von cofi
Das ist darum kein guter Ansatz, weil du etwas anderes testest als du dann spaeter verwendest. Ein Debugger ist ein besserer Ansatz - nicht zum testen, hierfuer gibt es Unittests - zum Debuggen: pdb importieren und `pdb.set_trace()` aufrufen schon hast du eine fast normale interaktive Session und kannst dir alle Werte anschauen.