我正在阅读一些运行良好的代码。在代码中,它使用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中的一些概念?欣赏任何想法和指示。