私のベースクラスとサブクラスが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)にすばやく変換して戻す方法が必要だからです。
_E AttributeError: __fields_set__
_
Document が言っているように、質問の最初の部分はすでにPeter Tによって回答されています-「pydantic.dataclasses.dataclassはdataclasses.dataclassのドロップイン置換であることに注意してください」
2番目の部分は、それらを辞書として変換することです。
私がpydanticを使用したい理由は、Pythonオブジェクトをdict(またはJSON)にすばやく変換して戻す方法が必要だからです。
あなたの質問のその部分に答えるには、データソース自体のasdictを使うことができます source
_@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()との一貫性を保つため。 ソース