在尝试使用Python的“exec”语句时,我收到以下错误:
TypeError: exec: arg 1 must be a string, file, or code object
我不想传入字符串或文件,但是什么是代码对象,我该如何创建呢?
答案 0 :(得分:31)
创建代码对象的一种方法是使用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>
答案 1 :(得分:21)
Dan Crosta有一篇很好的博客文章解释了这个主题,包括如何手动创建代码对象,以及如何再次反汇编它们:
答案 2 :(得分:16)
代码对象描述为here:
代码对象代表字节编译 可执行的Python代码,或字节码。 代码对象之间的区别 和一个功能对象是 function对象包含一个显式的 引用函数的全局变量 (定义它的模块), 而代码对象不包含 上下文;也是默认参数 值存储在函数中 对象,而不是代码对象 (因为它们代表了价值观 在运行时计算)。不像 函数对象,代码对象 不可变且不包含引用 (直接或间接)可变的 对象。