web-dev-qa-db-ja.com

Pydanticとサブクラス

私のベースクラスとサブクラスが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)にすばやく変換して戻す方法が必要だからです。

9
Kendrick Lamar
_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()との一貫性を保つため。 ソース

0
Shakeel