Python反射 - 我可以使用它来获取方法定义的源代码

Sat*_*ali 10 python reflection

重复..


我有一个成功运行的方法定义,但想在运行时修改它.

例如:如果我有方法

def sayHello():
    print "Hello"
Run Code Online (Sandbox Code Playgroud)

type(sayHello)给我答案'type function'.我能获取此函数对象的源代码字符串吗?它被认为是安全问题吗?

the*_*ler 19

使用检查模块:

import inspect
import mymodule
print inspect.getsource(mymodule.sayHello)
Run Code Online (Sandbox Code Playgroud)

必须在导入的模块中定义该函数.

  • 我必须在所有内容上使用括号,即“print(inspect.getsource(mymodule.sayHello))”,我认为这是Python3的事情。 (2认同)

Run*_*ard 5

要获取类实例上方法的来源,请执行以下操作:

import inspect
myobj = MyModel()
print inspect.getsource(myobj.my_method)
Run Code Online (Sandbox Code Playgroud)

阅读更多:https ://docs.python.org/2/library/inspect.html#inspect.getsource


unw*_*ind 3

sayHello.func_code.co_code返回一个我认为包含该方法的编译代码的字符串。由于 Python 在内部将代码编译为虚拟机字节码,因此这可能就是剩下的全部了。

不过你可以拆解它:

import dis

def sayHello():
  print "hello"

dis.dis(sayHello)
Run Code Online (Sandbox Code Playgroud)

这打印:

   1 0 LOAD_CONST 1('你好')
               3 打印项目
               4 PRINT_NEWLINE
               5 LOAD_CONST 0(无)
               8 返回值

看看Decompyle的反编译器。