UnboundLocalError: variable local … referenciada antes de la asignación

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: Archivo “C: /Python27/btctest.py”, línea 8, en makereq hmac = str (hmac.new (secret, hash_data, sha512)) UnboundLocalError: variable local ‘hmac’ referenciada antes de la asignación

Alguien sabe por qué? Gracias

Si asigna una variable en cualquier lugar de una función, esa variable se tratará como una variable local en cualquier lugar de esa función. Entonces verías el mismo error con el siguiente código:

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

En otras palabras, no puede acceder a la variable global o externa si hay una variable local en la función del mismo nombre.

Para solucionar este problema, simplemente hmac un nombre diferente a su variable local 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) 

Tenga en cuenta que este comportamiento se puede cambiar mediante el uso de palabras clave global o nonlocal , pero no parece que quiera usarlas en su caso.

Está redefiniendo la variable hmac dentro del scope de la función, por lo que la variable global de la statement de import no está presente dentro del scope de la función. Cambiar el nombre de la variable hmac función-scope debería solucionar su problema.