什么是Python代码对象?

one*_*elf 26 python

在尝试使用Python的"exec"语句时,我收到以下错误:

TypeError: exec: arg 1 must be a string, file, or code object
Run Code Online (Sandbox Code Playgroud)

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

Lie*_*yan 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
Run Code Online (Sandbox Code Playgroud)

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

>>> def f(s): print s
... 
>>> f.__code__
<code object f at 0x19aa1b0, file "<stdin>", line 1>
Run Code Online (Sandbox Code Playgroud)

  • 令我困惑的关于OP的问题(并接受这个答案)的是,如果他们要将一个字符串传递给`compile`,那么大多数时候他们也可以将它直接传递给`exec`并让` exec`将其编译为幕后的代码对象.直接调用`compile`的唯一原因是,如果应用程序特别需要分离编译和执行步骤(例如,可以多次调用相同的代码对象,或者在输入代码时需要语法检查,甚至如果它将在以后运行). (5认同)

Dan*_*ner 22

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

探索Python代码对象

  • 很好的链接。对于后代,如果链接失效:该页面讨论通过“编译”创建代码对象,了解对象的内部结构,并稍微查看底层字节码。 (2认同)

Chr*_*ung 16

代码对象在这里描述:

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