3

当 Python 对象被动态创建时,无论是在实时解释器会话中,通过解组腌制对象或其他方式,该inspect模块不能再用于检索其源代码(因为inspect依赖于源已被从磁盘上的某个文件编译)。

如果我有这样一个简单的类:

>>> class Foo(object):
...     def __init__(self):
...             self.a = 100
...     def bar(self):
...             print 'hello'
... 
>>> f = Foo()
>>> 

是否有一些直接的方法来获取Foo类或f对象的源代码?

我知道至少有一些方法可以解决这个问题的一部分。例如,可以使用inspect.getmembers查找 的所有成员f,遍历成员以查找可调用和不可调用,使用inspect.getargspec确定方法签名等。从所有这些来看,至少可以重新生成一些源代码,但不能重新生成每个方法中的代码。模块可以生成每个方法的字节码版本dis,但仍需要将其反编译成源代码。

有没有更好的方法来做到这一点,我错过了?可以用 的结果做些sys._getframe()什么吗?

4

1 回答 1

2

您无法获得源代码,但您可以获得字节码,并且可以使用 stdlibdis模块进行反汇编。有一点经验的人通常可以很容易地读取字节码。

于 2012-07-16T01:14:30.103 回答