问题 如何打印我定义的对象的源代码使用%edit magic


Ipython 0.13.1可以从python库打印一个对象的源,
比如,os.path.abspath ??
但是我无法在ipython中打印通过%ed magic定义的任何对象的源代码,
我做错了什么?
比如,我通过%ed magic定义一个类名:

%ed  

然后

class Name(object):
    """docstring for Name"""
    name = 'hong'
    def __init__(self, arg):
        super(Name, self).__init__()
        self.arg = arg
    def pri():
        print 'class Name'

回到ipython时,我看不到类Name的源代码:

In [59]: Name??
Type:       type
String Form:<class '__main__.Name'>
Docstring:  docstring for Name
Constructor information:
Definition:Name(self, arg)

这是IPython的错误吗?


12216
2017-12-17 06:48


起源



答案:


- 提到OP后的编辑,这在ipython iteself中可见。

排除%ed myfunc后是否有任何错误消息?粘贴可能有助于其他人找到问题。

---更新:

当我尝试Name ??时,我也得到了源代码的简短版本,但Name.pri ??给我一个Name类的pri()成员函数的完整源代码。所以ipython可能有一些约定不能提供类的完整源代码。

这是我的互动:

    In [2]: Name??
    Type:       type
    String Form:<class '__main__.Name'>
    Docstring:  docstring for Name
    Constructor information:
     Definition:Name(self, arg)

    In [3]: Name.pri??
    Type:       instancemethod
    String Form:<unbound method Name.pri>
    File:       /tmp/ipython_edit_8YOfN9.py
    Definition: Name.pri()
    Source:
        def pri():
            print 'class Name'

    In [4]:

10
2017-12-17 22:21



不使用笔记本,我只使用IPython shell,我的意思是IPython shell中的问题 - Honghe.Wu
啊,对不起疏忽。我现在已经修改了答案,寻找可能有助于其他人解决它的错误消息。 - nom-mon-ir
谢谢,我已经重新编辑了它。 - Honghe.Wu
有意思,哈哈 - Honghe.Wu


答案:


- 提到OP后的编辑,这在ipython iteself中可见。

排除%ed myfunc后是否有任何错误消息?粘贴可能有助于其他人找到问题。

---更新:

当我尝试Name ??时,我也得到了源代码的简短版本,但Name.pri ??给我一个Name类的pri()成员函数的完整源代码。所以ipython可能有一些约定不能提供类的完整源代码。

这是我的互动:

    In [2]: Name??
    Type:       type
    String Form:<class '__main__.Name'>
    Docstring:  docstring for Name
    Constructor information:
     Definition:Name(self, arg)

    In [3]: Name.pri??
    Type:       instancemethod
    String Form:<unbound method Name.pri>
    File:       /tmp/ipython_edit_8YOfN9.py
    Definition: Name.pri()
    Source:
        def pri():
            print 'class Name'

    In [4]:

10
2017-12-17 22:21



不使用笔记本,我只使用IPython shell,我的意思是IPython shell中的问题 - Honghe.Wu
啊,对不起疏忽。我现在已经修改了答案,寻找可能有助于其他人解决它的错误消息。 - nom-mon-ir
谢谢,我已经重新编辑了它。 - Honghe.Wu
有意思,哈哈 - Honghe.Wu


最新版本的IPython(不确定确切的版本号)确实显示了源代码:

IPython 0.13 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: %ed
IPython will make a temporary file named: /var/folders/88/zgy_z51x1fn2mp_7vmkj3phm0000gn/T/ipython_edit_g9xYY4.py
Editing... done. Executing edited code...
Out[1]: 'def f(a):\n\treturn a + 3\n'

In [2]: f(4)
Out[2]: 7

In [3]: f??
Type:       function
String Form:<function f at 0x18ddb30>
File:       /var/folders/88/zgy_z51x1fn2mp_7vmkj3phm0000gn/T/ipython_edit_g9xYY4.py
Definition: f(a)
Source:
def f(a):
        return a + 3

还有另外两种获取源的方法。一个是你可以回到你打电话的那一行 %ed,返回值应该是源代码(这里,这是 Out[1]所以你可以做到 print Out[1])。另一个是打电话 %ed f  - 这应该加载当前的定义 f 进入编辑器,并允许您编辑定义。


3
2017-12-19 12:48



功能定义,如你的 def f(a): return a + 3,我也没问题。你可以对一个类对象进行一次尝试。我的IPython是v0.13.1。谢谢 - Honghe.Wu
原来如此。有趣。是的,也许IPython没有打印出类的来源,但不幸的是它不会让你 %ed 它要么....... - illya
我也找到了它。但是你可以通过%ed这个类的函数来编辑整个类,比如我在上面的问题上定义的%ed Name.pri。 - Honghe.Wu