mypy 确实很方便并且捕获了很多错误,但是当我编写“科学”应用程序时,我经常会这样做:
def my_func(number: Union[float, int]):
# Do something
number
是浮点数或整数,具体取决于用户的输入。有官方的方法吗?
使用
float
only,因为 int
隐含在该类型中:
def my_func(number: float):
PEP 484 类型提示特别指出:
该 PEP 提出了一种几乎同样有效的直接快捷方式,而不是要求用户编写导入编号,然后使用
等,即: 当参数被注释为具有类型numbers.Float
时,参数类型为float
可以接受;类似地,对于注释为复杂类型的参数,float 或 int 类型的参数是可接受的。int
(粗体强调我的)。
numbers.Real
:
from numbers import Real
def my_func(number: Real):
因为它也接受
fractions.Fraction()
和 decimal.Decimal()
对象;数字金字塔比整数和浮点值更广泛。
但是,当使用
mypy
进行类型检查时,这些目前不起作用,请参阅 Mypy #3186。
Python ≥
3.10
允许您执行以下操作。
def my_func(number: int | float) -> int | float:
您可以定义自己的类型来解决此问题并保持代码简洁。
FloatInt = Union[float, int]
def my_func(number: FloatInt):
# Do something
对于那些因没有共同现有超类型(例如
Union[int, numpy.ndarray]
)的实体的联合键入提示而提出此问题的更普遍问题的人,解决方案是从 Union
导入 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