【问题标题】:Python code objects - what are they used for?Python 代码对象——它们的用途是什么?
【发布时间】:2011-02-21 20:50:05
【问题描述】:

Python code objects 有什么用?除了被解释器或调试器使用之外,它们还有什么其他有用的用途?

您是否直接与代码对象交互过?如果是,在什么情况下?

【问题讨论】:

    标签: python types internals


    【解决方案1】:

    代码对象的主要用途是将函数(代码)的静态部分与动态部分(函数)分开。代码对象是隐藏在 .pyc 文件中的东西,是在编译代码时创建的;函数对象是在声明函数时在运行时从它们创建的。它们暴露在调试器反射中,通常不需要直接使用。

    所有支持闭包的语言都有类似的东西;他们只是不像在 Python 中那样总是接触到这种语言,Python 比大多数语言都有更全面的反映。

    您可以使用代码对象通过types.FunctionType 实例化函数对象,但这很少有任何实际用途——换句话说,不要这样做:

    def func(a=1):
        print a
    
    func2 = types.FunctionType(func.func_code, globals(), 'func2', (2,))
    func2()
    # 2
    

    【讨论】:

      【解决方案2】:
      【解决方案3】:

      当您使用内置的compile function 时,它会返回一个代码对象,如下所示:

      >>> c = compile("print 'Hello world'", "string", "exec")
      <code object <module> at 0xb732a4e8, file "string", line 1>
      >>> exec(c)
      Hello world
      >>> 
      

      就个人而言,我在支持不同插件脚本的应用程序中使用了它:我会从文件中读取插件,将其传递给编译函数,然后在需要时使用 exec 运行它,它提供了速度提升的优势,因为您只需将其编译为字节码。

      【讨论】:

      • 这不就是对import的(语句背后的函数)的再发明吗?
      • @delan:是与否,这实际上取决于您如何实现它。将文件作为字符串读入然后将其传递给编译的好处是您不需要 sys.modules 中的路径并且它也不会创建 .pyc 文件。自从我做这个并且是为了我自己的一个小项目以来,已经有一段时间了,但这种方式对我来说感觉更干净。
      猜你喜欢
      • 2014-06-30
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 2014-07-07
      • 1970-01-01
      • 2017-02-23
      • 1970-01-01
      相关资源
      最近更新 更多