Python代码对象 - 用途是什么?
Python代码对象有什么用处?除了被解释器或调试器使用,还有什么其他有用的地方吗?
你有没有直接和代码对象打过交道?如果有,是什么情况下呢?
3 个回答
1
当你使用内置的 compile 函数 时,它会返回一个代码对象,像这样:
>>> c = compile("print 'Hello world'", "string", "exec")
<code object <module> at 0xb732a4e8, file "string", line 1>
>>> exec(c)
Hello world
>>>
我个人在一些支持脚本的应用程序中使用过这个功能,比如不同的插件:我只需从文件中读取插件,把它传给 compile 函数,然后在需要的时候用 exec 来运行它。这样做的好处是速度更快,因为你只需要把它编译一次成字节码。
9
代码对象的主要作用是把函数的静态部分(代码)和动态部分(函数)分开。代码对象就是那些存放在 .pyc 文件里的东西,它们是在代码编译时创建的;而函数对象则是在运行时根据这些代码对象生成的,当你声明函数的时候就会出现。代码对象主要是为了调试时使用,通常不需要直接去用它们。
所有支持闭包的编程语言都有类似的东西;不过它们不一定像在 Python 中那样被直接暴露出来,因为 Python 的反射功能比大多数语言都要强大。
你可以通过 types.FunctionType
来使用代码对象生成函数对象,但这种做法很少有实际用途——换句话说,不要这样做:
def func(a=1):
print a
func2 = types.FunctionType(func.func_code, globals(), 'func2', (2,))
func2()
# 2