0

我正在阅读一些运行良好的代码。在代码中,它使用urlretrieve从网络下载文件。在下载时,它还可以报告已下载了多少。

urlretrieve 调用如下:

urlretrieve(url + filename, dest_filename, reporthook=download_progress_hook)

download_progress_hook()定义如下:

def download_progress_hook(count, blockSize, totalSize):
    print(count, blockSize, totalSize)

当我给出一些网址并开始下载某事时。从网络上,它不断报告计数、块大小大小,如下所示

0 8192 8458043
1 8192 8458043
2 8192 8458043
3 8192 8458043
4 8192 8458043
5 8192 8458043
6 8192 8458043
7 8192 8458043

描述为“钩子将传递三个参数的python文档;到目前为止传输的块数,以字节为单位的块大小,以及文件的总大小。第三个参数在旧的FTP服务器上可能是-1,它不返回文件大小以响应检索请求。” 这对我来说看起来很奇怪。我的理解是调用urlretrieve函数时,它使用download_progress_hook函数的输出作为urlretrieve的输入,并将其命名为reporthook变量。但是根据这段代码的结果,看起来每当使用第三个参数调用urlretrieve时,应该将其定义为函数,urlretrieve会将这 3 个信息反馈给该函数。我从 urllib 中的其他函数知道,我们可以通过检查头文件来获取文件大小。但我不明白这整个机制是如何在这里工作的。变量如何传递到函数download_progress_hook。根据输出,这就像download_progress_hook函数在urlretrieve的生命周期内一直在运行。这可能是python编程或urllib中的一些概念?欣赏任何想法和指示。

4

1 回答 1

1

这是迟到的回复,但因为我也在这里阅读了这个答案https://stackoverflow.com/questions/43370284/why-function-works-properly-without-specifying-parameters/

概括:

urlretrieve 不调用 download_progress_hook。它只是将该函数对象作为引用提供给 urlretrieve() 函数,并且该代码将在某处调用 download_progress_hook(传入所需的参数)。

于 2017-11-14T18:31:31.853 回答