mypy,类型提示:Union[float, int] -> 是否有数字类型?
mypy, type hint: Union[float, int] -> is there a Number type?
mypy 真的很方便,可以捕获很多错误,但是当我编写 "scientific" 应用程序时,我经常会这样做:
def my_func(number: Union[float, int]):
# Do something
number
是 float 或 int,取决于用户的输入。有官方的方法吗?
仅使用 float
,因为 int
隐含在该类型中:
def my_func(number: float):
PEP 484 Type Hints 特别指出:
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 float
, an argument of type int
is acceptable; similar, for an argument annotated as having type complex, arguments of type float or int are acceptable.
(大胆强调我的)。
理想情况下,您仍会使用 numbers.Real
:
from numbers import Real
def my_func(number: Real):
因为它也接受 fractions.Fraction()
和 decimal.Decimal()
对象;数字金字塔比整数和浮点值更广泛。
但是,当使用 mypy
进行类型检查时,这些目前不起作用,请参阅 Mypy #3186。
对于那些为了更普遍的联合类型提示问题而来到这个问题的人,这些实体没有现有的共同超类型,例如 Union[int, numpy.ndarray]
,解决方案是导入 [=13] =] 来自 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
您可以定义自己的类型来解决这个问题并使您的代码更简洁。
FloatInt = Union[float, int]
def my_func(number: FloatInt):
# Do something
Python > 3.10
允许您执行以下操作。
def my_func(number: int | float) -> int | float:
mypy 真的很方便,可以捕获很多错误,但是当我编写 "scientific" 应用程序时,我经常会这样做:
def my_func(number: Union[float, int]):
# Do something
number
是 float 或 int,取决于用户的输入。有官方的方法吗?
仅使用 float
,因为 int
隐含在该类型中:
def my_func(number: float):
PEP 484 Type Hints 特别指出:
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 typefloat
, an argument of typeint
is acceptable; similar, for an argument annotated as having type complex, arguments of type float or int are acceptable.
(大胆强调我的)。
理想情况下,您仍会使用 numbers.Real
:
from numbers import Real
def my_func(number: Real):
因为它也接受 fractions.Fraction()
和 decimal.Decimal()
对象;数字金字塔比整数和浮点值更广泛。
但是,当使用 mypy
进行类型检查时,这些目前不起作用,请参阅 Mypy #3186。
对于那些为了更普遍的联合类型提示问题而来到这个问题的人,这些实体没有现有的共同超类型,例如 Union[int, numpy.ndarray]
,解决方案是导入 [=13] =] 来自 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
您可以定义自己的类型来解决这个问题并使您的代码更简洁。
FloatInt = Union[float, int]
def my_func(number: FloatInt):
# Do something
Python > 3.10
允许您执行以下操作。
def my_func(number: int | float) -> int | float: