4

ドロップボックスのアクセスキー/シークレットを読み取り、ファイルをダウンロードするクラスをPythonで作成しようとしています。キー/シークレット部分は問題なく動作していますが、おそらくグローバル変数とローカル変数の問題が原因で、クライアント オブジェクトの認識に問題があるようです。私の答えはどこにもありません。

ここに私のコードの一部があります:

from dropbox import client, rest, session

class GetFile(object):

    def __init__(self, file1):
        self.auth_user()

    def auth_user(self):
        APP_KEY = 'xxxxxxxxxxxxxx'
        APP_SECRET = 'xxxxxxxxxxxxxx'
        ACCESS_TYPE = 'dropbox'
        TOKENS = 'dropbox_token.txt'

        token_file = open(TOKENS)
        token_key,token_secret = token_file.read().split('|')
        token_file.close()

        sess = session.DropboxSession(APP_KEY,APP_SECRET, ACCESS_TYPE)
        sess.set_token(token_key,token_secret)
        client = client.DropboxClient(sess)

        base, ext = file1.split('.')

        f, metadata = client.get_file_and_metadata(file1)
        out = open('/%s_COPY.%s' %(base, ext), 'w')
        out.write(f.read())

そして、ここにエラーがあります:

Traceback (most recent call last):
File "access_db.py", line 30, in <module>
start = GetFile(file_name)
File "access_db.py", line 6, in __init__
self.auth_user()
File "access_db.py", line 20, in auth_user
client = client.DropboxClient(sess)
UnboundLocalError: local variable 'client' referenced before assignment

私はPythonに慣れていないので、間違っている可能性のある他の明らかなことがあれば教えてください。

4

1 に答える 1

5

dropbox.clientモジュールを としてモジュール スコープにインポートしましたclientが、メソッドにはローカル変数clientあります.auth_user()

Python は、コンパイル時に関数内の代入 ( などclient =) を検出すると、その名前をローカル変数としてマークします。この時点で、client モジュールのインポートは運命づけられており、その名前で関数に表示されなくなります。

client次に、Python の目には、関数内のそのローカル変数にアクセスしようとしています。そこから属性を取得しようとしていますが、その時点ではまだ変数DropboxClient何も割り当てていません。したがって、例外がスローされます。clientUnboundLocal

回避策は、ローカル変数として使用しないか、サブモジュールの代わりにclient最上位dropboxモジュールをインポートしてから、そのサブモジュールを完全dropbox.clientパスなどで参照するか、clientモジュールに新しい名前を付けることです。

  1. clientローカルとして使用しないでください:

    dbclient = client.DropboxClient(sess)
    # ...
    f, metadata = dbclient.get_file_and_metadata(file1)
    
  2. dropboxモジュールを直接インポートします。

    import dropbox
    # ...
    
        sess = dropbox.session.DropboxSession(APP_KEY,APP_SECRET, ACCESS_TYPE)
        # ...
        client = dropbox.client.DropboxClient(sess)
    
  3. clientモジュールのエイリアスを提供します。

    from dropbox import session, rest
    from dropbox import client as dbclient
    # ...
    
        client = dbclient.DropboxClient(sess)
    
于 2012-09-15T14:21:56.953 に答える