mypy:なぜ「int」は「float」のサブタイプですか?


8

「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」にはない追加のメソッドがあるためです。



2
@BlackFrogいいえ、できません。
juanpa.arrivillaga

3
@BlackFrog フロートに収まりint ません。Python intはマシンではありませんint。(とにかく、それが型チェックにどのように関係するかはわかりません。これは、型のランタイム表現には実際には関係ありません。)
chepner

1
私は何か、とダックタイピングを使用するための根拠が不足していない限りintfloat完全に両方のタイプのメソッドを持っているという事実を無視しているようだ、または以外の少なくとも方法で__add__ら。
chepner

1
@StefanPochmannはい、しかしここに示すように、型システムのPOVからはそうではありません
juanpa.arrivillaga

回答:


1

「なぜ「mypy」は「int」を「float」のサブタイプと見なすのですか?」

これまでのところ、実用性はここで純粋さを上回ると考えられてきたからです。これは、型付けがintとfloatを含み、算術演算にのみ有効であるスカラー型を定義することを提案できないと言っているのではありません。

int / intは3.0で変更され、float(int / int)== float(int)/ float(int)となるようになりました。

型チェックの合格は、実行時エラーがないことを意味しないことにも注意してください。ゼロによる除算とオーバーフローは依然として可能です。


-1

通りの@ juanpa.arrivillagaが指摘し、説明が上であるhttps://mypy.readthedocs.io/en/latest/duck_type_compatibility.html

サブタイプはそのスーパータイプのすべてのメソッドをサポートしますが、「float」には「int」がサポートしないメソッドがあります

intはのサブタイプではないfloatため、のメソッドをサポートする必要はありませんfloat

例のように本当に必要な場合を除いて、整数値を渡してもエラーが発生することはないので、このメカニズムは優れています。存在しないメソッドを明示的に使用しようとしました。一般的な状況では、数値の算術演算のみを行うため、問題が発生することはほとんどなく、.0書いたとおりに追加することでいつでも問題を回避できます。

int特殊なケースであると想定することは、ほとんどの言語で一般的な動作です。floatたとえば、C ++ intからfloat暗黙的な変換への移行を検討してください。


正直なところ、「正しい型を使用することで、いつでもそれを回避できる」と言っても、型チェッカーが間違っていることに対する私にとって説得力のある議論ではありません。
juanpa.arrivillaga

静的型付けのはに正確にある避けるタイプに定義されていない方法を使用して。答えの最初の部分は問題ありません。なぜマイナス面がないのかを説明するのは、誰もが邪悪なことをしているだけです。
chepner

記録のために、私は反対票を投じませんでした。
juanpa.arrivillaga
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.