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. Pythonsint
sind keine Maschinenint
. (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
undfloat
scheint die Tatsache völlig zu ignorieren, dass beide Typen Methoden haben oder zumindest andere Methoden als__add__
et al.Antworten:
"Warum betrachtet" mypy "" int "als Subtyp von" float "? '
Weil die Praktikabilität bisher die Reinheit hier übertrifft. Dies bedeutet nicht, dass man nicht vorschlagen könnte, dass die Typisierung einen Skalartyp definiert, der Ints und Floats enthält, sondern nur für arithmetische Operationen gültig ist.
Beachten Sie, dass int / int in 3.0 so geändert wurde, dass float (int / int) == float (int) / float (int) ist, um die Int- und float-Arithmetik für gleiche int- und float-Werte konsistent zu machen.
Beachten Sie auch, dass eine Typprüfung keine Laufzeitfehler bedeutet: Division durch Null und Überlauf sind weiterhin möglich, ebenso wie viele andere.
quelle
Wie @ juanpa.arrivillaga hervorhob , finden Sie die Erklärung unter https://mypy.readthedocs.io/en/latest/duck_type_compatibility.html .
int
ist kein Subtyp vonfloat
, daher muss es keine Methoden von unterstützenfloat
.Der Mechanismus ist gut, da die Übergabe ganzzahliger Werte keine Fehler verursachen sollte, es sei denn, Sie möchten sie wirklich wie in Ihrem Beispiel. Sie haben explizit versucht, eine nicht vorhandene Methode zu verwenden. In normalen Situationen führen wir nur arithmetische Operationen mit Zahlen durch, sodass ein Problem selten besteht und Sie es jederzeit durch Hinzufügen vermeiden können
.0
Sie wie geschrieben .In den meisten Sprachen ist es üblich, anzunehmen, dass dies
int
ein Sonderfall istfloat
. Betrachten Sie beispielsweise C ++int
alsfloat
implizite Konvertierung.quelle