Python * apropos *命令

时间:2013-06-02 19:51:20

标签: python matplotlib

我正在寻找所有具有可调参数的函数。

其中一个功能是 matplotlib.pyplot.figure()。add_axes 。 help(matplotlib.pyplot.figure()。add_axes)描述了该参数,该参数可以出现在 kwargs 字典中。

我试过pydoc.apropos

from pydoc import apropos

In [8]: apropos ('adjustable')
No handlers could be found for logger "OpenGL.Tk"

In [9]: 

这就是它返回的所有内容(关键)。

找到我要找的东西的一种蛮力方法是从/ usr / share / grep python的源代码。但我需要从当前的python环境(仅在评估程序中加载的内容)中执行此操作。

3 个答案:

答案 0 :(得分:3)

我刚注意到你正在使用IPython,如果有的话,那里有一个名为grasp的扩展程序,它实现了自己的apropos版本,可能在这里很有用。

文档甚至在其示例中使用了matplotlib

答案 1 :(得分:1)

apropos只搜索所有模块的单行摘要,而不是每个单个函数的每个文档字符串,因为这不可行(已经按apropos导入每个模块并搜索它docstring是一个很大的开销。)

即使这样,在add_axes的情况下它也找不到任何东西,因为你的搜索词不是单行描述的一部分。

我很害怕如果你需要这样的功能,你需要自己实现它。

答案 2 :(得分:1)

这是一个快速编写的函数,它使用ast遍历指定路径中的所有当前包,以查找匹配的参数,并为每个匹配返回(filename, funcname, line_no)

import ast
import pkgutil
import os.path

class FindParameter(ast.NodeVisitor):
    def __init__(self, parameter):
        self.parameter = parameter
        self.found = []

    def visit_FunctionDef(self, node):
        for arg in node.args.args:
            if getattr(arg, 'id', None) == self.parameter:
                self.found.append(node)

def apropos(parameter, path=None):
    paramFinder = FindParameter(parameter)
    for importer, modname, is_package in pkgutil.iter_modules(path=path):
        try:
            loader = importer.find_module(modname)
            loader.get_code()
            if loader.source:
                tree = ast.parse(loader.source, filename=loader.filename)
                paramFinder.visit(tree)
        except SyntaxError:
            pass # avoid any broken code in the current path
    return [ (loader.filename, found.name, found.lineno) for found in paramFinder.found ]

all_selfs = apropos('self')