mypy で Union の可能性を if で潰したが、エラーが消えない
python 3 の typing を用いて、以下のようなロジックを書きました。
from typing import Union
from decimal import Decimal
Number = Union[int, float, Decimal]
def multiply_numbers(a: Number, b: Number) -> Number:
if type(a) is float or type(b) is float:
return float(a) * float(b)
return a * b
しかしこれは、一番最後の行で、以下のエラーが発生します。
test.py:10: error: Unsupported operand types for * ("float" and "Decimal")
test.py:10: error: Unsupported operand types for * ("Decimal" and "float")
これは、その上で a
と b
が float でないことを確認しているので、間違いなく false positive だと思っています。
質問
- python の mypy における Union の、選択肢を場合分けで潰していく処理は、どのように記述するのが正しいのでしょうか?