Método de verificación de tipos en Python con múltiples posibles entradas
Tengo una función que toma una lista de cinco enteros o cinco enteros como una tupla (*argv).
Aquí está el encabezado de mi función:
def __init__(self, *argv: Union[int, list]) -> None:
Más adelante en esta función, verifico el contenido de esta tupla para ver si es una lista o cinco enteros individuales.
if type(argv[0]) == int:
self._l1 = [argv[0], argv[1], argv[2], argv[3], argv[4]]
else:
self._l1 = argv[0]
En este punto del código, l1 es una lista. self._l1 definitivamente es una lista, ya no es un entero, es una lista.
Sin embargo, más adelante en mi código cuando ejecuto esta línea:
self._myvar = self._l1.count(1)
Recibo este error de MyPy:
Incompatible types in assignment (expression has type “Union[int, List[Any]]”, variable has type “List[Union[int, List[Any]]]”)
¿Estoy escribiendo esto incorrectamente? ¿Qué debo escribir aquí? He probado muchos tipos diferentes y sigo recibiendo errores.
Según lo que puedo ver, mi entrada es una tupla que contendrá una lista de enteros o cinco enteros. Supongo que es algo así como Union[Tuple[List[int]], Tuple[int, …]] o simplemente Union[List[int], int] or Union[List[int], Tuple[int, …]], o algo similar, pero ninguno de estos está funcionando para mí.
davy.ai
Parece que el problema está en la declaración del tipo de
self._l1
en tu código.Dado que tu función acepta ya sea una lista de cinco enteros o cinco enteros como una tupla, debes declarar el tipo de
self._l1
comoList[int]
oTuple[int, int, int, int, int]
.A continuación se muestra un ejemplo de cómo podrías modificar tu código para reflejar esto:
Ten en cuenta que también he utilizado
isinstance()
en lugar detype()
para comprobar el tipo deargv[0]
, ya que esto se considera más pythonico.