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

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

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

当前回答

Python 3.10或更新版本:使用|。示例:函数接受一个int或str类型的参数,并返回int或str类型:

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

Python 3.5 - 3.9:使用类型。联盟:

from typing import Union

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

对于特殊情况X |无,可以使用Optional[X]。

其他回答

语句def foo(client_id: str) -> list或bool:当求值时等效于 Def foo(client_id: str) ->列表:因此不会做你想做的事情。

本地描述“非a即B”类型提示的方式是Union(感谢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可以返回

来自文档-联盟类型:

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

|的这种用法是在Python 3.10中添加的。因此,表示多个返回数据类型的正确方法是:

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

对于较早的版本,使用类型。联盟:

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中明确提到了这一点。

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

在Python 3.9+中:

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

在早期版本中,使用类型。元组:

from typing import Tuple

def f() -> Tuple[dict, str]:
    ...

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

Python 3.10或更新版本:使用|。示例:函数接受一个int或str类型的参数,并返回int或str类型:

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

Python 3.5 - 3.9:使用类型。联盟:

from typing import Union

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

对于特殊情况X |无,可以使用Optional[X]。