我想为模块(类“模块”)添加(Python3)类型提示。
typing
包不提供,而 types.ModuleType()
是一个返回特定名称的模块对象的构造函数。
示例:
import types
def foo(module: types.ModuleType):
pass
至少在 PyCharm 结果中
“在 types.pyi 中找不到参考 ModuleType”。
请注意,模块类型的Python类型并没有回答我的问题,因为它没有解释
ModuleType
既是构造函数又是类型,如下所示。
和
是构造函数。types.ModuleType()
types.ModuleType
仍然是对类型的引用,就像 str
和 int
一样。不需要 generic Module[typehint]
注释,因此 types.ModuleType
正是您需要在此处使用的。
例如,官方Python typeshed项目为sys.modules
from types import FrameType, ModuleType, TracebackType
# ...
modules: Dict[str, ModuleType]
不要被这里的名字所迷惑;
types.ModuleType
是模块类型的参考。它不是一个单独的工厂函数或其他东西。 CamelCase 名称遵循该模块的约定,并且您使用该引用是因为该类型对象不能作为内置对象使用。 types
模块将type(sys)
的值分配给名称。
如果 PyCharm 在查找
types.ModuleType
存根时遇到问题,则可能是 PyCharm 本身存在问题(错误),或者当前捆绑的存根已过时,或者您使用了不完整的类型化存根集。请参阅 PyCharm 文档,了解如何使用自定义存根来提供全新的集。
如果这不起作用,则可能是 PyCharm 中处理“导出”类型提示概念的错误。 Typeshed 目前在单独的模块中定义ModuleType
类型提示,然后使用
types.pyi
语法将其导入到from module import name as name
存根文件中。 PEP 484指出导入的类型提示不是存根的一部分 除非您使用
as
语法:
导入到存根中的模块和变量不被视为从存根导出,除非导入使用 import ... as ...
形式或等效的
形式。 PyCharm 可能尚未正确处理此类情况。from ... import ... as ...