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

如何在IPython中显示动态创建的(“自定义”)函数的源代码?,python,function,ipython,Python,Function,Ipython,在IPython会话中,我通常定义自定义函数……问题是,有时我想看到这些函数的实际代码。到目前为止,我还没有找到一种方法来展示这一点。使用?那么??只返回“动态生成的函数。没有可用的源代码”。是否有任何方法显示用户定义函数的源代码?尝试搜索历史记录: In [22]: for l in _ih: ....: if l.startswith('def f'): ....: print l ....: ....: d

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

尝试搜索历史记录:

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

虽然这是非常基本的,但更好的版本会解析/运行历史记录,并查看是否可以取回函数

如果您正在查找交互式定义函数的源,您可以在iPython的历史记录中找到该函数的最新定义:

[i for (i, l) in  enumerate(_ih) if l.startswith('def foo(')][-1]
然后可以编辑该行:

%edit 42
它将打开记事本或另一个包含函数定义的文本编辑器

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

%save foo.py 42

我使用的是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
[8]中的
:?对单词进行排序
类型:功能
字符串形式:
文件:/tmp/ipython\u edit\u yc1TIo.py
定义:对单词进行排序
资料来源:
def sort_单词:
x=re.findall(r'\W+(\W+),s)
x、 排序()
对于x中的i:
打印i

也许现在iPython的较新版本中有此功能?您使用的是什么版本?

如果出现以下情况,则认为IPython中的功能是动态生成的:

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

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


是什么让功能“定制”?你能提供一些源代码来说明你是如何创建它们的吗?比如:
def blah(d,b):return(d>10和b)你有什么版本的IPython?在最近的版本中,
f???
可以在交互式定义的函数上工作。你可以在IPython 0.12中试用,看看它是否有效;-)@ThomasK确实有效,谢谢。更新IPython的时间到了……这是可行的,尽管在这个特定的例子中我使用了%粘贴,所以它显示的只是该行的magic paste命令。很好的解决方案,但我不确定我是否理解您的“元编程”情况:在IPython 1.1.0中,可以使用
??
查看在另一个函数中创建的函数代码(
def():def g():…return g
)。是的,这是正确的;当(我认为)0.12不是稳定版本时,我问了这个问题,而这在0.11中是不可用的。参见Thomas K对该问题的评论