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 模块导入注定要失败,它不再以该名称在您的函数中可见。

接下来,在 python 的眼中,您正在尝试访问client函数中的该局部变量;您正在尝试从中获取属性DropboxClient,但此时您尚未为该变量分配任何内容client。所以UnboundLocal抛出异常。

解决方法是要么不用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 回答