簡體   English   中英

如何在現有 python 項目中最好地找到代碼實現

[英]How to best find code implementations in existing python projects

不同的人告訴我,為了提高我的 Python 編程技能,去看看現有項目是如何實現的會很有幫助。 但是我在瀏覽這些項目並找到我感興趣的代碼部分時有些吃力。

假設我正在使用 scipy.signal 包的黃油,我想知道它是如何實現的,所以我要去scipy 的 github repo並移動到signal文件夾。 現在,我應該從哪里開始尋找黃油的實施?

我對什么是模塊/包/類/函數也有些困惑。 scipy是一個模塊嗎? 還是一個包裹? 那么什么是signal 有沒有像module.class.function這樣的模式? (或另一個例子: matplotlib.pyplot ...)

聽起來你在這里有兩個問題。 首先,您如何找到scipy.signal.butter的實現位置? 其次,Python 代碼的不同層次單元是什么(以及它們與butter的關系如何)?

第一個實際上有一個簡單的解決方案。 如果您點擊為butter函數提供的鏈接,您將在函數簽名的右側看到一個[source]鏈接。 單擊該按鈕將直接帶您到 github 存儲庫中的函數源(固定到與您正在閱讀的文檔版本匹配的提交,這可能是您想要的)。 並非所有 API 文檔都有這種鏈接,但是當它出現時,它會讓事情變得非常簡單!

至於第二個問題,我不打算完全解釋每個級別,但這里有一些粗略的介紹,從最狹窄的代碼組織方式開始,然后轉向更廣泛的方式。

  1. 函數是可以從其他代碼調用的可重用代碼塊。 函數在運行時具有本地命名空間。

  2. 類是將數據與一個或多個函數一起組織的方式。 在類中定義的函數稱為方法(但並非所有函數都需要在一個類中)。 類有一個類命名空間,一個類的每個實例也有它自己的實例命名空間。

  3. 模塊是一組代碼,通常是函數或方法(但有時也包括其他東西,如數據)。 每個模塊都有一個全局命名空間。 一般來說,每個.py文件在加載時都會創建一個模塊。 一個模塊可以使用import語句訪問另一個模塊。

  4. 包是一種特殊的模塊,由文件夾foo/定義,而不是foo.py文件。 這使您可以組織整個模塊組,而不是所有內容都處於同一級別。 包可以有更多的子包(用嵌套文件夾表示,如foo/bar/ )。 除了可以導入的模塊和子包之外,包還將有自己的常規模塊命名空間,將通過運行foo/__init__.py文件來填充。

為了回到您的具體問題,在您的情況下, scipy是一個頂級包,而scipy.signal是其中的一個子包。 名稱butter是一個函數,但它實際上是在scipy/signal/_filter_design.py文件中定義的。 您可以直接從scipy.signal訪問它,因為scipy/signal/__init__.py使用from ._filter_design import *導入它(以及在其模塊中定義的所有其他名稱)(參見此處)。

在內部模塊中實現某些東西然后將其導入以在包的__init__.py文件中使用的設計是一種非常常見的設計。 它有助於將過大的模塊細分,以方便他們的開發人員,同時仍然有一個地方可以訪問大量 API。 然而,為自己鍛煉是非常令人困惑的,所以如果你自己無法解決,也不要感到難過。 有時您可能需要搜索存儲庫以查找某些內容的定義,即使您知道從哪里導入它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM