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

问题描述 投票:0回答:1

我想为模块(类“模块”)添加(Python3)类型提示。

typing
包不提供,而
types.ModuleType()
是一个返回特定名称的模块对象的构造函数。

示例:

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

至少在 PyCharm 结果中

“在 types.pyi 中找不到参考 ModuleType”。

请注意,模块类型的Python类型并没有回答我的问题,因为它没有解释

ModuleType
既是构造函数又是类型,如下所示。

python python-3.x pycharm type-hinting python-typing
1个回答
49
投票

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 ...

形式或等效的

from ... import ... as ...
形式。

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

© www.soinside.com 2019 - 2024. All rights reserved.