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


204

我在python中有一个可以返回a bool或a 的函数list。有没有一种方法可以使用类型提示指定返回类型。

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

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

5
您如何以列表或布尔值结束?
Padraic Cunningham 2015年

11
@PadraicCunningham也许实现的方法是我将您的ID发送给您,或者您将列表或布尔值发送给我:D
Bhargav Rao

大概也就是执行不力
斯瓦沃米尔Lenart

@PadraicCunningham多态性。如果函数对输入执行检查,无论它是什么,您都希望在输入一个变量时获取布尔值,或者在输入变量列表时获取布尔值列表。
Guimoute

Answers:


281

文档中

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


Python 3.4是否具有等效功能
Yahya Uddin

1
@YahyaUddin都能跟得上- PEP 484:'(....这只是对Python3.5向上。
Bhargav饶

1
@YahyaUddin非常令人惊讶。您是不是偶然使用功能注释
巴尔加夫(Bhargav Rao)

2
所以让我看看我是否明白了。Python 3.4具有功能注释,除了未强制执行的注释外,没有执行任何其他操作。但是在Python 3.5中,这是实际的类型检查。
Yahya Uddin

1
@BhargavRao,对此感到抱歉!我只是觉得离开评论部分太重要了。
Bobort

26

该语句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]


6
在某些情况下,可能需要返回多种类型:例如,如果您需要返回一组子类型中的一种,而不是其他子类型,或者您试图处理数据并希望在处理过程中返回原始格式,没有。另外,如果要包装旧代码,它可能会非常有用,因为它有助于升级过程和/或查看不便之处。
纳撒尼尔·福特

例外和空列表的想法也很有帮助。谢谢
Yahya Uddin

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.