Name Error

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Stephan12
User
Beiträge: 20
Registriert: Mittwoch 29. Januar 2014, 14:52

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)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Stephan12
User
Beiträge: 20
Registriert: Mittwoch 29. Januar 2014, 14:52

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...
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Antworten