【问题标题】:Python reflection - Can I use this to get the source code of a method definitionPython反射 - 我可以用它来获取方法定义的源代码吗
【发布时间】:2009-04-22 14:05:23
【问题描述】:

重复..


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

例如: 如果我有方法

def sayHello():
    print "Hello"

type(sayHello) 给了我“类型函数”的答案。我能得到这个函数对象的源代码字符串吗?是否被视为安全问题?

【问题讨论】:

标签: python reflection


【解决方案1】:

使用检查模块:

import inspect
import mymodule
print inspect.getsource(mymodule.sayHello)

函数必须在您导入的模块中定义。

【讨论】:

  • 我不得不在所有内容周围使用括号,即“print(inspect.getsource(mymodule.sayHello))”,我认为这是 Python3 的事情。
【解决方案2】:

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

import inspect
myobj = MyModel()
print inspect.getsource(myobj.my_method)

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

【讨论】:

    【解决方案3】:

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

    不过你可以拆解它:

    import dis
    
    def sayHello():
      print "hello"
    
    dis.dis(sayHello)
    

    打印出来:

    1 0 LOAD_CONST 1 ('你好') 3 PRINT_ITEM 4 PRINT_NEWLINE 5 LOAD_CONST 0(无) 8 RETURN_VALUE

    查看Decompyle 以获得反编译器。

    【讨论】:

      【解决方案4】:

      没有用于获取函数源代码的内置函数,但是,如果您可以访问源代码(它将在您的 Python/lib 目录中),您可以构建自己的函数。

      【讨论】:

        猜你喜欢
        • 2011-02-11
        • 1970-01-01
        • 2011-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-25
        • 2010-10-18
        相关资源
        最近更新 更多