Python实践103-代码对象简介

背景

  • CPython 实现了一个执行基于栈的字节码 (stack-based bytecode) 的虚拟机
  • 在运行时,任何可执行的东西 (函数、方法、模块、类主体 (class body)、Lambda 式、语句、表达式等等) 都以字节码的形式由 Python 虚拟机执行
  • 代码对象是用于表示字节码片段的 Python 对象,同时还附带了所有执行需要的东西:预期的参数名称和数量的声明、一个本地变量的列表、字节码生成时与源代码相关的信息 (用于调试和输出栈跟踪) 等——哦,还有 (也许很显然地) 字节码本身,Python3 中以byte存储。
  • 代码对象类似函数,只是它们不包含于定义代码的命名空间相关的任何上下文,也不保存关于默认参数值的信息
  • 要运行一个代码对象,你必须使用exec关键字或者eval()函数

对象的属性

def add(a, b):
    return a + b


c = add.__code__
print('函数名称:', c.co_name)
print('位置参数的个数:', c.co_argcount)
print('函数使用的局部变量个数:', c.co_nlocals)
print('包含局部变量名的元组:', c.co_varnames)
print('原始字节码的字符串:', c.co_code)
print('字节码所用字面量的元组:', c.co_consts)
print('字节码所用名称的元组:', c.co_names)
print('被编译代码所在文件的名称:', c.co_filename)
print('函数的首行行号:', c.co_firstlineno)
print('所需栈的大小:', c.co_stacksize)
print('包含解释器标志的整数:', c.co_flags)

"""
函数名称: add
位置参数的个数: 2
函数使用的局部变量个数: 2
包含局部变量名的元组: ('a', 'b')
原始字节码的字符串: b'|\x00|\x01\x17\x00S\x00'
字节码所用字面量的元组: (None,)
字节码所用名称的元组: ()
被编译代码所在文件的名称: /Users/zyt/git/github/PyCodeComplete/practice/runtime/code_block.py
函数的首行行号: 6
所需栈的大小: 2
包含解释器标志的整数: 67
"""

代码地址

本系列文章和代码已经作为项目归档到github,仓库地址:jumper2014/PyCodeComplete。大家觉得有帮助就请在github上star一下,你的支持是我更新的动力。什么?你没有github账号?学习Python怎么可以没有github账号呢,快去注册一个啦!