es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo escribir un argumento que será subclaseado en Python

Tengo un código que sigue este patrón:

from typing import Any

class Base:
    ...

class Derived1(Base):
    ...

class Derived2(Base):
    ...

class BasicApp:
    # ¿Cómo debo tipar "d" en esta clase base?
    def handle(self, d: Base) -> None:
        print("handle from BasicApp", d)

class AppX(BasicApp):
    def handle(self, d: Derived1) -> None:
        print("handle from AppX", d)

class AppY(BasicApp):
    def handle(self, d: Derived2) -> None:
        print("handle from AppY", d)

No estoy seguro de cuál es la forma correcta de tipar “d” en BasicApp.d.

Intenté d: Base, luego obtuve el siguiente error:

error: El argumento 1 de "handle" no es compatible con el supertipo "BasicApp"; el supertipo define el tipo de argumento como "Base".

Intenté T = TypeVar('T', bound=Base) y d: T, luego obtuve el siguiente error:

error: El argumento 1 de "handle" no es compatible con el supertipo "BasicApp"; el supertipo define el tipo de argumento como "T".

¿Cuál es la manera correcta?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La forma correcta de escribir d en BasicApp es utilizando TypeVar. Define un TypeVar con una restricción a Base, de la siguiente manera:

    from typing import Any, TypeVar
    
    class Base:
        ...
    
    
    class Derived1(Base):
        ...
    
    
    class Derived2(Base):
        ...
    
    
    T = TypeVar('T', bound=Base)
    
    
    class BasicApp:
        def handle(self, d: T) -> None:
            print("manejar desde BasicApp", d)
    
    
    class AppX(BasicApp):
        def handle(self, d: Derived1) -> None:
            print("manejar desde AppX", d)
    
    
    class AppY(BasicApp):
        def handle(self, d: Derived2) -> None:
            print("manejar desde AppY", d)
    

    Esto hace que d acepte cualquier tipo que sea una subclase de Base. Cuando heredas de BasicApp y sobrescribes el método handle con un tipo más específico (por ejemplo, Derived1 o Derived2), funciona correctamente porque esas clases son subclases de Base.

Comments are closed.