在交互式shell中显示功能定义

时间:2010-02-03 15:55:06

标签: python shell

我正在使用Python Interactive Shell(Windows XP下的ActiveState ActivePython 2.6.4)。我创建了一个能够实现我想要的功能。但是,我已经清除了屏幕,因此我无法返回查看功能定义。它也是一个多线函数,因此重新显示行的向上箭头具有最小值。反正有没有返回函数的实际代码? dir()显示“代码”和“func_code”属性,但我不知道它们是否包含我需要的内容。

4 个答案:

答案 0 :(得分:11)

不,__code__func_code是对已编译字节码的引用 - 您可以对它们进行反汇编(请参阅dis.dis),但不要回到Python源代码。

唉,源代码已经消失了,在任何地方都没有记住......:

>>> import inspect
>>> def f():
...   print 'ciao'
... 
>>> inspect.getsource(f)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/inspect.py", line 694, in getsource
    lines, lnum = getsourcelines(object)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/inspect.py", line 683, in getsourcelines
    lines, lnum = findsource(object)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/inspect.py", line 531, in findsource
    raise IOError('could not get source code')
IOError: could not get source code
>>> 

如果inspect无法达到,那就是一个非常明显的标志。

如果您使用的是GNU readline(基本上是 Windows之外)的平台,您可能会利用readline本身 的事实>记住一些“历史”并将其写入文件......:

>>> readline.write_history_file('/tmp/hist.txt')

然后读取该历史文件 - 但是,我知道在Windows中无法做到这一点。

您可能希望使用某些具有更好内存功能的IDE,而不是“原始”命令解释器,尤其是在Windows等平台上。

答案 1 :(得分:3)

这已经很长时间了但可能有人需要它。 getsource提供了源代码:

>>> def sum(a, b, c):
...  # sum of three number
...  return a+b+c
...
>>> from dill.source import getsource
>>>
>>> getsource(sum)
'def sum(a, b, c):\n # sum of three number\n return a+b+c\n'

安装dill运行pip install dill。要格式化:

>>> fun = getsource(sum).replace("\t", " ").split("\n")
>>> for line in fun:
...  print line
...
def sum(a, b, c):
 # sum of three number
 return a+b+c

答案 2 :(得分:1)

不,不是真的。您可以将yourfunc.func_code.co_code(实际编译的字节码)写入文件,然后尝试使用decompyle或unpyc对它们进行反编译,但这两个项目都是旧的且未维护,并且从未支持反编译。

简单地将函数编写到文件开头就更容易了。

答案 3 :(得分:0)

除非有一种在activestate shell上执行此操作的方法,否则无法检索您在shell上键入的确切代码。至少在Linux上,使用CPython提供的Python Shell没有特殊的方法来实现这一点。也许使用iPython。

func_code属性是一个表示函数字节码的对象,你可以从这个对象获得的唯一东西是字节码本身,而不是“原始”代码。