【问题标题】:Error: Local variable referenced before assignment [duplicate]错误:分配之前引用的局部变量[重复]
【发布时间】:2016-04-07 09:05:55
【问题描述】:

我在 python 中创建了一个 HTTP 服务器,它执行一些加密算法。因此,我尝试在 GET 方法之外为我的密码学创建重要变量,因为我不希望它们在每次请求后都发生变化。

下面是代码示例:

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 请求后,我收到以下错误:

File "server.py", line 157, in do_GET
ciphertext = pre.encrypt(params, client_mac, file_data);
UnboundLocalError: local variable 'params' referenced before assignment

我应该提到变量 params 在 pre.setup() 执行后有一个值。任何建议都会有所帮助并深表感谢。

【问题讨论】:

标签: python http


【解决方案1】:

如果您收到此错误消息,则表示您正在尝试更新本地范围之外的变量。

您可以使用非本地语句或重构代码。

引发此错误的更简单示例是:

x = 1
def update_one():
     x += 1
update_one()

您始终可以引用父框架中的变量,但如果不使用非局部或全局变量,则无法对其进行修改。

【讨论】:

  • 这无关紧要。您没有更新变量。您正在改变根本不改变指针的对象。
  • 我不会考虑改变对象来修改变量。我会认为它会变异或修改对象。我想我可以更清楚。
【解决方案2】:

您在函数内部分配参数:

(master_secret_key, params) = pre.setup()

所以它是一个局部变量。您在分配之前访问它。从您的代码中不清楚它发生的位置,但如果它在函数内部,则以下行可以做到这一点:

sym_key_ciphertext = pre.encrypt(params, client_mac, sym_key)

所以你得到一个错误。你的代码不清楚,但如果是全局变量,你应该这样声明:

global params
...
(master_secret_key, params) = pre.setup()

更好:不要使用全局变量,并分配一个不同的变量

【讨论】:

    【解决方案3】:

    要么将参数传递给 do_GET 方法,要么将其分配给 BaseHTTPRequestHandler 的成员字段。

    【讨论】:

    • @Elazar 哎呀,你完全正确,已编辑
    猜你喜欢
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 2021-12-16
    • 1970-01-01
    • 2018-07-16
    • 2021-04-02
    • 2021-08-19
    相关资源
    最近更新 更多