【问题标题】:Can I have a variable number of types on Union in Python?我可以在 Python 中的 Union 上拥有可变数量的类型吗?
【发布时间】:2021-10-26 01:33:18
【问题描述】:

我有这样的结构:

from enum import Enum

class MainEnum(str, Enum):
    A = "AA"
    B = "BB"
    ...

class ChildAEnum(str, Enum):
    C = "CC"
    D = "DD"

class ChildBEnum(str, Enum):
    E = "EE"
    F = "FF"

...

child_mapping = {
    MainEnum.A: ChildAEnum
    MainEnum.B: ChildBEnum
    ...
}

MainEnum 上的每个 Enum 都有另一个 Enum 与之关联并由 child_mapping 映射指示。

我想要一个Union 类型提示,它可以是child_mapping 中的任何一个值。我不知道它是否相关,但我使用的是pydantic,我希望它用于自动验证该字段。

手动,它会是:

class Something(BaseModel):
   some_child: Union[ChildAEnum, ChildBEnum]

但我希望能够将另一个键值对添加到 child_mapping 并让它被 Union 自动识别。

我尝试了以下方法:

class Something(BaseModel):
    some_child: Union[*list(child_mapping.values())]

list(child_mapping.values()) 成功为我获取了我想要使用的类型列表,但解包似乎不起作用

我能做到吗?

【问题讨论】:

  • 我认为答案是:不,你不是(很遗憾)。静态类型检查器无法理解动态计算的表达式。

标签: python python-3.x enums python-typing pydantic


【解决方案1】:

写下这个问题帮助我思考这个问题。解决方案是将child_mapping.values() 转换为list,而不是将其转换为tuple

所以解决办法是:

class Something(BaseModel):
    some_child: Union[tuple(child_mapping.values())]

【讨论】:

  • 人们应该知道,这实际上不适用于静态分析,例如对于mypy
  • 正如@juanpa.arrivillaga 所说,没有类型检查器能够理解这种表达方式(截至 2021 年 8 月),因此以这种方式对变量进行注释(遗憾的是)没用静态类型检查。
  • 我没有意识到这一点。谢谢。
猜你喜欢
  • 2010-12-09
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 2011-07-04
  • 2010-11-29
  • 1970-01-01
相关资源
最近更新 更多