Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

284
Views
Cómo crear un patrón de interfaz Python ABC usando Pydantic

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: str

no 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 ?

over 4 years ago · Santiago Trujillo
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!