【问题标题】:Correct type hint for multiple return values多个返回值的正确类型提示
【发布时间】: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


【解决方案1】:

您想使用typing.Union 表示该函数可以返回一种或另一种类型的事物。例如,如果您有一个函数可以返回 intstr,那么它的返回类型将是 Union[int, str]

所以,

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

如果您使用的是 Python 3.10,有更好的方法来编写联合:int | Tuple[int, int]

【讨论】:

    猜你喜欢
    • 2020-01-25
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 2021-06-30
    • 2023-02-19
    • 2019-11-15
    相关资源
    最近更新 更多