繁体   English   中英

如何使用类型提示指定多个返回类型

[英]How to specify multiple return types using type-hints

我在 python 中有一个 function 可以返回boollist 有没有办法使用类型提示指定返回类型?

例如,这是正确的做法吗?

def foo(id) -> list or bool:
    ...

文档

typing.Union

联合式; Union[X, Y] 表示 X 或 Y。

因此,表示多个返回数据类型的正确方法是

from typing import Union


def foo(client_id: str) -> Union[list,bool]

但请注意,不强制键入。 Python 仍然是一种动态类型的语言。 已开发注释语法以帮助在发布到生产之前的代码开发过程中。 正如 PEP 484 所述,“运行时不会进行类型检查”。

>>> def foo(a:str) -> list:
...     return("Works")
... 
>>> foo(1)
'Works'

如您所见,我正在传递一个 int 值并返回一个 str。 但是__annotations__将设置为相应的值。

>>> foo.__annotations__ 
{'return': <class 'list'>, 'a': <class 'str'>}

请通过PEP 483了解有关类型提示的更多信息。 另请参阅Python 3.5 中的类型提示是什么? ?

请注意,这仅适用于Python 3.5及更高版本。 这在PEP 484中明确提到。


从 Python 3.10 开始,有一种新的方式来表示这个联合。 请参阅 联合类型

联合对象保存 | 的值 (按位或)对多种类型对象的操作。 这些类型主要用于类型注释。 与 typing.Union 相比,联合类型表达式支持更简洁的类型提示语法。

如我们所见,这与之前版本中的typing.Union完全相同。 我们之前的示例可以修改为使用此表示法:

def foo(client_id: str) -> list | bool:

如果有人在这里搜索“如何指定多个返回值的类型?”,请使用Tuple[type_value1, ..., type_valueN]

from typing import Tuple

def f() -> Tuple[dict, str]:
    a = {1: 2}
    b = "hello"
    return a, b

更多信息: 如何注释多个返回值的类型?

语句def foo(client_id: str) -> list or bool:当评估时等同于def foo(client_id: str) -> list:因此不会做你想做的事。

描述“A 或 B”类型提示的原生方式是Union (感谢 Bhargav Rao):

def foo(client_id: str) -> Union[list, bool]:

或者, Python 3.10 及更高版本开始,使用| 操作员:

def foo(client_id: str) -> list | bool:

我不想成为“你为什么要这样做”的人,但也许有两种返回类型不是你想要的:

如果你想返回一个 bool 来指示某种特殊的错误情况,请考虑使用 Exceptions 代替。 如果您想返回一个布尔值作为一些特殊值,那么空列表可能是一个很好的表示。 您还可以使用Optional[list]指示None可以返回

Python 3.10 (使用| ):一个函数的示例,它接受一个参数,该参数是一个intstr并返回一个intstr

def func(arg: int | str) -> int | str:
              ^^^^^^^^^     ^^^^^^^^^ 
             type of arg   return type

Python 3.5 - 3.9 (使用typing.Union ):

from typing import Union
def func(arg: Union[int, str]) -> Union[int, str]:
              ^^^^^^^^^^^^^^^     ^^^^^^^^^^^^^^^ 
                type of arg         return type

对于X | None X | None ,您可以使用Optional[X]

在基础 Python 中,只需执行以下操作:

def foo(x: (list, str)):
    pass

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM