Error: Local variable referenced before assignment
本问题已经有最佳答案,请猛点这里访问。
我在python中创建了一个HTTP服务器,它执行一些加密算法。所以我尝试在get方法之外为我的加密创建重要变量,因为我不希望它们在每次请求之后都改变。
以下是代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | class Handler(BaseHTTPRequestHandler): def do_GET(self): path = self.path print 'request for ' + path rootdir = '/Server' client_mac = path.split('?')[-1] file_name = path.split('?')[0] if self.path.split('?')[0].endswith('.txt'): '''create client ID''' print 'Printing mac address of connected device ----> %s' % client_mac id1_secret_key = pre.keyGen(master_secret_key, client_mac) fr = open (rootdir + file_name) file_data = fr.read() sym_key_ciphertext = pre.encrypt(params, client_mac, sym_key); #more code follows try: httpd = HTTPServer(('',8080), Handler) print 'Server is on and listening to port...7000' group = PairingGroup('SS512', secparam=1024) pre = PreGA(group) (master_secret_key, params) = pre.setup() print params sym_key = OpenSSLRand().getRandomBytes(128) #128 bits sym_cipher = AuthenticatedCryptoAbstraction(sym_key) server_mac = get_mac() id2_secret_key = pre.keyGen(master_secret_key, str(server_mac)) httpd.serve_forever() except KeyboardInterrupt: print '^C received,shutting down the web server' server.socket.close() |
执行GET请求后,我得到以下错误:
1 2 3 | File"server.py", line 157, in do_GET ciphertext = pre.encrypt(params, client_mac, file_data); UnboundLocalError: local variable 'params' referenced before assignment |
在执行pre.setup()之后,我应该提到变量params有一个值。任何建议都会很有帮助,非常感谢。
在函数内为参数赋值:
1 | (master_secret_key, params) = pre.setup() |
所以它是一个局部变量。你可以在任务前访问它。您的代码不清楚它在哪里发生,但是如果它在函数内部,下面的行可以做到这一点:
1 | sym_key_ciphertext = pre.encrypt(params, client_mac, sym_key) |
所以你会得到一个错误。您的代码不清楚,但如果它是一个全局变量,则应将其声明为:
1 2 3 | global params ... (master_secret_key, params) = pre.setup() |
更好:不要使用全局变量,并分配不同的变量
如果收到此错误消息,您将尝试更新超出本地范围的变量。
您可以使用非本地语句,也可以重构代码。
一个可能引发此错误的简单示例是:
1 2 3 4 | x = 1 def update_one(): x += 1 update_one() |
您可以始终引用父框架中的变量,但如果不使用非本地或全局变量,则无法对其进行修改。
要么将参数传递给do-get方法,要么将其分配给