【发布时间】:2022-01-24 20:44:38
【问题描述】:
假设我有一个函数在某些情况下返回单个值,在其他情况下返回多个值(即元组)。
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
这是我不想做的事情。有什么想法吗?
【问题讨论】:
-
“假设我有一个函数在某些情况下返回单个值,在其他情况下返回多个值(即元组)。”这是您应该避免的常见反模式。无论如何,您正在寻找一个union。注意,
Optional只是与None联合的捷径,所以Optional[int]就是Union[int, None]。在这种情况下,您需要Union[int, Tuple[int, int]]。请注意,Tuple[int, Optional[int]]完全错误 -
注意,在你的第二个例子中它甚至是错误的,类型应该是
Union[Tuple[int], Tuple[int, int]],Optional表示可以是None,不是可以在那里或不在那里
标签: python type-hinting