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

我在python中有一个函数,可以返回boollist。是否有一种方法可以使用类型提示指定返回类型?

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

def foo(id) -> list or bool:
...
281854 次浏览

文档

类# EYZ0

联合类型;# EYZ0

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

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开始,有了一种新的方式来表示这个联合。看到# EYZ0:

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

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

def foo(client_id: str) -> list | bool:
语句def foo(client_id: str) -> list or bool:在求值时等价于

. def foo(client_id: str) -> list:,因此不会做你想做的事情

当地人描述“a”或“b”的方式;类型提示是联盟(感谢Bhargav Rao):

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

或者,Python 3.10开始,超过,使用|操作符:

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

我不想成为“你为什么要这样做”;但也许有2个返回类型不是你想要的:

如果你想返回一个bool值来表示某种特殊的错误情况,可以考虑使用Exceptions。如果你想返回一个bool值作为一些特殊值,也许一个空列表将是一个很好的表示。 你也可以用Optional[list]

来表示None

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

from typing import Tuple


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

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

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的特殊情况,您可以使用Optional[X]

在基本Python中简单地执行:

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