6
import hmac, base64, hashlib, urllib2
base = 'https://.......'

def makereq(key, secret, path, data):
    hash_data = path + chr(0) + data
    secret = base64.b64decode(secret)
    sha512 = hashlib.sha512
    hmac = str(hmac.new(secret, hash_data, sha512))

    header = {
        'User-Agent': 'My-First-test',
        'Rest-Key': key,
        'Rest-Sign': base64.b64encode(hmac),
        'Accept-encoding': 'GZIP',
        'Content-Type': 'application/x-www-form-urlencoded'
    }

    return urllib2.Request(base + path, data, header)

错误:文件“C:/Python27/btctest.py”,第 8 行,在 makereq hmac = str(hmac.new(secret, hash_data, sha512)) UnboundLocalError: 在赋值之前引用了局部变量 'hmac'

有人知道为什么吗?谢谢

4

2 回答 2

12

如果您在函数中的任何位置分配给变量,则该变量将在该函数中的任何位置被视为局部变量。因此,您会在以下代码中看到相同的错误:

foo = 2
def test():
    print foo
    foo = 3

换句话说,如果同名函数中存在局部变量,则无法访问全局或外部变量。

要解决这个问题,只需给你的局部变量hmac一个不同的名字:

def makereq(key, secret, path, data):
    hash_data = path + chr(0) + data
    secret = base64.b64decode(secret)
    sha512 = hashlib.sha512
    my_hmac = str(hmac.new(secret, hash_data, sha512))

    header = {
        'User-Agent': 'My-First-test',
        'Rest-Key': key,
        'Rest-Sign': base64.b64encode(my_hmac),
        'Accept-encoding': 'GZIP',
        'Content-Type': 'application/x-www-form-urlencoded'
    }

    return urllib2.Request(base + path, data, header)

请注意,可以使用globalornonlocal关键字更改此行为,但您似乎不想在您的情况下使用它们。

于 2013-06-13T21:27:47.590 回答
2

您正在hmac函数范围内重新定义变量,因此import语句中的全局变量不存在于函数范围内。重命名函数范围hmac变量应该可以解决您的问题。

于 2013-06-13T21:25:46.603 回答