python urlretrieve reporthook函数如何处理输入参数

时间:2017-06-16 20:37:57

标签: progress urlretrieve

我正在阅读一些效果很好的代码。在代码中,它使用 urlretrieve 从Web下载文件。在下载时,它还可以报告下载了多少。

urlretrieve调用如下:

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

download_progress_hook()的定义如下:

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

当我给了一些网址并开始下载某事。来自网络,它保持报告 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中的一些概念?欣赏任何想法和指示。

1 个答案:

答案 0 :(得分:1)

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

摘要:

  

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