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

xam8gpfp  于 2023-01-29  发布在  Python
关注(0)|答案(4)|浏览(277)

我在python中有一个函数,它可以返回bool或者list,有没有办法使用类型提示来指定返回类型?
例如,这是正确的做法吗?

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

iugsix8n1#

来自文件-活接头类型:
联合对象保存对多个类型对象的|(按位或)运算的值。这些类型主要用于类型注解。与typing.Union相比,联合类型表达式启用了更清晰的类型提示语法。
|的这种用法是在Python 3.10中添加的,因此表示多个返回数据类型的正确方法是:

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

对于早期版本,请使用typing.Union

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***及以上版本,这在PEP 484中有明确说明。

ogsagwnx

ogsagwnx2#

如果有人在这里搜索"如何指定多个返回值的类型?",请使用元组[type_value1, ..., type_valueN]
在Python 3.9+中:

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

在早期版本中,使用typing.Tuple

from typing import Tuple

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

更多信息:How to annotate types of multiple return values?

7d7tgy0s

7d7tgy0s3#

Python 3.10或更新版本:使用|。例如,一个函数采用intstr作为单个参数,并返回intstr

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

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

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
c0vxltue

c0vxltue4#

语句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:

我不想成为“你为什么要这么做”的人,但是也许有2个返回类型并不是你想要的:
如果你想返回一个bool来指示某种类型的特殊错误情况,可以考虑使用Exceptions来代替。如果你想返回一个bool作为某种特殊值,也许空列表会是一个很好的表示。你也可以指示None可以与Optional[list]一起返回

相关问题