34

尝试使用 Python 的exec语句时,出现以下错误:

TypeError: exec: arg 1 must be a string, file, or code object

我不想传入字符串或文件,但什么是代码对象,如何创建?

4

3 回答 3

36

创建代码对象的一种方法是使用compile内置函数:

>>> compile('sum([1, 2, 3])', '', 'single')
<code object <module> at 0x19ad730, file "", line 1>
>>> exec compile('sum([1, 2, 3])', '', 'single')
6
>>> compile('print "Hello world"', '', 'exec')
<code object <module> at 0x19add30, file "", line 1>
>>> exec compile('print "Hello world"', '', 'exec')
Hello world

此外,函数具有函数属性__code__(在旧版本中也称为func_code),您可以从中获取函数的代码对象:

>>> def f(s): print s
... 
>>> f.__code__
<code object f at 0x19aa1b0, file "<stdin>", line 1>
于 2011-04-24T04:47:41.760 回答
30

Dan Crosta 有一篇很棒的博客文章解释了这个主题,包括如何手动创建代码对象,以及如何再次反汇编它们:

探索 Python 代码对象

于 2012-11-20T09:13:39.313 回答
18

此处描述了代码对象:

代码对象表示字节编译的 可执行 Python 代码,或bytecode。代码对象和函数对象的区别在于,函数对象包含对函数全局变量(定义它的模块)的显式引用,而代码对象不包含上下文;默认参数值也存储在函数对象中,而不是代码对象中(因为它们表示在运行时计算的值)。与函数对象不同,代码对象是不可变的,并且不包含对可变对象的引用(直接或间接)。

于 2011-04-24T04:51:22.720 回答