Why do I get "AttributeError: __fields_set__" when subclassing a Pydantic BaseModel?
Why do I get "AttributeError: __fields_set__" when subclassing a Pydantic BaseModel?
我有这个项目,我的基地 class 和我的子 classes 实施 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)并返回。
您需要决定是继承自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 的直接替代品”
第二部分是您想将它们转换为字典。
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
要回答你问题的这一部分,你可以使用数据类本身的 asdict
source
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
我有这个项目,我的基地 class 和我的子 classes 实施 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)并返回。
您需要决定是继承自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 的直接替代品”
第二部分是您想将它们转换为字典。
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
要回答你问题的这一部分,你可以使用数据类本身的 asdict
source
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