当也用作类型提示时如何处理额外的要求?

Dur*_*ndA 5 python setuptools python-import python-3.x python-importlib

我想更新一个库,以便要求是可选的(使用extras_require)。

不幸的是,从可选需求导入的类在库中随处用作类型提示。这是一个例子:

from typing import List
try:
    from extra.sub import ExtraFoo, ExtraBar
except ImportError:
    pass

def optional(foo: ExtraFoo) -> List[ExtraBar]:
    pass

def greeting(name: str) -> str:
    return 'Hello ' + name

if __name__ == '__main__':
    greeting('John Smith')
Run Code Online (Sandbox Code Playgroud)

optional()在此示例中,如果extra未安装,我们将不会使用。事实上,这样的代码会引发一个NameErrorsinceExtraFooExtraBar用作类型提示。

一个可能的解决方法是在块中声明class ExtraFoo: passand 。然而,在同一模块中具有多种类型的代码中到处都存在这样的情况。class ExtraBar: passexcept

我想避免通过虚拟导入声明污染代码。有没有通用的方法来处理这种情况(例如代理模块)?

Ben*_*Ben 0

我相信原始问题的答案已包含在评论中,但是由于问题已被编辑,因此有点令人困惑。对于问题的当前版本,我相信解决方案是使用前向引用,即将类型提示放在引号中,如下所示:

def optional(foo: "ExtraFoo") -> List["ExtraBar"]:
    pass
Run Code Online (Sandbox Code Playgroud)