[英]mypy, type hint: Union[float, int] -> is there a Number type?
mypy 真的很方便,并且可以捕获很多错误,但是当我编写“科学”应用程序时,我经常会这样做:
def my_func(number: Union[float, int]):
# Do something
number
是浮点数或整数,取决于用户的输入。 有没有官方的方法可以做到这一点?
仅使用float
,因为int
隐含在该类型中:
def my_func(number: float):
PEP 484类型提示明确指出:
这个 PEP 提出了一个几乎同样有效的简单快捷方式,而不是要求用户编写导入数字然后使用
numbers.Float
等:当一个参数被注释为具有类型float
时,一个类型为int
的参数是可以接受的; 类似地,对于被注释为复杂类型的参数,float 或 int 类型的参数是可以接受的。
(粗体强调我的)。
理想情况下,您仍然会使用numbers.Real
:
from numbers import Real
def my_func(number: Real):
因为这也将接受fractions.Fraction()
和decimal.Decimal()
对象; 数字金字塔比整数和浮点值更广泛。
但是,当使用mypy
进行类型检查时,这些当前不起作用,请参阅Mypy #3186 。
您可以定义自己的类型来解决此问题并保持代码更简洁。
FloatInt = Union[float, int]
def my_func(number: FloatInt):
# Do something
Python > 3.10
允许您执行以下操作。
def my_func(number: int | float) -> int | float:
对于没有共同超类型的实体(例如Union[int, numpy.ndarray]
)的更普遍的 Union 类型提示问题,解决方案是从typing
导入Union
。
示例 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.