我有以下代码,它将从设备获得回复。该值将被比较,“状态”将相应地改变。但是,闭包函数“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"
答案 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)
login
和netcat
都声明了自己的本地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
希望这有帮助!