Bootstrap

Python的Code对象

Code对象表示字节编译的可执行Python代码或字节码。
Code对象函数对象之间的区别在于:

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

code对象可以用来获取python程序运行过程中的函数名称。

参考链接
https://docs.python.org/2/reference/datamodel.html#objects-values-and-types

特殊的只读属性:

特殊的只读属性解释
co_name给出函数名称
co_argcount是位置参数的数量(包括具有默认值的参数)
co_nlocals是函数使用的局部变量数(包括参数)
co_varnames是一个包含局部变量名称的元组(以参数名称开头)
co_cellvars是一个元组,包含嵌套函数引用的局部变量的名称
co_freevars是一个包含自由变量名称的元组
co_code是表示字节码指令序列的字符串
co_consts是一个包含字节码使用的文字的元组。如果Code对象是函数,则co_consts为函数文档字符串,如果没有定义则为None
co_names是包含字节码使用的名称的元组
co_filename是编译代码的文件名
co_firstlineno是函数的第一个行号
co_lnotab是一个字符串,用于编码从字节码偏移到行号的映射
co_stacksize是所需的堆栈大小(包括局部变量)
co_flags是一个整数,用于编码解释器的许多标志

co_flags的标志位:

标志位说明
0x04使用*arguments语法接受任意数量的位置参数
0x08使用**keywords语法接受任意数量的键-值参数
0x20函数是生成器
0x2000函数是在未来分区启用的情况下编译的
0x10与0x1000应用于Python的早期版本
;