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?
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: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 bloquematch
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
isinstance
–elif
o utilizar bibliotecas alternativas comotyping_extensions
que proporcionan una funciónmatch_type
para la comprobación de tipos.