「mypy」が「int」を「float」のサブタイプと見なすのはなぜですか?サブタイプはスーパータイプのすべてのメソッドをサポートしますが、「float」には「int」がサポートしないメソッドがあります。
test.py:
def f(x : float) -> bool:
return x.is_integer()
print(f(123.0))
print(f(123))
静的型チェッカーは、「float」パラメーターに「int」引数を渡すことを受け入れます。
(3.8.1) myhost% mypy test.py
Success: no issues found in 1 source file
ただし、実行時にエラーがないことは保証されません。
(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'
「float」には「int」にはない追加のメソッドがあるためです。
int
ません。Python int
はマシンではありませんint
。(とにかく、それが型チェックにどのように関係するかはわかりません。これは、型のランタイム表現には実際には関係ありません。)
int
とfloat
完全に両方のタイプのメソッドを持っているという事実を無視しているようだ、または以外の少なくとも方法で__add__
ら。