假设我有一个函数在某些情况下返回单个值,在其他情况下返回多个值(即元组)。
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
这是我不想做的事情。有什么想法吗?
您想使用
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]
但是,我应该重复评论中给出的警告。拥有这样的返回类型是一种反模式,您应该重构代码以避免这种情况。
在Python 3.9+中,你可以将这样的返回值注释为:
def foo(a: int, b: int, flag: bool) -> int | tuple[int, int]: