我需要构建类型的动态联合(具有动态长度)以用于动态创建 pydantic 模型。我正在寻找如何输入要传递给
Union
的变量,以便 mypy 很高兴。
简化的截图看起来像这样(没有动态部分):
from typing import Union
a = (int, str)
b = Union[a]
mypy 使用此代码引发了 valid-type,我不太确定如何解决它。
example.py:4: error: Variable "example.a" is not valid as a type [valid-type]
example.py:4: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases
错误与
a : Tuple[Type, ...] = (int, str)
相同。
这是一段代码,其中包含我想正确输入的动态部分:
from random import choice, randint
from typing import Union
types = (int, str, bool)
a = tuple(choice(types) for _ in range(randint(1, 10)))
b = Union[a]
我认为一种方法是使用“Literal”类型或“TypeVar”,具体取决于您想要实现的目标。我认为您可以使用以下新策略:
from typing import Literal, Union
a = Literal['int','str','bool']
b = Union[int, str, bool]
将 TypeVar 与 Union 结合使用,如果“mypy”需要查看确切的类型,您可以预先定义 union 并从中动态选择。
如果 unin 必须是动态的,您通常需要通过定义所有可能的类型并选择或构建联合来手动解决类型问题
from random import choice, randint
from typing import Union
types = (int, str, bool)
chosen_types = tuple(choice(types) for _ in range(randint(1, 10)))
if len(set(chosen_types)) == 1:
DynamicUnion = chosen_types[0]
else:
DynamicUnion = Union[chosen_types]
但是,我认为这不适用于“mypy”。
from pydantic import create_model
model_fields = {'value': (Union[tuple(chosen_types)], ...)}
MyDynamicModel = create_model('MyDynamicModel', **model_fields)