Estoy implementando una interfaz de Python utilizando la clase base abstracta (conocida como el patrón de estrategia ). Quiero poder hacer esto con Pydantic.
Sin Pydantic, usaría propiedades como esta:
from abc import ABC, abstractproperty @dataclass class PersonEntity(ABC): @abstractproperty def first_name(self): raise NotImplementedError @abstractproperty def last_name(self): raise NotImplementedError @dataclass class Person(PersonEntity): @property def first_name(self): return 'Jimmy' @property def last_name(self): return 'Kelly'De esta manera, si tuviera que implementar otra clase, como
@dataclass class SillyPerson(PersonEntity): @property def first_name(self): return 'Jimmy' @property def last_name(self): return 'Kelly' @property def sillyness(self): return 5 entonces la interfaz arrojará un error. Esto ayuda a restringir cualquier clase nueva que herede de PersonEntity .
Sin embargo, quiero escupir esta información en un objeto de respuesta de FastAPI. No puedo hacer esto sin descubrir algún tipo de serializador para capturar todos los valores de cada campo de propiedad, y solo los campos de propiedad (que estoy luchando por hacer).
Prefiero usar Pydantic. En este caso, no necesito propiedades, simplemente puedo hacer:
from pydantic import BaseModel class PersonEntity(ABC, BaseModel): first_name: str last_name: str class Person(PersonEntity): first_name: str last_name: str Estos se serializarán de la manera que necesito, pero pierdo la funcionalidad de la interfaz porque ahora no tengo propiedades y, por lo tanto, no puedo usar @abstractproperty .
Entonces, si tuviera que implementar
class SillyPerson(PersonEntity): first_name: str last_name: str sillyness: strno hay error, porque pydantic lo permite.
(Por cierto, en estos ejemplos no estaba seguro de si heredar de BaseModel en las clases secundarias o no).
¿Hay alguna forma en que pueda restringir el modelo de Pydantic para que me proporcione el comportamiento de interfaz que necesito, arrojando errores cuando se introduce un campo que no está incluido en la clase ABC PersonEntity ?