Python代码对象 - 用途是什么?

4 投票
3 回答
1605 浏览
提问于 2025-04-16 12:14

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

撰写回答