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

问题描述 投票:0回答:4

mypy 确实很方便并且捕获了很多错误,但是当我编写“科学”应用程序时,我经常会这样做:

def my_func(number: Union[float, int]):
    # Do something

number
是浮点数或整数,具体取决于用户的输入。有官方的方法吗?

python type-hinting mypy python-typing union-types
4个回答
211
投票

使用

float
only,因为
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


19
投票

Python ≥

3.10
允许您执行以下操作。

def my_func(number: int | float) -> int | float: 

12
投票

您可以定义自己的类型来解决此问题并保持代码简洁。

FloatInt = Union[float, int]

def my_func(number: FloatInt):
    # Do something

-2
投票

对于那些因没有共同现有超类型(例如

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
© www.soinside.com 2019 - 2024. All rights reserved.