33

我想为模块(类“模块”)添加(Python3)类型提示。该typing包不提供一个,它types.ModuleType()是一个构造函数,它返回一个特定名称的模块对象。

例子:

import types
def foo(module: types.ModuleType):
   pass

至少在 PyCharm 中会导致

“在 types.pyi 中找不到引用 ModuleType”。

请注意,模块类型的 Python 类型不能回答我的问题,因为它没有解释ModuleType它既是构造函数又是类型,如下面的回答。

4

1 回答 1

31

并且types.ModuleType()是一个构造函数。

那没关系。types.ModuleType仍然是对类型的引用,就像strand intare 一样。不需要通用 Module[typehint]注释,这types.ModuleType正是您需要在这里使用的。

例如,官方Python typeshed 项目为 as提供了类型提示注解sys.modules

from types import FrameType, ModuleType, TracebackType

# ...

modules: Dict[str, ModuleType]

不要被这里的名字弄糊涂了;types.ModuleType是对模块类型的引用。它不是一个单独的工厂功能或其他东西。CamelCase 名称遵循该模块的约定,您使用该引用是因为该类型对象不能作为内置对象使用。types模块将的值分配给type(sys)name

如果 PyCharm 在查找types.ModuleType存根时遇到问题,那么这可能是 PyCharm 本身的问题(一个错误),或者当前捆绑的存根已经过时,或者您使用了不完整的类型化存根集。请参阅 PyCharm 文档,了解如何使用自定义存根来提供新的集合。

如果这不起作用,则可能是 PyCharm 中处理导出类型提示概念的错误。Typeshed 当前在单独的模块中定义ModuleType类型提示,然后使用语法将其导入types.pyi存根文件。PEP 484声明导入的类型提示不是存根的一部分,除非您使用以下语法:from module import name as nameas

导入到存根中的模块和变量不被视为从存根中导出,除非导入使用import ... as ...形式或等效from ... import ... as ...形式。

PyCharm 可能还没有正确处理这种情况。

于 2018-12-14T13:35:28.023 回答