¿Por qué "mypy" considera "int" como un subtipo de "flotante"? Un subtipo admitirá todos los métodos de su supertipo, pero "float" tiene métodos, que "int" no admite:
test.py:
def f(x : float) -> bool:
return x.is_integer()
print(f(123.0))
print(f(123))
El verificador de tipo estático acepta pasar un argumento "int" para un parámetro "flotante":
(3.8.1) myhost% mypy test.py
Success: no issues found in 1 source file
Pero esto no garantiza que no haya errores en tiempo de ejecución:
(3.8.1) myhost% python test.py
True
Traceback (most recent call last):
File "test.py", line 5, in <module>
print(f(123))
File "test.py", line 2, in f
return x.is_integer()
AttributeError: 'int' object has no attribute 'is_integer'
porque "float" tiene métodos adicionales, que "int" no tiene.
int
no puede caber en una carroza. Python int
s no son máquinas int
s. (De todos modos, no estoy seguro de cómo eso sería relevante para la verificación de tipos, que no está realmente preocupado por las representaciones de tipos en tiempo de ejecución.)
int
y float
parece ignorar por completo el hecho de que ambos tipos tienen métodos, o al menos los métodos distintos __add__
et al.