我正在使用Python Interactive Shell(Windows XP下的ActiveState ActivePython 2.6.4)。我创建了一个能够实现我想要的功能。但是,我已经清除了屏幕,因此我无法返回查看功能定义。它也是一个多线函数,因此重新显示行的向上箭头具有最小值。反正有没有返回函数的实际代码? dir()显示“代码”和“func_code”属性,但我不知道它们是否包含我需要的内容。
答案 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属性是一个表示函数字节码的对象,你可以从这个对象获得的唯一东西是字节码本身,而不是“原始”代码。