mypy 真的很方便,并且可以捕获很多错误,但是当我编写“科学”应用程序时,我经常会这样做:
def my_func(number: Union[float, int]):
# Do something
number
是浮点数或整数,取决于用户的输入。有没有官方的方法可以做到这一点?
mypy 真的很方便,并且可以捕获很多错误,但是当我编写“科学”应用程序时,我经常会这样做:
def my_func(number: Union[float, int]):
# Do something
number
是浮点数或整数,取决于用户的输入。有没有官方的方法可以做到这一点?
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。
您可以定义自己的类型来解决此问题并保持代码更简洁。
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
.
示例 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