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

Mypy 真的很方便,而且能捕获很多 bug,但是当我编写“科学”应用程序时,我常常会这样做:

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

取决于用户的输入,number是浮点数还是整型数。有没有正式的方法可以做到这一点?

34746 次浏览

Use float only, as int is implied in that type:

def my_func(number: float):

PEP 484 Type Hints specifically states that:

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 ABC1, an argument of type int is acceptable; similar, for an argument annotated as having type complex, arguments of type float or int are acceptable.

(Bold emphasis mine).

Ideally you would still use numbers.Real:

from numbers import Real


def my_func(number: Real):

as that would accept fractions.Fraction() and decimal.Decimal() objects as well; the number pyramid is broader than just integers and floating point values.

However, these are not currently working when using mypy to do your type checking, see Mypy #3186.

For people who come to this question for the more general problem of Union typing hints for entities which don't have an existing supertype in common, for example Union[int, numpy.ndarray], the solution is to import Union from typing.

Example 1:

from typing import Union


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

Example 2:

from typing import Union
import numpy as np


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

You can define your own type to address this and keep your code cleaner.

FloatInt = Union[float, int]


def my_func(number: FloatInt):
# Do something

Python > 3.10 allows you to do the following.

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