Python:在回调函数中定义一个变量......不知道在哪里

时间:2014-03-22 15:50:01

标签: python ftp

摘录:

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。我该怎么做?

1 个答案:

答案 0 :(得分: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())