2015-11-26 69 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

異常和空列表的想法也很有幫助。謝謝 –

相關問題