你能在Python中定义递归类型提示吗?

Chr*_*ser 7 python type-hinting python-3.x mypy python-typing

我有一个 Python 类型的别名:

from typing import Tuple, Dict, Union

SelectedModelArgs = Dict[
    str,
    Union[
        str,
        float,
        Tuple[float, float],
        Dict[str, Union[str, float, Tuple[float, float]]],
    ],
]
Run Code Online (Sandbox Code Playgroud)

目前,这允许使用 str 到 str、float、float 元组或相同类型的嵌套字典的字典。有没有办法递归地定义它以允许任意嵌套?

例如

SelectedModelArgs = Dict[
    str,
    Union[
        str,
        float,
        Tuple[float, float],
        SelectedModelArgs,
    ],
]
Run Code Online (Sandbox Code Playgroud)

当我尝试这个时,我收到 IDE 错误:

  • Pylance:“SelectedModelArgs”未定义
  • Mypy:现在无法解析“SelectedModelArgs”(可能是循环定义)

添加from __future__ import annotations到文件顶部并不能解决这些问题(就像在类定义中使用类名一样)。

我还尝试使用上面的代码示例,但将其嵌套"SelectedModelArgs"为字符串(如本答案中所述)。这可以解决 pylance 错误,但不能解决 mypy 错误。