我有一个Python项目,其结构如下

src/
  __init__.py
  m/
    __init__.py
    a.py
    b.py

src/m/__init__.py的内容是
exec_str = 'A = type("A", (object,), {"x": 1})'

src/m/a.py的内容是
from src.m import exec_str
exec(exec_str)

src/m/b.py的内容是
from src.m.a import A

当我对这个代码运行mypy
错误:模块“src.m.a”没有属性“a”
我不确定是否有办法让我的孩子识别这个模块。我知道我在动态地创建和导入一个类型,所以我不一定希望mypy在这里工作,但我也不知道如何让mypy忽略它。我试着添加了# type: ignore,但mypy说misplaced type annotation
在这一点上,我根本无法让mypy成功通过。我能做些什么来解决这个问题?
我也应该说,如果可能的话,我真的不想忽略所有的b.py。有相当数量的代码(实际上)可以用来进行类型检查。

最佳答案

不幸的是,这里没有太多好的选项——mypy不能真正处理动态构造的类型。
您的选择包括:
修改exec_str以便它只读取exec_str = 'exec("A", (object,), {"x": 1})'然后在模块a或b中执行A = exec(exec_str)
这样,您至少可以为模块b中的实际变量赋值(尽管“something”只是Any类型)。
# type: ignore注释专门添加到导入。from src.m.a import A # type: ignore也是。
重新构造代码以降低所需的动态性,或者使用不同的元编程工具来完成相同的任务。例如,Mypy对元类有基本的理解。(我想你已经考虑过这个选择,但我想为了完整起见我应该提一下)。

关于python - 如何让mypy识别或忽略动态导入的类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51699429/

10-12 20:22