研究未知Python API的简便方法

时间:2010-06-14 15:42:59

标签: python api

在研究未知Python代码片段时,我偶尔会遇到

varName.methodName()

图案。

为了弄清楚这是什么,我将更多地研究代码,找到varName被实例化的位置,找到它的类型。因此,如果 varName 被证明是 ClassName 类的实例,我就知道 methodName() ClassName的方法

有时 varName == self methodName()是此类的方法,或者是从其他类继承的方法,如果当前类正在继承其他一些类。

是否有快速方法/工具可以将'methodName'作为输入,扫描所有已安装的Python模块并显示哪些类具有 methodName()

我所知道的与此相关的最接近的是ipython。如果我键入一个类名,然后点('。')然后TAB,它可以显示类成员。而不是类我可以使用对象的名称(这是某个类的实例),它也可以工作。一旦我从提供的选项中选择方法名称,我就可以输入'?'要么 '??'如果有文档字符串,请寻求帮助。

我想知道ipython是否只能根据'methodName'字符串进行智能扫描。

如果你知道ipython的替代方案可能对此有所帮助,请建议他们。

编辑:根据要求,我明确地添加了一种方法,可以通过Python源代码文件中的方法名称 来查找方法。一些Python包(特别是PyQt)包含很多.so文件,而ipython可以通过首先导入它们来完成完成。因此像grep(甚至是ctags)这样的纯文本搜索在这里不会起作用。

6 个答案:

答案 0 :(得分:3)

你想要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

现在,引用this article

  

当你发现一个功能时,请说   打电话你想看到的   定义,只需将光标指向   那个功能并按下ctrl]和它   会把你带到那里。如果你想   简单地回到你来自的地方   按ctrl t。而不是ctrl t,我   喜欢使用ctrl i和ctrl o来   前进和后退的旅行   检查点。

此外,对于tags中找到的标识符,control-P执行(某些尝试)代码完成。 (vim中的:help tags将为您提供更多详细信息。)

答案 1 :(得分:2)

我有时会在代码中插入help(varName),这样当运行该特定函数时,帮助文件会显示出来。例如,如果我有这段代码:

def foo(bar):
    bar.baz()

我想弄清楚什么是类吧,什么是.baz,我只是插入这个

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

然后运行脚本。另一种侵入性较小的方法是使用print type(bar)

答案 2 :(得分:1)

我采用类似于Lie Ryan的交互式方法:在调试模式下运行脚本,在感兴趣的行设置一个中断,并以交互方式查询相关变量。

这是一种比你请求的“扫描源代码寻找匹配方法名称”更强大的方法,因为它可以保证为你提供你实际想知道的变量,而不是返回一组可能的变量。

答案 3 :(得分:0)

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

运行此功能将启动带有搜索框的小型Tkinter窗口。您可以搜索所有已安装的python模块的自动生成的文档,或者在顶级文档中打开浏览器。

答案 4 :(得分:0)

如果您在IDE中使用EclipsePyDev,则可以使用PyDev Globals浏览器。您可以搜索模块,类,方法和函数。单击结果将打开源文件并将光标移动到定义对象的行。

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

您也可以点击F3跳转到光标所在变量的定义。例如,如果光标位于import util之类的行上,点击F3将打开util.py。

答案 5 :(得分:0)

鉴于您的编辑器是vim,我可以建议ropevim。它使用rope,一个Python重构库。 ropevim的两个功能是“查找事件”和“goto定义”。这两个都可以帮助您导航源树。