如果您正嘗試去處理元類,或者正受困于 Twisted 中的異步編程,或者正在研究由于使用了多分派而使您精疲力盡的面向對象編程,那么您完全錯了!PEAK 將所有這些中的一些要素組合到了一個組件編程框架中。PEAK 還存在一些小問題。類似于 Twisted,PEAK 的文檔 -- 盡量數量巨大 -- 難以看懂。但是盡管如此,關于 Python 領袖 Phillip J. Eby 領導的這一項目還是有一些東西非常值得關注;而且,我覺得,有機會進行極具生產價值的并且層次特別高的應用程序開發。
PEAK 包由許多不同用途的子包組成。一些重要的子包是 peak.api、 peak.binding、 peak.config、 peak.naming 和 peak.storage 。那些名字大部分是自我解釋性的。子包 peak.binding 用于組件間的靈活連接; peak.config 讓您可以存儲“很少改變的(lazily immutable)”數據,這些數據與聲明性應用程序(declarative application )編程有關; peak.naming 讓您可以為(網絡的)資源創建全局惟一的標識符; peak.storage 顧名思義讓您可以管理數據庫和持久內容。
不過,對本文來說,我們將關注的是 peak.api 。特別是 PyProtocols 包,它可以單獨獲得并為其他 PEAK 子包提供一個基礎設施。在 peak.api.protocols 中包括了 PyProtocols 包的一個版本。不過現在我所感興趣的是研究一個獨立的 protocols 包。在以后的部分,我將返回來討論 PEAK 其他部分的話題。
什么是協議?
抽象地說,協議只是對象同意遵循的一組行為。強類型(Strongly-typed)編程語言 -- 包括 Python -- 都有一個基本類型的集合,每個基本類型都有一組得到保證的行為:Integer 知道如何去求它們自己的乘積;list 知道如何去遍歷它們的內容;dictionary 知道如何根據一個關鍵字找到相應的值;file 知道如何去讀和寫字節;諸如此類。您可以預期的內置類型的行為集合構成了它們實現的一個 協議。對協議進行系統化的對象被稱為 接口(interface)。
對標準的類型而言,將實現的所有行為全部列出并不太困難(盡管不同的 Python 版本之間會稍有不同;或者,不同的編程語言之間當然會有差別)。但是,在邊界 -- 對于屬于自定義類的對象來說 -- 難以聲明最終是什么構成了“類-dictionary”或“類-file”的行為。大部分情況下,只實現了比如內置的 dict 類型的方法的一個子集 -- 甚至是相當小的子集 -- 的自定義對象,就足夠“類-dictionary”而可以滿足當前的要求。不過,能顯式地整理出一個對象要用到的函數、模塊、類或者框架中需要能夠做哪些事情,將是很吸引人的。那就是 PyProtocols 包所做到的(一部分)。
在具有靜態類型聲明的編程語言中,為了在新的上下文中使用數據,您通常需要將其自一個類型 強制類型轉換(cast)或者 轉換(convert)到另一個類型。在其他語言中,轉換根據上下文的需要隱式地進行,這些被稱為 強迫同型(coercions)。Python 中既有強制類型轉換也有強迫同型,通常使用更多的是前者(“顯式優于隱式”)。您可以將向一個浮點數加到一個整型數,結果得到一個更為通用的浮點數;但是如果您希望將字符串 "3.14" 轉換為一個數字,那么您需要使用顯式的構造函數 float("3.14") 。
新聞熱點
疑難解答