Warum betrachtet "mypy" "int" als Subtyp von "float"? Ein Subtyp soll alle Methoden seines Supertyps unterstützen, aber "float" hat Methoden, die "int" nicht unterstützt:
test.py:
def f(x : float) -> bool:
return x.is_integer()
print(f(123.0))
print(f(123))
Die statische Typprüfung akzeptiert die Übergabe eines "int" -Arguments für einen "float" -Parameter:
(3.8.1) myhost% mypy test.py
Success: no issues found in 1 source file
Dies garantiert jedoch nicht, dass zur Laufzeit keine Fehler auftreten:
(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'
weil "float" zusätzliche Methoden hat, die "int" nicht hat.
int
nicht in einen Schwimmer. Pythons int
sind keine Maschinen int
. (Wie auch immer, ich bin mir nicht sicher, wie das für die Typprüfung relevant wäre, was sich nicht wirklich mit Laufzeitdarstellungen von Typen befasst.)
int
und float
scheint die Tatsache völlig zu ignorieren, dass beide Typen Methoden haben oder zumindest andere Methoden als __add__
et al.