2014-01-15 47 views
0

我使用的代码如下,它将从设备获取答复。该值将被比较,并且“状态”将相应地改变。但是,闭包函数“netcat”中的“状态”无法传递给“登录”功能。我试图将其设置为全局变量,但它不起作用,或者可能是我不知道正确的方式来声明它。无论终端实际显示“用户”状态如何,它最终总是显示“lala”。我应该如何解决这个问题?Python不能从函数中传递值

@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" 
+1

'return netcat(“\ x03LI%s \ x0D”%passcode)' –

回答

1

在的netcat的和登录(感谢mhlester)的定义开始,包括行:

​​

否则,state被视为本地变量,其值将被忽略/销毁一次netcat完成。

或者,更好的可能,你可以用替换倒数第二行:

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

这工作,因为拥有的netcat作为state其返回值(netcat的与行结束“返回状态”)。

在评论中,切赫约阿希姆指出的另一个问题与此代码:return语句后的netcat的功能

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

没有被执行。如果你想关闭s,你需要重新排序:

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

顺便说一句,请在第一个解决方案调用'return state' –

+0

后关闭套接字('s.close()') “全局状态”需要包含在netcat __and__登录中。但回报绝对是更好的解决方案 – mhlester

+0

是的'返回状态'现在工作!非常感谢:) – yvonnezoe

1

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

​​

增加的两个的那些功能开始为它工作。

您目前return的状态,但它不存储在任何地方。相反,你正在设置它,但目前只在本地。

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 

希望这有助于!

+0

谢谢!这澄清了很多! – yvonnezoe