co_names: 所有的参数名(包括参数和*参数)和局部变量名的元组。 co_varnames: 所有的局部变量名的元组。 co_filename: 源代码所在的文件名。 co_flags: 这是一个数值,每一个二进制位都包含了特定信息。较关注的是0b100(0x4)和0b1000(0x8),如果co_flags & 0b100 != 0,说明使用了*args参数;如果co_f...
co_code 中存储了字节码,字节码使用二进制方式存储,节省存储空间,指令符号是常量对应的,在指令符号后面跟着指令参数,这样便于操作。 co_varnames 包含局部变量名的元组,所有当前局部变量 co_consts 包含字节码所用字面量的元组,局部常量 co_names 包含字节码所用名称的元组 inspect 可以获取调用栈的信息,当执行函数...
但是LOAD_FAST 是有参数的,在上面我们已经知道 LOAD_FAST 是将 co-varnames[var_num] 压入栈,var_num 就是指令 LOAD_FAST 的参数。在上面的代码当中一共有两条 LOAD_FAST 指令,分别是将 a 和 b 压入到栈中,他们在 varnames 当中的下标分别是 0 和 1,因此他们的操作数就是 0 和 1 。 字节码扩展...
co_consts是存在于函数体内的任意实数的元组 co_varnames是函数体内使用的包含任意本地变量名字的元组 co_names是在函数体内引用的任意非本地名字的元组 许多字节码指令 —— 尤其是那些推入到栈中的加载值,或者在变量和属性中的存储值 —— 在这些元组中的索引作为它们参数。 因此,现在我们能够理解hello()函数中...
co_argcount: 普通参数的总数,不包括*参数和**参数。co_names: 所有的参数名(包括*参数和**参数)和局部变量名的元组。 co_varnames: 所有的局部变量名的元组。co_filename: 源代码所在的文件名。co_flags: 这是一个数值,每一个二进制位都包含了特定信息。较关注的是0b100(0x4)和0b1000(0x8),如果co_...
defqux(a,b,c=0,*args,**kwargs):passnum_params=len(qux.__code__.co_varnames)print(num_params)# 输出: 5 1. 2. 3. 4. 5. 6. 这段代码会输出函数qux的参数个数,即5个。co_varnames元组包含了函数的所有局部变量和参数名,通过获取其长度来得到参数个数。
参数名称在__code__.co_varnames中,不过里面还有函数定义体中创建的局部变量。 因此,参数名称是前N个字符串,N的值由__code__.co_argcount确定。 参数的默认值只能通过它们在__defaults__元组中的位置确定,因此要从后向前扫描才能把参数和默认值对应起来。
比如 LOAD_CONST 0 所做的操作就是从 f->f_code->co_consts 常量表(PyTupleObject)中取出序号为0的元素即整数对象1,将其压入虚拟机的运行时栈中;STORE_NAME 0 先从符号表 f->f_code->co_names(PyTupleObject)获取序号为0的元素的作为变量名,将前面获取到的整数对象从栈中pop 出作为变量值,将(i, 1...
co_varnames tuple of names of arguments and local variables builtin __doc__ documentation string __name__ original name of this function or method __self__ instance to which a method is bound, or None 2. inspect.getmoduleinfo(path): 返回一个命名元组<named tuple>(name, suffix, mode, ...
int co_flags; PyObjectco_code; /字节码指令序列 */ PyObjectco_consts; /所有常量集合 */ PyObjectco_names; /所有符号名称集合 */ PyObjectco_varnames; /局部变量名称集合 */ PyObjectco_freevars; /闭包用的的变量名集合 */ PyObjectco_cellvars; /内部嵌套函数引用的变量...