Python 反射 - 我可以用它获取方法定义的源代码吗
重复的问题..
我有一个方法的定义,它运行得很好,但我想在运行时修改它。
比如说:如果我有一个方法
def sayHello():
print "Hello"
当我输入type(sayHello)时,得到的结果是'type function'。我能否获取这个函数对象的源代码字符串?这会被认为是一个安全问题吗?
4 个回答
3
sayHello.func_code.co_code
返回一个字符串,我觉得里面包含了这个方法的编译代码。因为 Python 在内部会把代码编译成虚拟机的字节码,所以这可能就是剩下的全部内容。
不过,你可以对它进行反汇编:
import dis
def sayHello():
print "hello"
dis.dis(sayHello)
这会打印出:
1 0 LOAD_CONST 1 ('hello') 3 PRINT_ITEM 4 PRINT_NEWLINE 5 LOAD_CONST 0 (None) 8 RETURN_VALUE
你可以看看 Decompyle 这个反编译工具。
5
要获取一个类实例中方法的源代码,可以这样做:
import inspect
myobj = MyModel()
print inspect.getsource(myobj.my_method)
想了解更多,可以查看这里: https://docs.python.org/2/library/inspect.html#inspect.getsource
26
使用inspect模块:
import inspect
import mymodule
print inspect.getsource(mymodule.sayHello)
这个函数必须在你导入的模块中定义。