(任何)python模块的类型提示是什么?

时间:2018-12-14 13:30:38

标签: python python-3.x pycharm typehints

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

示例:

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

至少在PyCharm中导致“在types.pyi中找不到引用ModuleType”。

1 个答案:

答案 0 :(得分:7)

  

和类型。ModuleType()是构造函数。

没关系。 types.ModuleType仍然是对类型的引用,就像strint一样。不需要泛型 Module[typehint]批注,因此types.ModuleType正是您在这里需要使用的。

例如,官方Python typeshed project提供的type hint annotation for sys.modules如下:

from types import FrameType, ModuleType, TracebackType

# ...

modules: Dict[str, ModuleType]

不要被这里的名字弄糊涂; types.ModuleType是对模块类型的引用。它不是独立的工厂功能或其他功能。 CamelCase名称遵循该模块的约定,您可以使用该引用,因为类型对象不能作为内置对象使用。 types模块assigns the value of type(sys) to the name

如果PyCharm在查找types.ModuleType存根时遇到问题,则可能是PyCharm本身存在问题(一个错误),或者当前捆绑的存根已过时,或者您使用了不完整的格式化的存根集。请参阅how to use custom stubs上的PyCharm文档以提供新的设置。

如果这不起作用,则可能是PyCharm处理 exporting 类型提示概念的错误。当前键入defines the ModuleType type hints in a separate module,然后使用from module import name as name语法imported into the types.pyi stubfile键入。 PEP 484指出,除非您使用as语法,否则导入的类型提示不属于存根

  

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

PyCharm可能尚未正确处理此类情况。