Seite 1 von 1

Funktionsaufruf vor Deklaration

Verfasst: Freitag 27. Februar 2009, 12:07
von Confusia
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

Verfasst: Freitag 27. Februar 2009, 12:18
von EyDu
Da könnte man etwas zusammenschreiben. Vielleicht verrätst du uns, was genau du vor hast, da gibt es sicherlich eine schönere Lösung.

Verfasst: Freitag 27. Februar 2009, 12:26
von b.esser-wisser
Die antwort lautet: naja ;)
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"
Wahrscheinlich löst dieser "Trick" die meisten Probleme:

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
</klugscheiß>
;) Jörg

Verfasst: Freitag 27. Februar 2009, 12:52
von Confusia
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:

Code: Alles auswählen


GUI_Daten_Erstellen()

def gui():
   ...

def event(evt,val):
   ...

def bevent(val):
   ...

def GUI_Daten_Erstellen(): #definition von eventnumbern usw.
   ....

Verfasst: Freitag 27. Februar 2009, 13:06
von CM
Was er meint ist folgendes:

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.
Die Zeile "if __name__ == "__main__":" sollte in Deinem Haupt- Skript/Modul stehen. Näheres findest Du hier.

HTH
Christian

Verfasst: Freitag 27. Februar 2009, 13:20
von kbr
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.
   ....
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!). :wink:

Verfasst: Freitag 27. Februar 2009, 13:50
von CM
kbr hat geschrieben:Setze den Aufruf "GUI_Daten_erstellen()" an das Ende vom Code, dann geht es einwandfrei.
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.

/besserwissermodus: aus/
Im Grunde kann man hier vom hundersten ins tausendste kommen. Egal. Ich hoffe mein Punkt kam rüber.

HTH
Christian

Verfasst: Freitag 27. Februar 2009, 20:31
von Confusia
danke für eure Hilfe, ich werde das mal ausprobieren und mir mal zu Herzen nehmen, dass ich mich endlich an Klassen rantraue -.-

Viele Grüße
Confusia