如何在IPython笔记本中显示包函数的源代码

时间:2013-12-18 17:56:24

标签: python ipython ipython-notebook ipython-magic

出于教学目的,我想要一个IPython笔记本显示(作为单元格的输出)功能源代码,但我希望能够在多个笔记本中引用它。因此,我希望以类似于使用%psource 魔术的方式显示功能代码,但会突出显示语法。

这是与this question类似的问题,但我希望能够将其应用于文件中的单个函数,而不是一次性应用于完整文件。

使用上一个问题的建议我破解了一个简单的短代码:

def print_source(module, function):
    """For use inside an IPython notebook: given a module and a function, print the source code."""
    from inspect import getmembers, isfunction, getsource
    from pygments import highlight
    from pygments.lexers import PythonLexer
    from pygments.formatters import HtmlFormatter
    from IPython.core.display import HTML

    internal_module = __import__(module)

    internal_functions = dict(getmembers(internal_module, isfunction))

    return HTML(highlight(getsource(internal_functions[function]), PythonLexer(), HtmlFormatter(full=True)))

两个问题:

  1. This gist表明可以通过定义适当的细胞魔法来显示整个功能。是否可以定义一个合适的单元魔术来显示单个函数,如上所述?
  2. 有没有一种方法可以在不导入整个模块的情况下执行此操作,还是采用更强大的方式执行此操作?

1 个答案:

答案 0 :(得分:5)

1)魔法只是简单的功能并不难定义,如果我没记错的话你可以看看here Customizing IPython - Config.ipynb。我仍然不确定在你的情况下确定一个魔法是值得的。

2)大多数时候,没有。您必须导入模块,因为我们需要实时代码来了解它的定义位置。

一般来说,找到函数的代码并不总是非常简单。在python 3上,你总是可以访问代码对象,但大多数时候,只要你有装饰函数或动态生成函数之类的东西,它就变得很难。我想你也可以从psource / pinfo2启发并让他们返回信息而不是分页。