使用Haskell的類型系統我知道在程序中的某個點,一個變量必須包含一個字符串列表的Int。對於編譯的代碼,類型檢查器提供了某些保證,例如我不想添加Int和String。在Python中進行編碼時,如何獲得類似於Haskell類型系統的正確性的保證?
是否有任何工具可以爲Python代碼提供類似的保證?
我瞭解並練習TDD。
使用Haskell的類型系統我知道在程序中的某個點,一個變量必須包含一個字符串列表的Int。對於編譯的代碼,類型檢查器提供了某些保證,例如我不想添加Int和String。在Python中進行編碼時,如何獲得類似於Haskell類型系統的正確性的保證?
是否有任何工具可以爲Python代碼提供類似的保證?
我瞭解並練習TDD。
Python是動態的,強類型編程語言。這意味着你可以定義一個變量而不明確地聲明它的類型,但是當你第一次使用這個變量時,它就會被綁定到某種類型。
例如,
x = 5
是一個整數,並因此現在不能用字符串,例如拼接它x+"hello"
這正是我的問題。做'x = 5; x +「hello」'會導致運行時錯誤。是否有任何Python靜態分析工具可以在不運行代碼的情況下找到像這樣的錯誤? – 2012-01-09 23:34:09
可能你檢查了這一點:http://stackoverflow.com/questions/35470/are-there-any-static-analysis-tools-for-python – Asterisk 2012-01-09 23:36:02
謝謝Asterisk。 – 2012-01-09 23:44:53
快速回答是「不是真的」。雖然像PyLint(這是非常好的順便說一句)工具將給你很多的幫助和良好的建議,什麼是良好的Python風格,這不是你正在尋找的東西,它肯定不是一個真正的替代品像HM型推斷。
在這個領域有一些有趣的研究項目,特別是Jeremy Siek and colleagues的逐步打字以及Wadler和Findler的blame calculus等一些非常有趣的想法。
實際上,我認爲您可以實現的最好方法是使用一些明智選擇的運行時方法。使用inspect module來測試對象的類型(但請記住對Python的鴨子打字等)。寬鬆地使用assert
陳述。或者(可能'和')使用類似Design by Contract的設計,使用decorators。有很多方法來實現這些習語,但這通常是在每個項目的基礎上完成的。如果這種方法對您至關重要,您可能需要考慮這些方法是否以及如何影響程序的性能和資源使用情況。然而,對於像Python這樣的DBC這樣的技術,我們已經做了一些努力,但是這些技術還沒有被推入到cPython中。這裏的希望雖然:)
可能重複[有沒有任何靜態分析工具的Python?](http://stackoverflow.com/questions/35470/are-there-any-static-analysis-tools-for-python ) – wim 2012-01-09 23:54:19
Haskell中的類型系統通常不是真正的正確性保證。這是一個「正確」的本地化概念,因爲它僅限於「預期類型」。而在Python中,「預期類型」通常太有限制。編寫一個可以處理任何數字類型的Python函數很容易,包括函數寫入時未定義的類型。 – 2012-01-10 01:51:39
這個問題在SO上有1000個重複。總之,你在Python中使用鴨子打字。搜索鴨子打字。 – 2012-01-12 13:10:28