Hallo Leute,
ist es in Python mit einem bestimmten Befehl möglich eine Funktion aufzurufen, wenn sie erst weiter unten definiert ist? Ich habe bisher noch nichts dazu gefunden.
Schonmal Danke
Confusia
Funktionsaufruf vor Deklaration
- b.esser-wisser
- User
- Beiträge: 272
- Registriert: Freitag 20. Februar 2009, 14:21
- Wohnort: Bundeshauptstadt B.
Die antwort lautet: naja
Damit eine Funktion aufgerufen werden kann, muss sie vorher definiert werden, allerdings bezieht sich das "vorher" auf den Programmvablauf:
Wahrscheinlich löst dieser "Trick" die meisten Probleme:
</klugscheiß>
Jörg
Damit eine Funktion aufgerufen werden kann, muss sie vorher definiert werden, allerdings bezieht sich das "vorher" auf den Programmvablauf:
Code: Alles auswählen
#geht:
def foo():
bar()
def bar():
print "barf"
foo()# ab hier sind alle Funktionen definiert,
# aber rein "text-mäßig", wurde bar aufgerufen bevor es definiert wurde ;)
Code: Alles auswählen
#Geht nicht:
def foo():
bar()
foo()
def bar():
print "barf"
Code: Alles auswählen
#letzte Zeile in einem Programm:
if __name__=="__main__": main()
#main ist eine Funktion die "weiter oben" definiert (oder importiert etc.) wurde
Jörg
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
ok, also was ich will ist folgendes:
ich hab ein Script mit einer GUI erstellt (für Blender) und damit mein Code etwas übersichtlicher ist, habe ich die Variablen, die ich global für die Interaktion meiner GUI brauche, in bestimmte Funktionen getan, und rufe diese Funktionen immer direkt gleich auf. (brauche ja die globalen Variablen darin)
Wenn nun jemand mein Code liest, interessiert ihn nur das wesentliche an meiner GUI (ist ja logisch) und damit es übersichtlicher ist, wäre es praktisch, wenn oben im code, nur die Funktionsaufrufe stehen, danach die Funktionen für die GUI usw. und unten halt das unwesentliche. (war das verständlich)?
Vielleicht gibts da ja auch Alternativen für. Ich weiß, dass meine Herangehenesweise sowieso nicht so ganz "sauber" ist, aber ich bin quasi Programmieranfänger.
@Jörg dein letztes Beispiel habe ich nicht ganz verstanden, bzw. damit kenn ich mich nicht aus, was genau müsste ich machen?
Confusia
Veranschaulichung:
ich hab ein Script mit einer GUI erstellt (für Blender) und damit mein Code etwas übersichtlicher ist, habe ich die Variablen, die ich global für die Interaktion meiner GUI brauche, in bestimmte Funktionen getan, und rufe diese Funktionen immer direkt gleich auf. (brauche ja die globalen Variablen darin)
Wenn nun jemand mein Code liest, interessiert ihn nur das wesentliche an meiner GUI (ist ja logisch) und damit es übersichtlicher ist, wäre es praktisch, wenn oben im code, nur die Funktionsaufrufe stehen, danach die Funktionen für die GUI usw. und unten halt das unwesentliche. (war das verständlich)?
Vielleicht gibts da ja auch Alternativen für. Ich weiß, dass meine Herangehenesweise sowieso nicht so ganz "sauber" ist, aber ich bin quasi Programmieranfänger.
@Jörg dein letztes Beispiel habe ich nicht ganz verstanden, bzw. damit kenn ich mich nicht aus, was genau müsste ich machen?
Confusia
Veranschaulichung:
Code: Alles auswählen
GUI_Daten_Erstellen()
def gui():
...
def event(evt,val):
...
def bevent(val):
...
def GUI_Daten_Erstellen(): #definition von eventnumbern usw.
....
Was er meint ist folgendes:
Die Zeile "if __name__ == "__main__":" sollte in Deinem Haupt- Skript/Modul stehen. Näheres findest Du hier.
HTH
Christian
Code: Alles auswählen
def gui():
...
def event(evt,val):
...
def bevent(val):
...
def GUI_Daten_Erstellen():
pass
if __name__ == "__main__":
GUI_Daten_Erstellen() # ist jetzt definiert.
HTH
Christian
Setze den Aufruf "GUI_Daten_erstellen()" an das Ende vom Code, dann geht es einwandfrei. Eigentlich bietet sich für Deine Aufgabenstellung eine Klasse an: die Funktionen wie "event()" implementierst Du dort als Methoden und die bisherigen globalen Variablen, legst Du als Instanz-Variable bei Initialisierung an: also in " __init__(self): ...". Dann hast Du alles schön gekapselt (>>> import this: Namespaces are one honking great idea -- let's do more of those!).Confusia hat geschrieben:Code: Alles auswählen
GUI_Daten_Erstellen() def gui(): ... def event(evt,val): ... def bevent(val): ... def GUI_Daten_Erstellen(): #definition von eventnumbern usw. ....
Ja, schon. Und wenn man es ganz genau nimmt kann man auch an meiner Erklärung etwas aussetzen. Doch besser ist es den Programmfluß klar von den Funktionsdeklarationen abzugrenzen und die Ausführung einzuschränken. Das nur für das Hauptskript eines Paketes zu machen, wie von mir gesagt, ist eigentlich Quatsch: Das sollte man sich (fast) überall angewöhnen - siehe auch die verlinkte Seite für die Möglichkeiten. Na ja, so weit wie Guido himself treibe ich es meist nicht, aber die Möglichkeit in Verschiedenen Modulen Testcode einzuführen, der nicht bei jedem Import ausgeführt wird ist schon weitverbreitet und gerne genutzt - mit gutem Grund.kbr hat geschrieben:Setze den Aufruf "GUI_Daten_erstellen()" an das Ende vom Code, dann geht es einwandfrei.
/besserwissermodus: aus/
Im Grunde kann man hier vom hundersten ins tausendste kommen. Egal. Ich hoffe mein Punkt kam rüber.
HTH
Christian