Python Syntaxerror: (" 'return' mit dem Argument innerhalb Generator")

2013-04-04 4 views
16

Ich habe diese Funktion in meinem Python-Programm:Python Syntaxerror: (" 'return' mit dem Argument innerhalb Generator")

@tornado.gen.engine 
def check_status_changes(netid, sensid):   
    como_url = "".join(['http://131.114.52:44444/ztc?netid=', str(netid), '&sensid=', str(sensid), '&start=-5s&end=-1s']) 

    http_client = AsyncHTTPClient() 
    response = yield tornado.gen.Task(http_client.fetch, como_url) 

    if response.error: 
      self.error("Error while retrieving the status") 
      self.finish() 
      return error 

    for line in response.body.split("\n"): 
       if line != "": 
        #net = int(line.split(" ")[1]) 
        #sens = int(line.split(" ")[2]) 
        #stype = int(line.split(" ")[3]) 
        value = int(line.split(" ")[4]) 
        print value 
        return value 

Ich weiß, dass

for line in response.body.split 

ein Generator ist. Aber ich würde die value-Variable an den Handler zurückgeben, der die Funktion aufgerufen hat. Das ist möglich? Wie kann ich?

+0

'Ausbeutewert'. – katrielalex

+0

Bereits versucht .. aber ich bekomme den gleichen Fehler ... Ich denke, es ist unmöglich, eine Rückkehr in einen Generator zu setzen ... – sharkbait

+9

Die 'for' Schleife ist kein Generator; Die ganze Funktion ist, weil Sie eine 'Yield'-Anweisung darin haben. – geoffspear

Antwort

23

Sie können return nicht mit einem Wert verwenden, um einen Generator zu verlassen. Sie benötigen yield plus ein returnohne einen Ausdruck zu verwenden:

if response.error: 
    self.error("Error while retrieving the status") 
    self.finish() 
    yield error 
    return 

In der Schleife selbst verwenden yield wieder:

for line in response.body.split("\n"): 
    if line != "": 
     #net = int(line.split(" ")[1]) 
     #sens = int(line.split(" ")[2]) 
     #stype = int(line.split(" ")[3]) 
     value = int(line.split(" ")[4]) 
     print value 
     yield value 
     return 

Alternativen sind eine Ausnahme zu erhöhen oder stattdessen Rückrufe verwenden Tornado.

+0

Großartig! Ich dachte, der Fehler bestünde in 'Rückgabewert' – sharkbait

Verwandte Themen