Por que "mypy" considera "int" como um subtipo de "float"? Um subtipo deve suportar todos os métodos de seu supertipo, mas "float" possui métodos que "int" não suportam:
test.py:
def f(x : float) -> bool:
return x.is_integer()
print(f(123.0))
print(f(123))
O verificador de tipo estático aceita passar um argumento "int" para um parâmetro "float":
(3.8.1) myhost% mypy test.py
Success: no issues found in 1 source file
Mas isso não garante que não haja erros no tempo de execução:
(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" possui métodos adicionais, os quais "int" não possui.
int não pode caber em um carro alegórico. Python ints não são máquinas ints. (De qualquer forma, não tenho certeza de como isso seria relevante para a verificação de tipo, que não está realmente preocupada com representações de tipos em tempo de execução.)
inte floatparece ignorar completamente o fato de que ambos os tipos têm métodos, ou pelo menos métodos diferentes de __add__et al.