web-dev-qa-db-fra.com

Pydantic et sous-classes

J'ai ce projet où ma classe de base et mes sous-classes implémentent 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]}")

Mais cette erreur apparaît:

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

Quelqu'un est-il gêné d'expliquer ce qui se passe? La raison pour laquelle je veux utiliser pydantic est que j'ai besoin d'un moyen de convertir rapidement des objets Python en dict (ou JSON) et inversement.

9
Kendrick Lamar
E   AttributeError: __fields_set__

La première partie de votre question est déjà répondue par Peter T comme Document dit - "Gardez à l'esprit que pydantic.dataclasses.dataclass est un remplacement instantané pour dataclasses.dataclass"

La deuxième partie est que vous vouliez les convertir en dict.

La raison pour laquelle je veux utiliser pydantic est que j'ai besoin d'un moyen de convertir rapidement des objets Python en dict (ou JSON) et inversement.

Pour répondre à cette partie de votre question, vous pouvez utiliser asdict de la source de données elle-même 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}]}

Il y a une discussion sur ces fonctions d'assistance au niveau du module (.asdict & .astuple) Qu'elles ne sont pas compatibles PEP8 (devraient être as_dict() et as_Tuple()) mais finalement ils ont décidé de garder la cohérence avec namedtuple._asdict () et attr.asdict (). source

0
Shakeel