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.

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í.

Tags:  , , , ,

Answer

  1. Avatar for 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 como List[int] o Tuple[int, int, int, int, int].

    A continuación se muestra un ejemplo de cómo podrías modificar tu código para reflejar esto:

    from typing import List, Tuple, Union
    
    class MyClass:
        def __init__(self, *argv: Union[int, List[int]]) -> None:
            if isinstance(argv[0], int):
                self._l1 = [argv[0], argv[1], argv[2], argv[3], argv[4]]
            else:
                self._l1 = argv[0]
    
            self._myvar = self._l1.count(1)
    
        def do_something(self) -> None:
            print(self._myvar)
    
    # Uso de ejemplo:
    # Cinco enteros individuales
    mc1 = MyClass(1, 2, 1, 4, 5)
    mc1.do_something() # Salida: 2
    
    # Lista de cinco enteros
    mc2 = MyClass([1, 2, 3, 1, 5])
    mc2.do_something() # Salida: 2
    

    Ten en cuenta que también he utilizado isinstance() en lugar de type() para comprobar el tipo de argv[0], ya que esto se considera más pythonico.

Comments are closed.