在对Pydantic BaseModel进行子类化时,为什么会出现“AttributeError:_字段u集_uu”?

2024-09-19 23:40:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个项目,其中我的基类和子类实现pydantic.BaseModel

from pydantic import BaseModel
from typing import List
from dataclasses import dataclass

@dataclass
class User(BaseModel):
    id: int 

@dataclass
class FavoriteCar(User):
    car_names: List[str] 

car = FavoriteCar(id=1, car_names=["Acura"])
print(f"{car.id} {car.car_names[0]}")

但这个错误出现了:

    self.__fields_set__.add(name)
E   AttributeError: __fields_set__

有人介意解释一下发生了什么事吗?我之所以想使用pydantic,是因为我需要一种将Python对象快速转换为dict(或JSON)并返回的方法


Tags: 项目fromimportidfieldsnamescarlist
2条回答

您需要决定是从pydantic.BaseModel继承,还是使用@dataclass装饰器(或者from dataclasses,或者from pydantic.dataclasses

根据documentation(我自己加的黑体字),两者都可以,但不能同时使用:

If you don't want to use pydantic's BaseModel you can instead get the same data validation on standard dataclasses

E   AttributeError: __fields_set__

Peter T已经回答了您问题的第一部分,正如Document所说:“请记住,pydantic.dataclasses.dataclass是dataclasses.dataclass的替代品。”

第二部分是您希望将它们转换为dict

The reason why I want to use pydantic is because I need a way to quickly convert Python objects to dict (or JSON) and back

要回答这部分问题,可以使用数据类本身的asdictsource

from dataclasses import dataclass, asdict
from typing import List


@dataclass
class Point:
     x: int
     y: int

@dataclass
class C:
     l: List[Point]

p = Point(10, 20)
assert asdict(p) == {'x': 10, 'y': 20}

c = C([Point(0, 0), Point(10, 4)])
assert asdict(c) == {'l': [{'x': 0, 'y': 0}, {'x': 10, 'y': 4}]}

关于这些模块级辅助函数(.asdict&;.astuple)的讨论表明它们不符合PEP8(应该是as_dict()as_tuple()),但是最后它们决定与namedtuple保持一致。_asdict()和attr.asdict()source

相关问题 更多 >