如何在 mypy 中使用动态类型参数?

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

我需要构建类型的动态联合(具有动态长度)以用于动态创建 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]
python python-typing mypy typing
1个回答
0
投票

我认为一种方法是使用“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”。

  • 最后一种是如果需要动态创建模型,可以使用Pydantic create model:
from pydantic import create_model

model_fields = {'value': (Union[tuple(chosen_types)], ...)}
MyDynamicModel = create_model('MyDynamicModel', **model_fields)
© www.soinside.com 2019 - 2024. All rights reserved.