Python在嵌套函数中访问父变量

时间:2017-10-30 12:34:28

标签: python

def download(self):
    ftp = self.connect()
    try:
        size = ftp.size(filename=self.filename)
        print "Total size of {filename} is {size}".format(filename=self.filename, size=size)
        written_till_now = 0
        def handle(bytes):
            f.write(bytes)
            print "written bytes: {}".format(bytes)

        with open(self.filename, 'wb') as f:
            ftp.retrbinary('RETR {}'.format(self.filename), handle)
    except (socket.error, error_perm) as e:
        raise DownloaderException("Error in downloading file {filename}: {message}".format(filename=self.filename, message=str(e)))
    except EOFError as e:
        print "file {filename} downloaded successfully".format(filename=self.filename)

我想跟踪我当前下载的数据量,然后为我下载的每个数据流做一些额外的操作。

我在handle函数中创建了一个download函数。

Python ftblip.retrbinary为给定的回调提供数据。在我的情况下handle但不知何故它没有执行。

另外,我怀疑在嵌套函数方面我不理解变量的范围。在我的理解中,我可以在子范围内使用父范围中定义的变量,只要我不修改它们。但在这种情况下f是一个对象而我不修改它而是调用它的方法{{1} }。如果我错过了什么,请纠正我。

1 个答案:

答案 0 :(得分:1)

handle函数无权访问作用域f变量。相反,您可以将打开的文件直接传递给handle

def handle(fp, bytes):
    fp.write(bytes)
    print "written bytes: {}".format(bytes)

with open(self.filename, 'wb') as f:
    ftp.retrbinary('RETR {}'.format(self.filename), lambda b: handle(f, b))