我有一个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/