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

The*_*veO 13 python pycharm python-3.x typehints

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

例:

import types
def foo(module: types.ModuleType):
   pass
Run Code Online (Sandbox Code Playgroud)

至少在PyCharm中导致"在types.pyi中找不到参考ModuleType".

Mar*_*ers 13

和types.ModuleType()是一个构造函数.

那没关系.types.ModuleType仍然是对类型的引用,就像是strint.不需要通用 Module[typehint]注释,因此types.ModuleType您需要在此处使用.

例如,官方Python类型化项目提供了类型提示注释sys.modules:

from types import FrameType, ModuleType, TracebackType

# ...

modules: Dict[str, ModuleType]
Run Code Online (Sandbox Code Playgroud)

不要被这里的名字搞糊涂; 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 ...表单或等效from ... import ... as ...表单,否则导入存根中的模块和变量不会被视为从存根导出.

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

  • @TheDiveO:投票很少,如果有的话,“拖钓”。我注意到,在您添加了有关 PyCharm 对使用 `typing.ModuleType` 的反应的信息后,您获得了赞成票,这使您的问题对本网站的其他访问者更有用。Stack Overflow 的目标是建立一个对其他有相同问题的人有用的问题存储库,并通过添加更多信息使其更有用。此处使用投票来表明其他人认为帖子对实现目标的有用程度。另请参阅[什么时候对问题进行投票是合理的?](//meta.stackoverflow.com/q/252677) (4认同)
  • @TheDiveO:你显示的错误是PyCharm错误或过时的本地存根文件,因为我可以看到[`ModuleType`类型注释](https://github.com/python/typeshed/blob/25ac4d6af46104d0c7cb134ed09a61ca7092b62a/stdlib/ 3/sys.pyi#L43),它是[从`types.pyi`]导出的(https://github.com/python/typeshed/blob/25ac4d6af46104d0c7cb134ed09a61ca7092b62a/stdlib/3/types.pyi#L12-L14). (2认同)