`
jinvasshole
  • 浏览: 803461 次
文章分类
社区版块
存档分类
最新评论

【Python旧时笔记 七】PyCodeObject初探

 
阅读更多
在code.h中有PyCodeObject的定义:

/* Bytecode object */
typedefstruct{
PyObject_HEAD
intco_argcount;/* #arguments, except *args */
intco_nlocals;/* #local variables */
intco_stacksize;/* #entries needed for evaluation stack */
intco_flags;/* CO_..., see below */
PyObject*co_code;/* instruction opcodes */
PyObject*co_consts;/* list (constants used) */
PyObject*co_names;/* list of strings (names used) */
PyObject*co_varnames;/* tuple of strings (local variable names) */
PyObject*co_freevars;/* tuple of strings (free variable names) */
PyObject*co_cellvars;/* tuple of strings (cell variable names) */
/* The rest doesn't count for hash/cmp */
PyObject*co_filename;/* string (where it was loaded from) */
PyObject*co_name;/* string (name, for reference) */
intco_firstlineno;/* first source line number */
PyObject*co_lnotab;/* string (encoding addr<->lineno mapping) See
Objects/lnotab_notes.txt for details. */
void*co_zombieframe;/* for optimization only (see frameobject.c) */
PyObject*co_weakreflist;/* to support weakrefs to code objects */
}PyCodeObject;

Python编译器在将源文件编译成pyc文件的过程中,会收集字符串、常量值、字节码等出现在源代码中的静态信息。这些信息可以保存在pyc文件中和PyCodeObejct(运行时)。pyc文件实际上就是储存着PyCodeObject。

如上定义,PyCodeObejct包含许多成员用来保存信息,各个成员的含义都有注释,分别是类型和含义。
每个名字空间(或者说作用域)都对应一个PyCodeObejct,以下面的代码为例:

class A:
pass

def Foo(arg):
i = arg
print(i)

if __name__ == "__main__":
a = A()
Foo(1)

首先文件作用域(文件全局)对应一个PyCodeObject,而其中还有类A和函数Foo两个作用域,也对应着另外两个PyCodeObject。
将文件作用域对应的PyCodeObject的信息输入,可以得到如下信息:

<class 'code'>
0
0
3
64
b'Gd\x00\x00\x84\x00\x00d\x01\x00\x83\x02\x00Z\x00\x00d\x02\x00\x84\x00\x00Z\x01\x00e\x02\x00d\x03\x00k\x02\x00r;\x00e\x00\x00\x83\x00\x00Z\x03\x00e\x01\x00d\x04\x00\x83\x01\x00\x01n\x00\x00d\x05\x00S'
(<code object A at 0x0247E430, file "./demo.py", line 1>, 'A', <code object Foo at 0x0247E3E0, file "./demo.py", line 4>, '__main__', 1, None)
('A', 'Foo', '__name__', 'a')
()
()
()
./demo.py
<module>
1
b'\x10\x03\t\x04\x0c\x01\t\x01'

第一行是额外指定输入PyCodeObject的类型,接下来是按照PyCodeObject的成员定义顺序依次输出,分别表示:
未知参数个数
局部变量个数
栈空间
标志位
字节码
常量信息
符号信息
局部变量名集合
闭包需要用到的信息
嵌套函数所引用的局部变量名集合
源文件完整路径
该CodeBlock的名字
源文件中对应起始行
字节码与源文件中行号对应关系

可以看到在常量信息中还包含了A、Foo两个PyCodeObject,下面再输出Foo的信息以加深认识:

<class 'code'>
1
2
2
67
b'|\x00\x00}\x01\x00t\x00\x00|\x01\x00\x83\x01\x00\x01d\x00\x00S'
(None,)
('print',)
('arg', 'i')
()
()
./demo.py
Foo
4
b'\x00\x01\x06\x01'

以下是用来输出信息的代码:

source = open('./demo.py').read()
co = compile(source, './demo.py', 'exec')

#co = co.co_consts[2]

print(type(co))
print(co.co_argcount)
print(co.co_nlocals)
print(co.co_stacksize)
print(co.co_flags)
print(co.co_code)
print(co.co_consts)
print(co.co_names)
print(co.co_varnames)
print(co.co_freevars)
print(co.co_cellvars)
print(co.co_filename)
print(co.co_name)
print(co.co_firstlineno)
print(co.co_lnotab)



JasonLee 2011.08.20 13:56
分享到:
评论

相关推荐

    Python学习笔记(干货) 中文PDF完整版.pdf

    《Python学习笔记(干货) 中文PDF完整版.pdf》是一份全面且深入的Python学习资源,旨在帮助初学者和有经验的程序员进一步提升Python技能。这份资料覆盖了Python的多个核心概念,包括环境搭建、基本语法、数据类型、...

    小甲鱼python教程笔记

    小甲鱼 Python 教程笔记 本教程笔记涵盖了 Python 的基础知识点,包括变量、字符串、列表、元组、布尔类型、逻辑运算符、循环结构、列表访问、成员资格运算符、is 运算符、引用和拷贝、列表推导式、元组的使用、...

    千峰python课件笔记+源码 (凯哥)

    千锋python基础教程:1、第一个python程序与数据存储 '千锋python基础教程:2、print&input;与变量和运算符' 千锋python基础教程:3、字符串与循环中的while '千锋python基础教程:4、布尔&list;与条件循环语句与...

    疯狂Python讲义笔记 Python基础入门到进阶知识手册 对照原文的笔记 由浅入深 循序渐进的笔记 共197页.pdf

    《疯狂Python讲义笔记》是一本详尽的Python学习指南,涵盖了从基础到进阶的知识点,适合初学者和有一定经验的开发者。笔记内容丰富,包括变量和简单类型、列表、元组和字典、函数和lambda表达式、类和对象、异常处理...

    Python学习笔记(强烈推荐)

    由皮大庆编写的《Python学习笔记(强烈推荐)》以其丰富的内容、清晰的逻辑和实用的示例,成为了Python初学者的首选入门资料。在这份详尽的学习笔记中,作者从基础概念出发,逐步引导读者深入理解Python编程语言的核心...

    python入门笔记(强烈推荐).pdf

    python刚刚开始学习还没入门的,可以试一下这些例题,掌握快速

    皮大庆Python学习笔记

    Python基础入门教程,适合Python初学者,文档内容包括, 目录 前言 i 第一章 程序 1 1.1 程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 什么是调试 . . . . . . . . . . . . . . . ....

    马哥python课堂笔记-马哥教育PYTHON相关基础笔记.pdf

    在马哥教育的PYTHON相关基础笔记中,我们看到几个关键知识点: 1. **推荐书籍**:学习Python时,有几本经典教材值得参考,包括《Python Cookbook》、《Learn Python the Hard Way》、《Google's Python Class》以及...

    Python学习笔记.pdf

    ### Python学习笔记知识点详解 #### 一、Python简介与特性 **标题与描述解析:** "Python学习笔记.pdf" 的标题直接指出了文档的主题——Python的学习资料,而描述的重复表明该文档的主要内容即为Python的学习笔记...

    python学习笔记.pdf

    在这份《python学习笔记.pdf》中,记录了Python编程的基础知识和一些技巧,内容涵盖了字符串处理、变量操作、数据结构、循环、条件判断等方面。以下是对学习笔记中提到知识点的详细说明。 ### 字符串处理 在Python...

    python入门笔记(推荐)

    这篇“Python入门笔记”旨在帮助初学者快速掌握Python的基础知识,通过实践操作来加深理解。 首先,Python的语法特点是它的一大亮点。Python代码强调可读性,遵循“缩进决定代码块”的原则,避免了大括号带来的视觉...

    最新Python学习笔记3

    本篇学习笔记主要介绍了Python中关于变量指向函数、高阶函数以及特殊高阶函数map()、reduce()、filter()和sorted()的使用方法和原理。 首先,变量在Python中不仅可以指向基本数据类型,还可以指向一个函数名。这...

    python的毕业设计云笔记平台分析与设计.zip

    python的毕业设计云笔记平台分析与设计。基于python的云笔记平台分析与设计python的毕业设计云笔记平台分析与设计。基于python的云笔记平台分析与设计python的毕业设计云笔记平台分析与设计。基于python的云笔记平台...

    Python学习笔记md文件.rar

    **Python学习笔记** 这篇笔记是针对初学者设计的,涵盖了Python编程语言的基础知识点,旨在帮助0基础的读者快速入门并掌握Python的核心概念。通过这些笔记,你可以系统地学习Python的语法和其他基本问题,逐步建立...

    Python学习笔记-王纯业

    【Python学习笔记-王纯业】是一份专为Python初学者设计的教程,由王纯业编撰。这个教程深入浅出地介绍了Python编程的基础知识,帮助初学者快速上手。下面将详细阐述该教程中可能包含的重要知识点,以及Python入门者...

    王纯业的Python学习笔记

    《王纯业的Python学习笔记》是一份专为Python初学者和进阶者设计的学习资料,旨在帮助读者全面掌握这门强大的编程语言。Python作为一门高级编程语言,因其简洁、易读的语法特性,被广泛应用于数据分析、机器学习、...

    effective python学习笔记.pdf

    记录了我的effective-Python学习笔记,精简了effective-Python中重要的部分。effective-Python是一本值得多看几遍的书,但是看后面的几遍的时候完全可以直接看自己的学习笔记。此学习笔记侧重与比较实用的部分即前四...

    计算机二级python自学笔记PDF

    这份"计算机二级Python自学笔记PDF"是作者在学习过程中积累的宝贵资料,旨在帮助有志于通过计算机二级Python考试的人士提升技能并顺利通过考试。 笔记首先可能会从基础语法入手,包括变量、数据类型(如整型、浮点...

Global site tag (gtag.js) - Google Analytics