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.

¿Por qué mypy falla con “tipo incompatible” en el método de clase Enum?

En mi Enum, he definido un método de clase para convertir un valor dado en un miembro de la Enum. El valor dado puede ser una instancia de la Enum o puede ser una cadena que contenga un valor de la Enum.
Para decidir si necesita conversión, verifico si el argumento es una instancia de la clase y solo lo paso a int() si no lo es. En este punto, según las sugerencias de tipo para el argumento ‘item’, debe ser una cadena.

La clase se ve así:

T = TypeVar('T', bound='MyEnum')

class MyEnum(Enum):
    A = 0
    B = 1

    @classmethod
    def coerce(cls: Type[T], item: Union[int, T]) -> T:
        return item if isinstance(item, cls) else cls(int(item))

mypy falla con:

error: Argument 1 to "int" has incompatible type "Union[str, T]";
expected "Union[str, bytes, SupportsInt, SupportsIndex,
_SupportsTrunc]"

¿Por qué?

Tags:  ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que el argumento ‘item’ puede ser de tipo ‘Union[str, T]’, lo que significa que puede ser una cadena de texto o una instancia de la clase Enum. Sin embargo, el método int() solo puede aceptar un conjunto específico de tipos como ‘str’, ‘bytes’, ‘SupportsInt’, ‘SupportsIndex’ o ‘_SupportsTrunc’. Por lo tanto, la pista de tipo para el argumento ‘item’ debe actualizarse para incluir los tipos adicionales posibles que se esperan por el método int() para evitar un error de tipo.

Comments are closed.