多个返回值的正确类型提示

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

假设我有一个函数在某些情况下返回单个值,在其他情况下返回多个值(即元组)。

def foo(a: int, b: int, flag: bool):
    if flag:
        return a
    else:
        return a, b

该函数的返回值的正确类型注释是什么?

我可以提出这样的建议:

def foo(a: int, b: int, flag: bool) -> Tuple[int, Optional[int]]:
    if flag:
        return a
    else:
        return a, b

但我不喜欢这段代码的主要一点是,当函数返回单个值时,该值不是一个元组。因此,为了使其正常工作,我应该将函数重新制作为

def foo(a: int, b: int, flag: bool) -> Tuple[int, Optional[int]]:
    if flag:
        return (a,) 
    else:
        return a, b

这是我不想做的事情。有什么想法吗?

python type-hinting
2个回答
4
投票

您想使用

typing.Union
来指示该函数可以返回一种类型或另一种类型。例如,如果您有一个函数可以返回
int
str
,那么它的返回类型将为
Union[int, str]

那么,

def foo(a: int, b: int, flag: bool) -> Union[int, Tuple[int, int]]:

如果您使用Python 3.10,有更好的方法来编写联合:

int | Tuple[int, int]

但是,我应该重复评论中给出的警告。拥有这样的返回类型是一种反模式,您应该重构代码以避免这种情况。


0
投票

在Python 3.9+中,你可以将这样的返回值注释为:

def foo(a: int, b: int, flag: bool) -> int | tuple[int, int]:
© www.soinside.com 2019 - 2024. All rights reserved.