在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学习资源,旨在帮助初学者和有经验的程序员进一步提升Python技能。这份资料覆盖了Python的多个核心概念,包括环境搭建、基本语法、数据类型、...
小甲鱼 Python 教程笔记 本教程笔记涵盖了 Python 的基础知识点,包括变量、字符串、列表、元组、布尔类型、逻辑运算符、循环结构、列表访问、成员资格运算符、is 运算符、引用和拷贝、列表推导式、元组的使用、...
千锋python基础教程:1、第一个python程序与数据存储 '千锋python基础教程:2、print&input;与变量和运算符' 千锋python基础教程:3、字符串与循环中的while '千锋python基础教程:4、布尔&list;与条件循环语句与...
《疯狂Python讲义笔记》是一本详尽的Python学习指南,涵盖了从基础到进阶的知识点,适合初学者和有一定经验的开发者。笔记内容丰富,包括变量和简单类型、列表、元组和字典、函数和lambda表达式、类和对象、异常处理...
由皮大庆编写的《Python学习笔记(强烈推荐)》以其丰富的内容、清晰的逻辑和实用的示例,成为了Python初学者的首选入门资料。在这份详尽的学习笔记中,作者从基础概念出发,逐步引导读者深入理解Python编程语言的核心...
python刚刚开始学习还没入门的,可以试一下这些例题,掌握快速
Python基础入门教程,适合Python初学者,文档内容包括, 目录 前言 i 第一章 程序 1 1.1 程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 什么是调试 . . . . . . . . . . . . . . . ....
在马哥教育的PYTHON相关基础笔记中,我们看到几个关键知识点: 1. **推荐书籍**:学习Python时,有几本经典教材值得参考,包括《Python Cookbook》、《Learn Python the Hard Way》、《Google's Python Class》以及...
### Python学习笔记知识点详解 #### 一、Python简介与特性 **标题与描述解析:** "Python学习笔记.pdf" 的标题直接指出了文档的主题——Python的学习资料,而描述的重复表明该文档的主要内容即为Python的学习笔记...
在这份《python学习笔记.pdf》中,记录了Python编程的基础知识和一些技巧,内容涵盖了字符串处理、变量操作、数据结构、循环、条件判断等方面。以下是对学习笔记中提到知识点的详细说明。 ### 字符串处理 在Python...
这篇“Python入门笔记”旨在帮助初学者快速掌握Python的基础知识,通过实践操作来加深理解。 首先,Python的语法特点是它的一大亮点。Python代码强调可读性,遵循“缩进决定代码块”的原则,避免了大括号带来的视觉...
本篇学习笔记主要介绍了Python中关于变量指向函数、高阶函数以及特殊高阶函数map()、reduce()、filter()和sorted()的使用方法和原理。 首先,变量在Python中不仅可以指向基本数据类型,还可以指向一个函数名。这...
python的毕业设计云笔记平台分析与设计。基于python的云笔记平台分析与设计python的毕业设计云笔记平台分析与设计。基于python的云笔记平台分析与设计python的毕业设计云笔记平台分析与设计。基于python的云笔记平台...
**Python学习笔记** 这篇笔记是针对初学者设计的,涵盖了Python编程语言的基础知识点,旨在帮助0基础的读者快速入门并掌握Python的核心概念。通过这些笔记,你可以系统地学习Python的语法和其他基本问题,逐步建立...
【Python学习笔记-王纯业】是一份专为Python初学者设计的教程,由王纯业编撰。这个教程深入浅出地介绍了Python编程的基础知识,帮助初学者快速上手。下面将详细阐述该教程中可能包含的重要知识点,以及Python入门者...
《王纯业的Python学习笔记》是一份专为Python初学者和进阶者设计的学习资料,旨在帮助读者全面掌握这门强大的编程语言。Python作为一门高级编程语言,因其简洁、易读的语法特性,被广泛应用于数据分析、机器学习、...
记录了我的effective-Python学习笔记,精简了effective-Python中重要的部分。effective-Python是一本值得多看几遍的书,但是看后面的几遍的时候完全可以直接看自己的学习笔记。此学习笔记侧重与比较实用的部分即前四...
这份"计算机二级Python自学笔记PDF"是作者在学习过程中积累的宝贵资料,旨在帮助有志于通过计算机二级Python考试的人士提升技能并顺利通过考试。 笔记首先可能会从基础语法入手,包括变量、数据类型(如整型、浮点...