簡體   English   中英

研究未知Python API的簡便方法

[英]Easy ways to investigate unknown Python APIs

在研究一段未知的Python代碼時,我偶爾碰到了

varName.methodName()

圖案。

為了弄清楚這是什么,我將更多地研究代碼,找到varName實例化的位置,找到它的類型。 因此,如果varName被證明是ClassName類的一個實例,我就知道methodName()ClassName的一個方法。

有時varName == selfmethodName()是此類的方法,或者是從其他類繼承的方法,如果當前類是其他類的子類。

是否有快速方法/工具可以將'methodName'作為輸入,掃描所有已安裝的Python模塊並顯示哪些類具有methodName()

我所知道的與此相關的最接近的是ipython。 如果我鍵入一個類名,然后點('。')然后TAB,它可以顯示類成員。 而不是類我可以使用對象的名稱(這是某個類的實例),它也可以工作。 一旦我從提供的選項中選擇方法名稱,我就可以輸入'?' 要么 '??' 如果有文檔字符串,請獲得一些幫助。

我想知道ipython是否可以僅根據'methodName'字符串進行一些智能掃描。

如果您知道ipython的替代方案可能有助於此,請建議他們。

編輯:根據要求,我明確地添加了我想要一種方法來查找方法名稱的方法, 不僅僅是在Python源代碼文件中。 一些Python包(特別是PyQt)包含很多.so文件,而ipython可以通過首先導入它們來完成完成。 因此像grep(甚至是ctags)這樣的純文本搜索在這里不會起作用。

你想要Exuberant ctags (舊的ctags不會為Python生成標簽)。

一旦安裝(這樣做的方式取決於您的平台),在您的文件上運行它:

$ /usr/local/bin/ctags *py

(您可以多次運行它以將標記附加到現有標記文件,將其遞歸到子目錄等,所有這些都使用命令行選項)並且它生成一個類似於以下的tags文件(為簡潔起見,我使用的是單個Python一個類定義單個方法的文件):

$ cat tags
!_TAG_FILE_FORMAT   2   /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED   1   /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_PROGRAM_AUTHOR    Darren Hiebert  /dhiebert@users.sourceforge.net/
!_TAG_PROGRAM_NAME  Exuberant Ctags //
!_TAG_PROGRAM_URL   http://ctags.sourceforge.net    /official site/
!_TAG_PROGRAM_VERSION   5.7 //
Foo a.py    /^class Foo(object):$/;"    c
amethod a.py    /^  def amethod(self): pass$/;" m   class:Foo

現在,引用這篇文章

假設當你發現一個你想看到定義的函數調用時,只需將光標指向該函數並按下ctrl]它就會將你帶到那里。 如果你想回到你來自的地方,只需按ctrl t。 而不是ctrl t,我喜歡使用ctrl i和ctrl o來前進和后退檢查點。

此外,control-P對tags標識符執行(某些嘗試) 代碼完成 :help tags vim中的:help tags會為您提供更多詳細信息)。

我有時會在我的代碼中插入help(varName) ,這樣當運行該特定函數時,幫助文件將顯示出來。 例如,如果我有這個代碼:

def foo(bar):
    bar.baz()

我想弄清楚什么是類吧,什么是.baz,我只是插入它

def foo(bar):
    help(bar)
    help(bar.baz)
    bar.baz()

然后運行腳本。 另一種侵入性較小的方法是使用print type(bar)

我將采用類似於Lie Ryan的交互式方法:在調試模式下運行腳本,在感興趣的行中設置中斷,並以交互方式查詢相關變量。

這是一種比您請求的“掃描源代碼尋找匹配方法名稱”更強大的方法,因為它可以保證為您提供您實際想知道的變量,而不是返回一組可能的變量。

您可以使用大多數Python版本附帶的pydoc實用程序。 在Windows上,這通常是C:\\ PythonXX \\ Tools \\ Scripts \\ pydocgui.pyw(其中XX是Python版本)。

運行此命令將啟動帶有搜索框的小型Tkinter窗口。 您可以搜索所有已安裝的python模塊的自動生成的文檔,或者在頂級文檔中打開瀏覽器。

如果將EclipsePyDev一起用於IDE,則可以使用PyDev Globals Browser。 您可以搜索模塊,類,方法和函數。 單擊結果將打開源文件並將光標移動到定義對象的行。

alt text http://www.michaelfogleman.com/static/images/pydev_browser.png

您也可以按F3跳轉到光標所在變量的定義。 例如,如果您的光標位於像import util這樣的行上,則點擊F3將打開util.py.

鑒於您的編輯器是vim,我可以建議使用ropevim 它使用rope,一個Python重構庫。 ropevim的兩個功能是“查找事件”和“goto定義”。 這兩個都可以幫助您導航源樹。

暫無
暫無

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

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