尝试使用 Python 的exec
语句时,出现以下错误:
TypeError: exec: arg 1 must be a string, file, or code object
我不想传入字符串或文件,但什么是代码对象,如何创建?
创建代码对象的一种方法是使用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>
Dan Crosta 有一篇很棒的博客文章解释了这个主题,包括如何手动创建代码对象,以及如何再次反汇编它们:
此处描述了代码对象:
代码对象表示字节编译的 可执行 Python 代码,或bytecode。代码对象和函数对象的区别在于,函数对象包含对函数全局变量(定义它的模块)的显式引用,而代码对象不包含上下文;默认参数值也存储在函数对象中,而不是代码对象中(因为它们表示在运行时计算的值)。与函数对象不同,代码对象是不可变的,并且不包含对可变对象的引用(直接或间接)。