4

我有一个 python3.4 项目,我最近决定使用 mypy 来更好地理解。

这段代码可以工作,但是用 mypy 检查会弹出一个错误:

import zipfile

def zip_to_txt(zip: typing.IO[bytes]) -> BytesIO:
zz = zipfile.ZipFile(zip)
output = BytesIO()
for line, info in enumerate(zz.filelist):
    date = "%d-%02d-%02d %02d:%02d:%02d" % info.date_time[:6]
    output.write(str.encode("%-46s %s %12d\n" % (info.filename, date, info.file_size)))
output.seek(0, 0)
return output

错误 :

PyPreviewGenerator/file_converter.py:170: error: "ZipFile" has no attribute "filelist" (对应于这一行for line, info in enumerate(zz.filelist)::)

但是当我查看 ZipFile 类内部时,我可以清楚地看到该属性存在。 
那么为什么会发生错误呢?有没有办法解决它?

4

1 回答 1

3

简而言之,原因是因为filelistTypeshed 中没有记录该属性,Typeshed 是 stdlib/各种 3rd 方库的类型存根集合。您可以在此处亲自查看。

为什么filelist不包括在内?好吧,因为它实际上似乎不是API 的记录部分。如果您搜索该文档,您会发现filelist任何地方都没有提及。

相反,您应该调用infolist()方法,它会返回您想要的内容(如果您好奇,请参阅此处的实现)。您会注意到infolist() 确实列在 typeshed中。

于 2017-05-17T21:08:39.647 回答