Mypy报implicit-reexport错误:模块未显式重导出属性
问题描述
我的Python库结构如下:
module > module_namespace __init__.py MyClass.py > asyncio __init__.py MyClass.py
在module_namespace/__init__.py和module_namespace/asyncio/__init__.py中,我都显式导出了类:
# __init__.py from .MyClass import ClassType __all__ = ["ClassType"]
之后在其他应用中导入:
from module_namespace import ClassType # 或者 # from module_namespace.asyncio import ClassType
但mypy报错“模块未重导出ClassType”。我的mypy.ini中设置了implicit_reexport=false且不想修改,我原以为添加__all__就足够重导出符号,请问哪里出错了?
原因与解决方案
__all__的作用范围有限:
__all__主要用于控制from <module> import *时会导入哪些符号,它并不能让mypy在implicit_reexport=false的模式下认可符号的直接重导出。当implicit_reexport=false时,mypy要求模块必须显式将符号作为自身的属性存在,而不是仅仅通过from .x import y这种导入语句引入。正确的重导出方式:需要在
__init__.py中显式将导入的符号绑定到模块命名空间,修改后的代码如下:
# __init__.py from .MyClass import ClassType # 显式赋值,让mypy识别该符号属于模块的公共属性 ClassType = ClassType __all__ = ["ClassType"]
如果担心命名冲突,也可以用别名导入后再赋值:
# __init__.py from .MyClass import ClassType as _ClassType ClassType = _ClassType __all__ = ["ClassType"]
这样修改后,mypy就能正确识别ClassType是模块的重导出符号,不会再报错。
内容的提问来源于stack exchange,提问作者Miguel Wang
相关产品推荐
相关产品推荐

