2013-06-13 2 views
3
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) 

Error: Файл "C: /Python27/btctest.py", строка 8, в makereq HMAC = ул (hmac.new (секрет, hash_data, sha512)) UnboundLocalError: локальная переменная 'hmac', указанная перед присвоениемUnboundLocalError: локальная переменная ... обращаться до назначения

Кто-нибудь знает почему? Спасибо

ответ

2

Вы переопределяете переменную hmac в пределах области действия, поэтому глобальная переменная из оператора import отсутствует в пределах области функции. Переименование переменной функции-области hmac переменная должна исправить вашу проблему.

9

Если вы назначаете переменную в любом месте функции, эта переменная будет обрабатываться как локальная переменная везде в этой функции. Таким образом, вы увидите ту же ошибку с помощью следующего кода:

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) 

Заметьте, что такое поведение может быть изменено с помощью global или nonlocal ключевых слов, но это не кажется, что вы хотели бы использовать их в вашем случае.

+0

Исправьте меня, если я ошибаюсь, но «нелокальный» - это только Python 3+, не так ли? OP отметил это 2.7. –

Смежные вопросы