【发布时间】:2011-02-21 20:50:05
【问题描述】:
Python code objects 有什么用?除了被解释器或调试器使用之外,它们还有什么其他有用的用途?
您是否直接与代码对象交互过?如果是,在什么情况下?
【问题讨论】:
Python code objects 有什么用?除了被解释器或调试器使用之外,它们还有什么其他有用的用途?
您是否直接与代码对象交互过?如果是,在什么情况下?
【问题讨论】:
代码对象的主要用途是将函数(代码)的静态部分与动态部分(函数)分开。代码对象是隐藏在 .pyc 文件中的东西,是在编译代码时创建的;函数对象是在声明函数时在运行时从它们创建的。它们暴露在调试器反射中,通常不需要直接使用。
所有支持闭包的语言都有类似的东西;他们只是不像在 Python 中那样总是接触到这种语言,Python 比大多数语言都有更全面的反映。
您可以使用代码对象通过types.FunctionType 实例化函数对象,但这很少有任何实际用途——换句话说,不要这样做:
def func(a=1):
print a
func2 = types.FunctionType(func.func_code, globals(), 'func2', (2,))
func2()
# 2
【讨论】:
当您使用内置的compile function 时,它会返回一个代码对象,如下所示:
>>> c = compile("print 'Hello world'", "string", "exec")
<code object <module> at 0xb732a4e8, file "string", line 1>
>>> exec(c)
Hello world
>>>
就个人而言,我在支持不同插件脚本的应用程序中使用了它:我会从文件中读取插件,将其传递给编译函数,然后在需要时使用 exec 运行它,它提供了速度提升的优势,因为您只需将其编译为字节码。
【讨论】:
import的(语句背后的函数)的再发明吗?