Mejorando la calidad del código: eliminando líneas duplicadas

3/25
Recursos

Aportes 11

Preguntas 3

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

response_model_exclude

Ya lo hace por nosotros.

Podemos dejar la clase Person que es la única que necesitamos y en la siguiente líneas obtener un PersonOut sin escribirlo

@ app.post(
	"/person/new",
	response_model=Person,
	response_model_exclude={"password"}
	)
def create_person(person: Person = Body(...)):
    return person

Bastante bueno el usar herencia para poder mejorar el codigo, en la clase anterior compartí una solucion en la seccion de aportes para el problema de las lineas duplicadas pero este era usando parametros del path operation decorator

Podrás seguir todos mis apuntes escritos en Notion en:
https://rain-scabiosa-74f.notion.site/Curso-de-FastAPI-Avanzado-189668eeee1a45168e46c5be56312967

Si te gusta dejame un corazoncito ♥

Mejorando la calidad del código: eliminando líneas duplicadas

Aunque que hicimos anteriormente funciona técnicamente no es la forma mas optima de trabajar nuestros modelos, lo que deberiamos hacer es generar una modelo base como PersonBase y hacer que de allí hereden Person y PersonOut

Modelos Mejorados

class PersonBase(BaseModel):
    first_name: str = Field(
        ...,
        min_length=1,
        max_length=50,
        example='John',
    )
    last_name: str = Field(
        ...,
        min_length=1,
        max_length=50,
        example='Doe',
    )
    age: int = Field(
        ...,
        gt=0,
        le=110,
        example=25,
    )
    hair_color: Optional[HairColor] = Field(
        default=None,
        example=HairColor.blonde,
    )
    is_married: Optional[bool] = Field(
        default=None,
        example=False
    )
    email = EmailStr()

    class Config:
        schema_extra = {
            "example": {
                'first_name': 'Edkar',
                'last_name': 'Chachati',
                'age': 20,
                'hair_color': HairColor.black,
                'is_married': False
            }
        }

class Person(PersonBase):
    password: str = Field(
        ...,
        min_length=8,
        max_length=50,
        example='password'
    )

class PersonOut(PersonBase):
    pass

En vez de pass pueden usar tambien Ellipsis que de igual forma

class PersonOut(PersonBase): 
    ...

El profe facundo es un temerario, duplico el código en la clase anterior sin miedo a que en los comentarios los alumnos aventajados le cayeran encima, excelente, saludos a todos, sigamos adelante!

La reutilización en Python es una de las maneras mas recomendadas en la programación ya que nos llega a evitar problemas como bugs o desincronización, para ello es recomendable realizar funciones con las fracciones de código repetidas, sin embargo para el caso de model, lo mas recomendable es la herencia, concepto de Poo: https://platzi.com/clases/1474-oop/16683-que-es-la-herencia7487/
la cual nos permite reducir la cantidad de líneas de código, y evitar problemas futuros

lol

El Profe genero autómaticamente un problema evitando las buenas prácticas para así explicarnos mucho mejor el tema.

Saludos!

Se toma todo el código que viene en BaseModel para usarlo en PersonBase, y todo ese código combinado (PersonBase + BaseModel) viene a Person y PersonOut.

class PersonBase(BaseModel):
    first_name: str = Field(
        ...,
        min_length=1,
        max_length=50,
        example='Marty'
        )
    last_name: str = Field(
        ...,
        min_length=1,
        max_length=50,
        example='McFly'
        )
    age: int = Field(
        ...,
        gt=0,
        le=115,
        example='20'
        )
    hair_color: Optional[HairColor] = Field(default=None, example='black')
    is_married: Optional[bool] = Field(default=None, example='False')


class Person(PersonBase):
    password: str = Field(
        ...,
        min_length=8
        )

class PersonOut(PersonBase):
    pass

En PersonOut es necesario poner pass ya que es una clase vacía y no se necesita agregar nada, todos los atributos se heredan de PersonBase.

Yo a esto le tendría otro uso, que sería por ejemplo tener usuarios con diferentes suscripciones, entonces haría un modelo de tipo de usuario con la suscripción más básica, y cuando tengo diferentes suscripciones con servicios más completos, haría modelos que hereden a la anterior:

class PlatziBasic(BaseModel):
	atributo = validation()
	atributo = validation()
	atributo = validation()

class PlatziExpert(PlatziBasic):
	atributo_extra = validation()
	atributo_extra = validation()

class PlatziExpertPlus(PlatziExpert):
	atributo_extra = validation()

Que bien que empecemos a enlazar conceptos de diferentes cursos y aplicarlos en un ámbito profesional!. POO nos ayuda muchísimo