关于python:错误:赋值前引用的局部变量

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方法,要么将其分配给BaseHTTPRequestHandler的成员字段。