2017-11-28 2 views
-2

Ich habe eine Python websocket Client-CodeFehler: Die lokale Variable vor der Zuweisung referenziert in Python

run_once1 = True 
run_once2 = False 

def on_message(ws, message): 

    if 'Temp' in message: 
     if run_once1 is True: 
      #Run this code once 
      print("Temp is present") 
      run_once1 = False 
      run_once2 = True 

    else: 
     if run_once2 is True: 
      #Run this code once 
      print("Temp is not present")  
      run_once1 = True 
      run_once2 = False  

def on_error(ws, error): 
    print(error) 

def on_close(ws): 
    print("CLOSE ") 

def on_open(ws): 
    print("OPEN") 
    msg = "<MESSAGE>" 
    ws.send(msg) 

ws = websocket.WebSocketApp(URL, on_message= on_message, on_error=on_error, on_close=on_close) 
ws.on_open = on_open 
ws.run_forever() 

So in dem obigen Code, öffne ich eine websocket und dann, wenn ich eine neue Nachricht erhalten, wird on_message() Funktion aufgerufen . Innerhalb dieser Funktion suche ich nach dem Tag Temp in der Nachricht. Wenn es vorhanden ist, möchte ich nur das drucken und es einmal ausführen. Als nächstes, wenn nicht vorhanden ist, möchte ich es drucken und diesen Code auch nur einmal ausführen. Aber der obige Code gibt Fehler:

error from callback <function on_message at 0x000001D35366D840>: local variable 'run_once1' referenced before assignment

error from callback <function on_message at 0x000001D35366D840>: local variable 'run_once2' referenced before assignment

Wo soll ich diese Variable schreiben, so dass es mir nicht diesen Fehler.

Dank

Antwort

1

Um eine globale Variable innerhalb einer Funktion können Sie es als global in dieser Funktion deklarieren müssen zuweisen. Zum Beispiel:

def on_message(ws, message): 
    global run_once1 
    global run_once2 

    # remainder of function as before 
0

Die Variable wird außerhalb des Geltungsbereichs Ihrer Funktion deklariert. Ihre Funktion sieht Ihre Variablen nicht, die außerhalb ihrer Einrückung deklariert sind (noch innerhalb der Funktion deklarierte Variablen ändern die Werte von gleichnamigen Variablen außerhalb.

Was Sie tun müssen, ist diese Variablen als Funktion übergeben Argumente, zum Beispiel:

run_once1 = True 
run_once2 = False 

def on_message(ws, message, run_once1, run_once2): 

    if 'Temp' in message: 
     if run_once1 is True: 
      #Run this code once 
      print("Temp is present") 
      run_once1 = False 
      run_once2 = True 

    else: 
     if run_once2 is True: 
      #Run this code once 
      print("Temp is not present")  
      run_once1 = True 
      run_once2 = False  
    return run_once1, run_once2 

run_once1, run_once2 = on_message (ws, message, run_once1=run_once1, run_once2=run_once2 

in Ihrem Fall jedoch wird es nicht funktionieren, da Sie direkten Aufruf dieser Funktion haben wollen, dann den Zustand zu erhalten, würde ich ‚ON_MESSAGE‘ als Klasse schreiben.

class OnMessage(): 
    def __init__(self): 
     self.run_once1 = True 
     self.run_once2 = False 

    def __call__(self, ws, message): 
     if 'Temp' in message: 
      if self.run_once1 is True: 
       #Run this code once 
       print("Temp is present") 
       self.run_once1 = False 
       self.run_once2 = True 

     else: 
      if self.run_once2 is True: 
       #Run this code once 
       print("Temp is not present")  
       self.run_once1 = True 
       self.run_once2 = False 

on_message = OnMessage() 

def on_error(ws, error): 
    print(error) 

def on_close(ws): 
    print("CLOSE ") 

def on_open(ws): 
    print("OPEN") 
    msg = "<MESSAGE>" 
    ws.send(msg) 

ws = websocket.WebSocketApp(URL, on_message= on_message, on_error=on_error, on_close=on_close) 
ws.on_open = on_open 
ws.run_forever() 
Verwandte Themen