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")

これは、その上で ab が float でないことを確認しているので、間違いなく false positive だと思っています。

質問

  • python の mypy における Union の、選択肢を場合分けで潰していく処理は、どのように記述するのが正しいのでしょうか?