【问题标题】:Python: defining a variable in callback function...not sure wherePython:在回调函数中定义一个变量......不知道在哪里
【发布时间】:2014-04-30 01:32:36
【问题描述】:

摘录:

file = open("D:\\DownloadFolder\\test.mp3", "wb")

def callback(data):
    file.write(data)
    sizeWritten += len(data)
    print(sizeWritten)

connect.retrbinary('RETR test.mp3', callback)
print("completed")

Python 显然抱怨我没有定义sizeWritten,但我不确定我应该在哪里定义它。如果我将sizeWritten = 0 放在函数之前,它仍然会给出错误local variable 'sizeWritten referenced before assignment。我该怎么做?

【问题讨论】:

  • 这是 Python 2 还是 3?

标签: python ftp


【解决方案1】:

如果sizeWritten 可以是全局的(例如,一次只有一个 回调活动),您可以在函数中将其标记为:

file = open("D:\\DownloadFolder\\test.mp3", "wb")
sizeWritten = 0

def callback(data):
    global sizeWritten
    file.write(data)
    sizeWritten += len(data)
    print(sizeWritten)

以及对callback 中名称的任何分配都会改变全局。

在 Python 3 中,您还可以使用闭包和 nonlocal 关键字:

def download(remote, local):
    file = open(local, "wb")
    sizeWritten = 0

    def callback(data):
        nonlocal sizeWritten
        file.write(data)
        sizeWritten += len(data)
        print(sizeWritten)

    connect.retrbinary('RETR ' + remote, callback)
    print("completed")

这至少将sizeWrittenfile 对象封装在本地命名空间中。

但是,您可以直接从打开的 file 文件对象中获取相同的信息:

def callback(data):
    file.write(data)
    print(file.tell())

【讨论】:

    猜你喜欢
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多