如何在IPython notebook中显示程序包函数的源代码

11
为了教学目的,我希望有一个IPython笔记本可以显示函数源代码(作为单元格输出),但我想在多个笔记本中引用它。因此,我想以类似于使用%psource 魔法的方式显示函数代码,但要适当地进行语法高亮。
这与此问题类似,但我想将其应用于文件中的单个函数,而不是一次应用于整个文件。
使用上一个问题中的建议,我编写了一个简短的代码,在简单的情况下可以工作:
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. 这个代码片段建议可以通过定义适当的单元格魔法来显示整个函数。是否可以定义适当的单元格魔法来仅显示单个函数,如上所述?
  2. 是否有一种方法可以在不导入整个模块的情况下完成这个任务,或者有一个更健壮的方式来完成这个任务?
1个回答

5

1)Magics只是简单的函数,定义起来并不难。如果我没记错的话,你可以在这里 Customizing IPython - Config.ipynb找到一些相关信息。但我不确定在你的情况下是否值得定义一个magic。

2)大多数情况下,不需要。我们需要实时代码才能知道它的定义位置,所以你必须导入该模块。

总的来说,查找函数代码并不总是很容易的事情。在Python3中,你始终可以访问代码对象,但通常情况下,一旦涉及到装饰函数或动态生成函数等,就变得困难了。我想你也可以从psource/pinfo2中获取灵感,让它们返回信息而不是分页。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接