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)

この動作はglobalまたはnonlocalキーワードを使用して変更できることに注意してください。

于 2013-06-13T21:27:47.590 に答える
2

hmac関数スコープ内で変数を再定義しているため、importステートメントのグローバル変数は関数スコープ内に存在しません。関数スコープhmac変数の名前を変更すると、問題が解決するはずです。

于 2013-06-13T21:25:46.603 に答える