问题:如何使用类型提示指定多种返回类型
我在python中有一个可以返回a bool
或a 的函数list
。有没有一种方法可以使用类型提示指定返回类型。
例如,这是正确的方法吗?
def foo(id) -> list or bool:
...
回答 0
从文档中
类
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中明确提到了这一点。
回答 1
该语句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]:
我不想成为“您为什么仍要这样做”的家伙,但是也许您不想要2种返回类型:
如果要返回布尔值以指示某种特殊的错误情况,请考虑改用Exceptions。如果您要返回布尔值作为某些特殊值,则空列表可能是一个很好的表示。您还可以指出None
可以返回Optional[list]
回答 2
如果有人登陆这里搜索“如何指定多个返回值的类型?”,请使用 Tuple[type_value1, ..., type_valueN]
from typing import Tuple
def f() -> Tuple[dict, str]:
a = {1: 2}
b = "hello"
return a, b