79

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

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

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

4

4 回答 4

126

float 使用,正如int该类型所暗示的那样:

def my_func(number: float):

PEP 484类型提示明确指出:

numbers.Float这个 PEP 提出了一个几乎同样有效的简单快捷方式,而不是要求用户编写导入编号然后使用等等:当一个参数被注释为具有 typefloat时,一个 type 的参数int是可以接受的;类似地,对于被注释为复杂类型的参数,float 或 int 类型的参数是可以接受的。

(粗体强调我的)。

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

from numbers import Real

def my_func(number: Real):

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

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

于 2018-06-19T12:35:45.930 回答
4

您可以定义自己的类型来解决此问题并保持代码更简洁。

FloatInt = Union[float, int]

def my_func(number: FloatInt):
    # Do something
于 2021-01-10T15:57:10.987 回答
2

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

def my_func(number: int | float) -> int | float: 
于 2021-06-20T05:43:33.787 回答
1

对于那些因为没有共同的现有超类型的实体的联合类型提示的更一般问题而来到这个问题的人,例如Union[int, numpy.ndarray],解决方案是Uniontyping.

示例 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
于 2020-10-02T19:55:08.977 回答