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 int
s não são máquinas int
s. (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.)
int
e float
parece ignorar completamente o fato de que ambos os tipos têm métodos, ou pelo menos métodos diferentes de __add__
et al.