Python无法从函数中传递值

时间:2014-01-15 06:40:39

标签: python variables

我有以下代码,它将从设备获得回复。该值将被比较,“状态”将相应地改变。但是,闭包函数“netcat”中的“state”无法传递给“login”函数。我试图将它设置为全局变量,但它不起作用或可能是我不知道正确的方式来声明它。无论终端实际上​​显示“用户”作为状态,它最终都会显示“lala”。我该怎么解决这个问题?

@cherrypy.expose
def login (self, **data):
    passcode = data.get("passcode", None)
    print "logging in using passcode %s"%passcode ,type(passcode)

    import socket
    import time
    state="lala"
    def netcat(content):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect(('10.0.0.27', 1001))
        s.sendall(content)
        time.sleep(0.5)
        s.shutdown(socket.SHUT_WR)

        while 1:
            data = s.recv(1024)
            if data == "":
                break
            print "Received:", repr(data)
            data1= repr(data)
        print data1
        if "LU" in data1:
            if not "00" in data1:
                if "FE" in data1:
                    state="engineer"
                else: 
                    state="user"
            else:
                    state="none"
        else:
            state="unknown"
        print state
        time.sleep(1)
        return state #this will show the right value
        print "Connection closed."
        s.close()

    netcat ("\x03LI%s\x0D"%passcode)
    return state #this will always show "lala"

3 个答案:

答案 0 :(得分:1)

在netcat和login的定义开始时(感谢mhlester),请包含以下行:

global state

否则,state被视为局部变量,一旦netcat完成,其值将被忽略/销毁。

或者,可能更好,您可以用以下代码替换倒数第二行:

state = netcat ("\x03LI%s\x0D"%passcode)

这是有效的,因为netcat的返回值为state(netcat以“返回状态”行结束)。

在评论中,Petr Joachim指出了这个代码的另一个问题:

    return state #this will show the right value
    print "Connection closed."
    s.close()

在return语句之后,netcat函数中没有任何内容被执行。如果要关闭s,则需要重新排序:

    print "Connection closed."
    s.close()
    return state #this will show the right value

答案 1 :(得分:1)

loginnetcat都声明了自己的本地state。你需要添加

global state

这些功能的两者的开头。

您当前return州,但不会存储在任何地方。而是你设置它,但目前只在本地。

答案 2 :(得分:1)

我建议你不要使用全局变量来使用netcat的返回值:

state = netcat ("\x03LI%s\x0D"%passcode)

使用全局变量通常会导致混淆哪个函数更改变量。这更清晰,更容易阅读。

此外,当您使用return语句时,该函数退出。所以s.close()不会被调用。将return放在函数末尾:

s.close()
print "Connection closed."
return state #this will show the right value

希望这有帮助!