不同的人告訴我,為了提高我的 Python 編程技能,去看看現有專案是如何實作的會很有幫助。但是我在瀏覽這些專案并找到我感興趣的代碼部分時有些吃力。
假設我正在使用scipy.signal 包的黃油,我想知道它是如何實作的,所以我要去scipy 的 github repo并移動到該signal檔案夾??。現在,我應該從哪里開始尋找黃油的實施?
我對什么是模塊/包/類/函式也有些困惑。是scipy模塊嗎?還是一個包裹?然后是什么signal?是否有某種模式module.class.function?(或另一個例子:matplotlib.pyplot...)
uj5u.com熱心網友回復:
聽起來你在這里有兩個問題。首先,您如何找到scipy.signal.butter實施的地方?其次,Python 代碼的不同層次單元是什么(以及它們與那個butter東西有什么關系)?
第一個實際上有一個簡單的解決方案。如果您點擊您為函式提供的鏈接,您將在函式簽名的右側butter看到一個鏈接。[source]單擊該按鈕將直接帶您到 github 存盤庫中的函式源(固定到與您正在閱讀的檔案版本匹配的提交,這可能是您想要的)。并非所有 API 檔案都有這種鏈接,但是當它出現時,它會讓事情變得非常簡單!
至于第二個問題,我不打算完全解釋每個級別,但這里有一些粗略的介紹,從最狹窄的代碼組織方式開始,然后轉向更廣泛的方式。
函式是可以從其他代碼呼叫的可重用代碼塊。函式在運行時具有本地命名空間。
類是將資料與一個或多個函式一起組織的方式。在類中定義的函式稱為方法(但并非所有函式都需要在一個類中)。類有一個類命名空間,一個類的每個實體也有它自己的實體命名空間。
模塊是一組代碼,通常是函式或方法(但有時也包括其他東西,如資料)。每個模塊都有一個全域命名空間。一般來說,每個
.py檔案在加載時都會創建一個模塊。一個模塊可以使用import陳述句訪問另一個模塊。包是一種特殊的模塊,由檔案夾
foo/而不是foo.py檔案定義。這使您可以組織整個模塊組,而不是所有內容都處于同一級別。包可以有更多的子包(用嵌套檔案夾表示,如foo/bar/)。除了可以匯入的模塊和子包外,包還將有自己的常規模塊命名空間,這些命名空間將通過運行foo/__init__.py檔案來填充。
回到您的特定問題,在您的情況下,scipy它是一個頂級包,并且scipy.signal是其中的一個子包。名稱butter是一個函式,但它實際上是在scipy/signal/_filter_design.py檔案中定義的。您可以直接訪問它,scipy.signal因為使用(see herescipy/signal/__init__.py )匯入它(以及在其模塊中定義的所有其他名稱)。from ._filter_design import *
在內部模塊中實作某些內容然后將其匯入以在包__init__.py檔案中使用的設計是一種非常常見的設計。它有助于將過大的模塊細分,以方便他們的開發人員,同時仍然有一個地方可以訪問大量 API。然而,為自己鍛煉是非常令人困惑的,所以如果你自己無法解決,也不要感到難過。有時您可能需要搜索存盤庫以查找某些內容的定義,即使您知道從哪里匯入它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/497147.html
標籤:python-3.x github scipy 包裹 代码结构
