联盟列表仅接受与 Pydantic 的第一种类型的联盟

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

具有以下 python 类型定义:

import pydantic
from typing import List, Union
import sys
import pprint

class TypeA(pydantic.BaseModel):
    name:str = "Type A"
    type_a_spesific:float = 1337

class TypeB(pydantic.BaseModel):
    name:str = "Type B"
    type_b_spesific:str = "bob"


class ReturnObject(pydantic.BaseModel):
    parameters:List[Union[TypeA, TypeB] ]

parameters = list()
parameters.append(TypeA(name="item 1", type_a_spesific=69))
parameters.append(TypeB(name="item 2", type_b_spesific="lol"))

ret = ReturnObject(parameters = parameters)

print(f"Python version: {pprint.pformat(sys.version_info)}")
print(f"Pydantic version: {pydantic.__version__}")
print(ret.json(indent=3))
print(ret)

版本输出如下所示:

Python version: sys.version_info(major=3, minor=11, micro=5, releaselevel='final', serial=0)
Pydantic version: 1.10.11

我希望参数列表包含两个不同类型的对象,如下所示:

预计

{
    "parameters": [
        {
            "name": "item 1",
            "type_a_spesific": 69
        },
        {
            "name": "item 2",
            "type_b_spesific": "lol"
        }
    ]
}

parameters=[TypeA(name='item 1', type_a_spesific=69.0), TypeB(name='item 2', type_b_spesific="lol")]

然而,结果却是这样的:

实际

{
   "parameters": [
      {
         "name": "item 1",
         "type_a_spesific": 69.0
      },
      {
         "name": "item 2",
         "type_a_spesific": 1337
      }
   ]
}

parameters=[TypeA(name='item 1', type_a_spesific=69.0), TypeA(name='item 2', type_a_spesific=1337)]

由于某种原因,List[ Union[ TypeA, TypeB ]] 不起作用。 什么给予

python list union python-typing pydantic
1个回答
0
投票

感谢@juanpa.arrivilillaga的评论,我自己找到了答案;

这是 Pydantic 1.x 的一个错误(功能?)。如果我升级到使用 Pydantic 2.x 那么它的行为将按预期进行。

© www.soinside.com 2019 - 2024. All rights reserved.