我正在学习mypy,我遇到的第一个错误是cannot find module

我的档案是:

from tzwhere import tzwhere
tzw = tzwhere.tzwhere()
print(tzw)


它可以由python运行,因为已安装tzwhere软件包。但是当我通过mypy运行它时,我得到了:

mypy mp.py
mp.py:1: error: Cannot find module named 'tzwhere'
mp.py:1: note: (Perhaps setting MYPYPATH or using the "--ignore-missing-imports" flag would help)


我如何说No library stub file for module 'tzwhere'并处理存根文件而不是Cannot find module

最佳答案

为了使mypy(和其他符合PEP 484的工具)了解如何键入给定的模块,它必须能够在某个地方找到该模块的存根。

Mypy(如果我们稍作简化的话)本质上检查存根的两个不同位置:


它检查typeshed的本地副本,该副本是标准库和流行的第三方库的类型提示存储库。 (系统自动将myshed旁边安装的Typeshed副本。)
它检查程序包本身是否为bundling type hints(例如,程序包是否为符合PEP 561的程序包)。


不幸的是,看来tzwhere并没有做这两种事情:我在打字机上找不到它;它似乎不是捆绑类型。结果,mypy将无法使用tzwhere准确键入检查代码。

您有三个主要选择:


只需通过在导入中添加# type: ignore注释来抑制错误消息。请注意,这将在代码中引入动态性:您从tzwhere中使用的任何变量/函数都将假定为Any类型。
为模块创建类型存根,将其存储在某个文件夹中,然后将MYPYPATH环境变量指向该文件夹。请注意,这将需要您进行一些侦探工作。 More details on how mypy finds imports here
如果您想与其他人共享第2步中的工作,请提交与存根进行排版的拉取请求,或者使用tzwhere本身提交拉取请求,以将其转换为符合PEP 561的程序包。在执行上述任何一项操作之前,请确保您从库的作者那里得到了同意。

09-06 14:22