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.

Encontrando una instancia de la clase más específica en Python

Digamos que tengo tres clases A, B y C, C extiende de B y B extiende de A.
“`
@dataclass
class A:
value: int

class B(A):
pass

class C(B):
pass
“`

En Python 3.10 con la introducción de la función match, pensé en cambiar las sentencias isinstance-elif por una sentencia match-case. Pero no encuentro la sintaxis correcta…

Lo que he intentado hasta ahora…


match instance.class.name:
case A.name:
print('A')
case B.name:
print('B')

Pero ¿qué pasa si dos clases tienen la misma propiedad __name__? Incluso una instancia de C no coincidirá con ningún caso.

Siguiente sintaxis… esta es mejor

match instance:
case A():
print('A')
case B():
print('B')

Esta sintaxis funciona bastante bien, excepto que una instancia de B coincidirá con el primer caso, por lo que tendré que ordenar las clases topológicamente en mi sentencia match-case.

Pregunta adicional: ¿Esta es una sintaxis especial donde no se necesitan parámetros?

Pregunta: ¿Qué otras opciones tengo?

Tags:  ,

Answer

  1. Avatar for davy.ai

    En lugar de depender del nombre de la clase o de la inicialización de la instancia, puedes usar la función type para hacer coincidir directamente el tipo de clase:

    match instance:
        case A:
            print('A')
        case B:
            print('B')
        case C:
            print('C')
    

    Esta sintaxis hará coincide correctamente una instancia de C con el último caso.

    En cuanto a la pregunta adicional, la declaración case en el bloque match no requiere ningún parámetro adicional. Simplemente verifica si la instancia o valor que se está comparando coincide con el tipo o patrón especificado.

    Otros opciones que tienes incluyen seguir utilizando declaraciones isinstanceelif o utilizar bibliotecas alternativas como typing_extensions que proporcionan una función match_type para la comprobación de tipos.

Comments are closed.