co_argcount: 普通参数的总数,不包括参数和*参数。 co_names: 所有的参数名(包括参数和*参数)和局部变量名的元组。 co_varnames: 所有的局部变量名的元组。 co_filename: 源代码所在的文件名。 co_flags: 这是一个数值,每一个二进制位都包含了特定信息。较关注的是0b100(0x4)和0b1000(
5, 6, None)co_names = build_tuple("a", "b", "c")stack = build_stack()f_locals = build_hash_table()stack.push(co_consts.get())f_locals.set("a, stack.pop())stack.push(co_consts.get(1))f_locals.set("b", stack.pop())stack.push( f_locals.get( co_names.get(0) ...
co_names:除参数和函数局部变量之外的名称元组,那这边可以看到一般都是方法的名称 除了方法的名称以外的话,属性名称都会被记录在到co_names co_consts co_const:字节码中使用的常量元组 如下图所示,可以看到变量的值都会在这里进行存储 co_cellvars和co_freevars co_cellvars:单元变量名称的元组(通过包含作用域引...
LOAD_FAST(var_num)加载一个co_varnames[var_num]局部变量。从名字上可以猜出来,这个opcode很fast。 可以看到,a是f作用域下的一个局部变量,因为a出现在了等号左边。然后a就被放在了co_varnames里,而不是co_names里。 LOAD_DEREF 这个LOAD_DEREF(i)可能不多见,看上去是为closure准备的。就是说,不是本函数...
co_consts是存在于函数体内的任意实数的元组 co_varnames是函数体内使用的包含任意本地变量名字的元组 co_names是在函数体内引用的任意非本地名字的元组 许多字节码指令 —— 尤其是那些推入到栈中的加载值,或者在变量和属性中的存储值 —— 在这些元组中的索引作为它们参数。
co_argcount: 普通参数的总数,不包括*参数和**参数。co_names: 所有的参数名(包括*参数和**参数)和局部变量名的元组。 co_varnames: 所有的局部变量名的元组。co_filename: 源代码所在的文件名。co_flags: 这是一个数值,每一个二进制位都包含了特定信息。较关注的是0b100(0x4)和0b1000(0x8),如果co_...
可以反序列化# marshal.dumps 则表示序列化code = marshal.loads(data[16:])# 此时就拿到了 py 文件编译之后的 PyCodeObjectprint(code)"""<code object <module> at 0x..., file "tools.py", line 1>"""# 查看常量池print(code.co_consts) # (1, '你好啊', None)# 符号表print(code.co_names...
'co_names' # code 所用的到符号表, tuple 类型,元素是字符串 'co_nlocals' # code内所有的局部变量的个数,包括所有参数 'co_stacksize' # code段运行时所需要的最大栈深度 'co_varnames' # code 所用到的局部变量名, tuple 类型, 元素是 PyStringObject('s/t/R') ...
int co_argcount;/* 位置参数个数 */int co_nlocals;/* 局部变量个数 */int co_stacksize;/* 栈大小 */int co_flags;PyObject*co_code;/* 字节码指令序列 */PyObject*co_consts;/* 所有常量集合 */PyObject*co_names;/* 所有符号名称集合 */PyObject*co_varnames;/* 局部变量名称集合 */PyObje...
>>> fun1.__code__.co_varnames # 局部变量名的元组 ('b',) >>> fun1.__code__.co_consts # 局部变量中的常量元组 (None, 1, 'running fun1') >>> fun1.__code__.co_names # 名称的元组 ('inspect', 'currentframe', 'x', 'print', 'f_lasti') ...