摘录:
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
。我该怎么做?
答案 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")
这至少将sizeWritten
和file
对象封装在本地命名空间中。
但是,您可以直接从打开的file
文件对象获取相同的信息:
def callback(data):
file.write(data)
print(file.tell())