我在python中有一个函数可以返回bool
或list
。有没有办法使用类型提示指定返回类型。
例如,这是正确的方法吗?
def foo(id) -> list or bool:
...
答案 0 :(得分:149)
班级
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了解有关类型提示的更多信息。另请参阅What are Type hints in Python 3.5?
请注意,这仅适用于 Python 3.5 及更高版本。这在PEP 484明确提到。
答案 1 :(得分:13)
评估时的语句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]:
我不想成为“你为什么要这样做”的家伙,但也许有两种回归类型不是你想要的:
如果要返回bool以指示某种特殊错误情况,请考虑使用异常。如果你想将bool作为一些特殊值返回,那么一个空列表可能是一个很好的表示。
您还可以指出None
Optional[list]
答案 2 :(得分:4)
Python 3.10 (使用|
):一个函数示例,该函数采用单个参数(为int
或str
并返回{ {1}}或int
:
str
Python 3.5-3.9 (使用def func(arg: int | str) -> int | str:
^^^^^^^^^ ^^^^^^^^^
type of arg return type
):
typing.Union
对于from typing import Union
def func(arg: Union[int, str]) -> Union[int, str]:
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
type of arg return type
的特殊情况,您可以使用Optional[X]
。
答案 3 :(得分:3)
如果有人登陆这里搜索“如何指定多个返回值的类型?”,请使用Tuple[type_value1, ..., type_valueN]
from typing import Tuple
def f() -> Tuple[dict, str]:
a = {1: 2}
b = "hello"
return a, b