2017-02-25 71 views
1

我想知道爲什麼要在python中使用類型註釋。對於爲例我可以寫這樣的功能:爲什麼要在python中使用類型3.5 +

def some_function(a: int, b: int) -> int: 
    return a + b 

當我和INT使用它都走了好:

some_function(1, 2) # return 3, type int 

但是當我運行爲例

some_function(1, 2.0) # return 3.0, type float 

我有結果,沒有任何注意類型是錯誤的。那麼使用類型註釋的原因是什麼?

+0

類型提示不在運行時強制執行。在你的項目上運行'mypy'會被告知你正在使用'some_function()'錯誤。 –

+0

IDE支持.... –

回答

3

類型提示有其他工具檢查您的代碼,它們沒有在運行時強制執行。目標是啓用靜態分析工具來檢測無效的參數使用。

使用像PyCharm這樣的IDE,或者commandline code checker mypy被告知2.0不是有效的參數類型。

Type Hinting PEP (484)

這PEP旨在爲類型註釋的標準語法,開放的Python代碼更容易靜態分析和重構,潛在的運行時類型檢查,以及(也許,在一些上下文)利用類型信息生成代碼。

強調我的。運行時類型檢查留給第三方工具。請注意,這樣的運行時檢查會帶來性能下降,如果您要在每次調用時檢查類型,代碼可能會運行得更慢。

+0

謝謝你的迴應。另外,在代碼中使用它是一個好習慣嗎? –

+0

@OleksandrDashkov:絕對!我們在Facebook上使用它來使大型項目的工作更輕鬆並減少錯誤。 –

+0

快速問題,你是通過存根提供它們還是直接將它們添加到源文件中? –

1

正如人們可以在PEP 484 that introduces type hints閱讀:

(...)

這PEP旨在爲註釋類型提供了標準語法, 開放Python代碼容易靜分析和重構, 潛在運行時類型檢查,和(可能在某些情況下)代碼 代利用類型信息

在這些目標中,靜態分析是最重要的。這包括脫機型跳棋如mypy,以及提供 一個標準的符號可以由的IDE代碼完成和 重構可以使用 支持。

IDE的(靜態分析)

所以主要用途是靜態分析:當你調用一個函數,並能提供的功能列表,你可以叫上你的IDE可以檢測到什麼是錯的函數的結果。

舉例來說,如果你寫:

some_function(1,2). 

您的IDE可以提供一個清單,real作爲一個可能的選項,以便您可以輕鬆地編寫:

some_function(1,2).real 

,如果你寫:

some_function('foo',2).bar 

這將暗示'foo'不是一個可接受的參數,也不是.bar對該對象的良好調用。

動態檢查

您還可以使用inspect.getfulargspec使用它的動態檢查,如:

>>> import inspect 
>>> inspect.getfullargspec(some_function).annotations 
{'return': <class 'int'>, 'a': <class 'int'>, 'b': <class 'int'>} 

現在我們知道,some_function返回int,可以feeded 2 int秒。這可以用於任意測試(在Haskell中很流行):您只需提供some_function隨機整數並且看起來總是返回int(並且不會引發例外情況)。

相關問題