Abfrage von Werten aus unterschiedlichen Funktionen

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
seavers
User
Beiträge: 11
Registriert: Donnerstag 31. Juli 2014, 11:46

Hallo ihr fleißigen Python Programmierer.

1. Ich habe die Funktion mit der ich eine Verbindung zum Experimentator herstelle und frage welches Tier als nächstes dran ist.

Code: Alles auswählen

def ExContConn():
    #Verbindung zum Experimentator
    ExContr=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    ExContr.connect(('134.106.250.134', 12345))
    new_Animal=ExContr.recv(1024)
    #print new_Animal
später versuche ich das new_Animal abzufragen,

Code: Alles auswählen

def new_AnimalvomExContr():
    #global new_Animal
    global FetchTimeAlex
    global FetchTimeWendy
    global fetching_time
    fetching_time=datetime.datetime.now()
    #Tiere werden ueber WR zum TK gefuehrt
    if new_Animal[0:10]=="fetch Alex":
        print "jungs zum WR"
        FetchTimeAlex=time.time()
        JungszumWR()
    elif new_Animal[0:11]=="fetch Wendy":
        print "Madels zum WR"
        FetchTimeWendy=time.time()
        MaedelszumWR()
dabei bekomme ich aber immer eine Fehlermeldung:

if new_Animal[0:10]=="fetch Alex": NameError: global name 'new_Animal' is not defined

Was kann ich machen um einen Wert einer Funktion in einer anderen Abzurufen? ExContConn.new_Animal funktioniert nicht.

2. Problem: gleiche Funktion wie ganz oben.
Was muss ich machen um in einer anderen Funktion um z.B. ExContr.send() oder ExContr.recv() nutzen zu können?

Wie ihr seht habe ich eine sehr einfache Programmierung und wahrscheinlich auch nicht sauber. Das liegt wohl daran, dass ich kein Programmierer bin und das ganze nur Mittel zum Zweck ist. Ich habe mir schon einige Threads zu ähnlichen Fragen durchgelesen, steige aber durch die Antworten nicht ganz durch. Am einfachsten scheint es zu sein eine Klasse dafür zu erstellen, letzten Endes komme ich dabei aber wieder zu derselben Frage: Wie bekomme ich einen Wert z.B. new_Animal in eine andere Funktion. Für konkrete Hilfe wäre ich also Dankbar.

Gruß
Dajo
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du kannst nicht auf lokale Variablen in anderen Funktionen zugreifen. Die existieren nicht mehr, wenn die Funktion verlassen wird. Am besten vergisst du bei der Gelegenheit ganz schnell, dass es "global" überhaupt gibt. Wenn du glaubst es zu brauchen, dann brauchst du es nicht. Ganz allgemein gilt: Werte betreten Funktionen über Parameter und verlassen sie über den Rückgabewert. Das ist auch die Lösung für dein Problem.

Das recv garantiert übrigens nur, dass mindestens ein Byte angekommen ist. Es kann aber auch eine halbe Nachricht ankommen, es können zwei Nachrichten ankommen, es können aber auch 7,3 Nachrichten ankommen. Wenn du sicher sein willst, dass eine Nachricht vollständig übertragen wurde, dann musst du ein entsprechendes Protokoll dafür implementieren. Wie das nun aussieht, dass musst du selber entscheiden.

Und bitte lies dir PEP 8 durch und halte dich daran.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

EyDu hat geschrieben:Ganz allgemein gilt: Werte betreten Funktionen über Parameter und verlassen sie über den Rückgabewert. Das ist auch die Lösung für dein Problem.
Das Zauberwort lautet return

Code: Alles auswählen

def meine_funktion(meine_eingabe):
  meine_ausgabe = meine_eingabe * 2
  # anderer code hier
  return meine_ausgabe

neuer_wert = meine_funktion(23)
print neuer_wert
Damit kann man die Rückgabewerte dann weiter benutzen, an andere Funktionen weiter geben, usw.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Antworten