mypy,类型提示:Union[float, int] -> 是否有数字类型?

mypy, type hint: Union[float, int] -> is there a Number type?

mypy 真的很方便,可以捕获很多错误,但是当我编写 "scientific" 应用程序时,我经常会这样做:

def my_func(number: Union[float, int]):
    # Do something

number 是 float 或 int,取决于用户的输入。有官方的方法吗?

仅使用 float ,因为 int 隐含在该类型中:

def my_func(number: float):

PEP 484 Type Hints 特别指出:

Rather than requiring that users write import numbers and then use numbers.Float etc., this PEP proposes a straightforward shortcut that is almost as effective: when an argument is annotated as having type float, an argument of type int is acceptable; similar, for an argument annotated as having type complex, arguments of type float or int are acceptable.

(大胆强调我的)。

理想情况下,您仍会使用 numbers.Real:

from numbers import Real

def my_func(number: Real):

因为它也接受 fractions.Fraction()decimal.Decimal() 对象;数字金字塔比整数和浮点值更广泛。

但是,当使用 mypy 进行类型检查时,这些目前不起作用,请参阅 Mypy #3186

对于那些为了更普遍的联合类型提示问题而来到这个问题的人,这些实体没有现有的共同超类型,例如 Union[int, numpy.ndarray],解决方案是导入 [=13] =] 来自 typing.

示例 1:

from typing import Union

def my_func(number: Union[float, int]):
    # Do something

示例 2:

from typing import Union
import numpy as np

def my_func(x: Union[float, np.ndarray]):
    # do something
    # Do something

您可以定义自己的类型来解决这个问题并使您的代码更简洁。

FloatInt = Union[float, int]

def my_func(number: FloatInt):
    # Do something

Python > 3.10 允许您执行以下操作。

def my_func(number: int | float) -> int | float: