繁体   English   中英

mypy,输入提示:Union[float, int] -> 是否有 Number 类型?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM