如何在IPython中显示动态创建(“自定义”)函数的源代码?

时间:2012-04-18 17:33:53

标签: python function ipython

在IPython会话中,我通常定义自定义函数...问题是,有时我想看到这些函数的实际代码。到目前为止,我还没有找到一种方法来显示它。用?和??只返回“动态生成的函数。没有可用的源代码”。有没有办法显示用户定义函数的源代码?

4 个答案:

答案 0 :(得分:2)

尝试搜索历史记录:

In [22]: for l in _ih:
   ....:     if l.startswith('def f'):
   ....:         print l
   ....:         
   ....:         
def f():
    a= 1
    b = 2
    return a*b

虽然这是非常基本的,但更好的版本会解析/运行历史记录并查看是否可以恢复功能

答案 1 :(得分:2)

如果您正在寻找交互式定义函数的源代码,您可以在iPython的历史中找到它的最新定义:

[i for (i, l) in  enumerate(_ih) if l.startswith('def foo(')][-1]

然后你可以编辑那一行:

%edit 42

它将打开记事本或其他带有功能定义的文本编辑器。

或者您可以保存到文件中:

%save foo.py 42

答案 2 :(得分:2)

我正在使用python 2.7.4和iPython 0.13.2。

我可以在函数名前使用??在iPython中看到动态创建函数的来源:

In [8]: ??sort_words
Type:       function
String Form:<function sort_words at 0x189b938>
File:       /tmp/ipython_edit_yc1TIo.py
Definition: sort_words(s)
Source:
def sort_words(s):
    x = re.findall(r'\W+(\w+)', s)
    x.sort()
    for i in x:
        print i

现在可能会在较新版本的iPython中使用它?你用的是哪个版本?

答案 3 :(得分:0)

如果符合以下情况,则认为IPython中的Fumctions是动态生成的:

  • 它们是元编程的 - 它们是由另一个函数创建的。在这种情况下,它不是源代码,它根本就不存在。

  • 它们在创建它们的不同命名空间中被引用,并且没有关于它们最初所在的命名空间的信息。在这种情况下,找出它们最初的位置并运行?从那里。