Funktionsaufruf vor Deklaration

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
Confusia
User
Beiträge: 7
Registriert: Mittwoch 5. Dezember 2007, 11:54

Freitag 27. Februar 2009, 12:07

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
Zuletzt geändert von Confusia am Freitag 27. Februar 2009, 20:32, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Freitag 27. Februar 2009, 12:18

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.
Das Leben ist wie ein Tennisball.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Freitag 27. Februar 2009, 12:26

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
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
Confusia
User
Beiträge: 7
Registriert: Mittwoch 5. Dezember 2007, 11:54

Freitag 27. Februar 2009, 12:52

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.
   ....
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Freitag 27. Februar 2009, 13:06

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
Benutzeravatar
kbr
User
Beiträge: 930
Registriert: Mittwoch 15. Oktober 2008, 09:27

Freitag 27. Februar 2009, 13:20

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:
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Freitag 27. Februar 2009, 13:50

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
Confusia
User
Beiträge: 7
Registriert: Mittwoch 5. Dezember 2007, 11:54

Freitag 27. Februar 2009, 20:31

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
Antworten