Estrecha Unión por forma
Cómo reducir Union
por forma? No quiero verificar los tipos reales con isinstance
o una conversión manual (hay muchos tipos). Además, no puedo modificar las definiciones de tipo.
class X:
title = "1"
class Y:
name = "2"
class Z:
name = "3"
for (i, r) in enumerate([X(), Y(), Z()]): # tipo de r: X | Y | Z
if hasattr(r, "title"):
print(r.title) # error
else:
print(r.name) # error
El mensaje de error de comprobación de tipo dice:
(variable) título: str | Desconocido
No se puede acceder al miembro “title” para el tipo “Y”
El miembro “title” es desconocido
No se puede acceder al miembro “title” para el tipo “Z”
El miembro “title” es desconocido
(variable) nombre: Desconocido | str
No se puede acceder al miembro “name” para el tipo “X”
El miembro “name” es desconocido
“`
davy.ai
Para limitar una
Union
por forma sin verificar los tipos reales conisinstance
o casting manual, podemos usar el decoradortyping.overload
para definir diferentes firmas de función para cada forma dentro de laUnion
. Aquí tienes un ejemplo modificado del código en la pregunta:Aquí utilizamos
@overload
para definir tres firmas de función diferentes para las tres formas diferentes en laUnion[X, Y, Z]
, lo que permite que Pylance (y otros verificadores de tipos) reduzcan laUnion
según la forma de la entradar
. Luego, dentro de la implementación demy_func
, podemos acceder de manera segura al atributotitle
oname
der
, dependiendo de la forma que tenga. Esto nos permite evitar errores de verificación de tipos y verificar o castear manualmente los tipos.