你可以看到,getmembers() 返回一個元組與對象的名稱在第一位置和第二位置的實際對象,我們可以用遞歸遍歷對象層次。
對于檢索到的每一個項目,可能使用 getdoc() 或 getcomments() 獲取文檔字符串和注釋。對于每一個功能,我們可以使用 signature() 得到 Signature 對象 ,它表示其位置參數(shù)和關(guān)鍵字參數(shù)的默認(rèn)值和任何注釋,為我們提供了產(chǎn)生簡單直接的描述和良好風(fēng)格的文本,有助于我們理解用戶我們寫代碼的意圖。
其他考慮因素和非預(yù)期后果
請注意,上面的代碼只是示例代碼,只是讓你大概真的最終產(chǎn)品應(yīng)該是什么樣子。在最終確定產(chǎn)品之前,還有很多其他注意事項:
getfunctions 和 getclasses 將顯示模塊中導(dǎo)入的所有方法和類。包括內(nèi)置程序包,以及來自外部軟件包的任何東西,所以你必須過濾掉更多的 for 循環(huán)。我在檢查過程中使用模塊的 __file__ 屬性,不管它包含什么項。換句話說,如果項在我正在執(zhí)行的路徑中存在的模塊內(nèi)定義,則包含它(使用 os.path.commonprefix())。
有一些 gotcha 的文件路徑,導(dǎo)入層次結(jié)構(gòu)和名稱。像通過 __init__.py 將 moduleX 導(dǎo)入到包中時,你可以通過 package.moduleX.function 訪問他的函數(shù)方法,但是全稱將會是 package.moduleX.moduleX.function—通過 moduleX.__name__ 返回的名稱。你或許不在乎這個區(qū)別,但是我在乎,所以這是在迭代過程中需要記住的事情。
你會從內(nèi)置程序庫中導(dǎo)入類和任何其他不包含 __file__ 的東西,如果你進(jìn)行任何如上所述的過濾,那么檢查是必要的。
因為這是 markdown,而我們只是導(dǎo)入 docstrings,你可以在你的 docstrings 中包含 mardown 語法,它會美觀漂亮的呈現(xiàn)在頁面中。然而,這意味著你應(yīng)該注意正確的轉(zhuǎn)義 docstrings,這樣他才不會破壞生成的 HTML。
示例輸出
我在 sofi 包-精確的說是 sofi.app 模塊運行生成器,下面是它創(chuàng)建的 markdown 內(nèi)容。
# sofi<a name="sofi"></a><a name="sofi.__init__"></a>### [sofi](#sofi).\_\_init\_\_```python__init__(self)```<a name="sofi.addclass"></a>### [sofi](#sofi).addclass```pythonaddclass(self, selector, cl)```Add the given class from all elements matching this selector