2015-11-26 138 views
34

我有一个python函数,可以返回boollist。有没有办法使用类型提示来指定返回类型。如何使用类型提示指定多个返回类型

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

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

你如何最终与列表或布尔? –

+6

@PadraicCunningham也许实现是*我会发给你我的ID,你给我一个列表或布尔*:D –

回答

47

documentation

typing.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中明确提到。

+0

是否有Python 3.4中的等价物 –

+1

@YahyaUddin Nope - [PEP 484](https:// www.python。org/dev/peps/pep-0484 /):'(....它仅适用于Python3.5以上版本。 –

+0

但是我知道类型提示仍然适用于Python 3.4以及'def foo(id:str)'。这是否也是类型提示? –

4

陈述def foo(client_id: str) -> list or bool:评估时相当于 def foo(client_id: str) -> list:,因此不会做你想做的。

描述“A或B”型提示本机方式是Union(感谢Bhargav饶):

def foo(client_id: str) -> Union[list, bool]: 

我不想成为“为什么你无论如何要做到这一点“家伙,但可能有2种返回类型不是你想要的:

如果你想返回一个bool来指示某种类型的特殊错误情况,请考虑使用Exceptions来代替。如果你想返回一个布尔值作为一些特殊值,也许一个空列表将是一个很好的表示。 你也可以指出,None可能会返回Optional[list]

+2

有些用途可能会返回多种类型:例如,如果您需要返回某些子类型集合中的一个,但不返回其他子类型,或者您正在尝试处理数据并希望在处理时返回原始表单不可用。另外,如果你打包遗留代码,它可能非常有用,因为它有助于升级过程和/或看到尴尬的地方。 –

+0

异常和空列表的想法也很有帮助。谢谢 –

相关问题