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. 有没有一种方法可以在不导入整个模块的情况下做到这一点,或者有一种更强大的方法来做到这一点?
4

1 回答 1

5

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

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

In general, finding the code of a function is not always super easy. On python 3 you can always access the code object, but most of the time, as soon as you have things like decorated function, or dynamically generated function, it becomes difficult. I suppose you could also inspire from psource/pinfo2 and have them return info instead of paging it.

于 2013-12-18T20:41:46.480 回答