http://www.jianshu.com/users/4d4a2f26740b/latest_articles

http://blog.csdn.net/ssjhust123/article/category/3202957

http://tech.uc.cn/?p=1932

  


>>>src=open("./test.py").read()
>>>co=compile(src,"test.py","exec")
>>>dir(co) >>> dir(co)
['__class__', '__cmp__', '__delattr__', '__doc__', '__eq__', '__format__',
'__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__',
'__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'co_argcount',
'co_cellvars', 'co_code', 'co_consts', 'co_filename', 'co_firstlineno',
'co_flags', 'co_freevars', 'co_lnotab', 'co_name', 'co_names', 'co_nlocals',
'co_stacksize', 'co_varnames'] >>> print co.co_names
('a', 'b', 'c', 'd', 'object', 'Student', 'func', 'bart', 'name', 'score') >>> print co.co_consts
('hello', 1, 1.0, '', 'Student', <code object Student at 0x7f1d2b7a2918, file "test.py", line 5>,
<code object func at 0x7f1d2b7a25d0, file "test.py", line 9>, 'this is name', 'this is score', None) >>> co.co_code
'd\x00\x00Z\x00\x00d\x01\x00Z\x01\x00d\x02\x00Z\x02\x00d\x03\x00Z\x03\x00d\
x04\x00e\x04\x00f\x01\x00d\x05\x00\x84\x00\x00\x83\x00\x00YZ\x05\x00d\x06\x00\
x84\x00\x00Z\x06\x00e\x06\x00\x83\x00\x00\x01e\x05\x00d\x07\x00d\x08\x00\x83\
x02\x00Z\x07\x00e\x07\x00i\x08\x00GHe\x07\x00i\t\x00GHd\t\x00S' >>> import dis
>>> print dis.dis(co)
1 0 LOAD_CONST 0 ('hello')
3 STORE_NAME 0 (a) 2 6 LOAD_CONST 1 (1)
9 STORE_NAME 1 (b) 3 12 LOAD_CONST 2 (1.0)
15 STORE_NAME 2 (c) 4 18 LOAD_CONST 3 ('')
21 STORE_NAME 3 (d) 5 24 LOAD_CONST 4 ('Student')
27 LOAD_NAME 4 (object)
30 BUILD_TUPLE 1
33 LOAD_CONST 5 (<code object Student at 0x7f1d2b7a2918, file "test.py", line 5>)
36 MAKE_FUNCTION 0
39 CALL_FUNCTION 0
42 BUILD_CLASS
43 STORE_NAME 5 (Student) 9 46 LOAD_CONST 6 (<code object func at 0x7f1d2b7a25d0, file "test.py", line 9>)
49 MAKE_FUNCTION 0
52 STORE_NAME 6 (func) 11 55 LOAD_NAME 6 (func)
58 CALL_FUNCTION 0
61 POP_TOP 12 62 LOAD_NAME 5 (Student)
65 LOAD_CONST 7 ('this is name')
68 LOAD_CONST 8 ('this is score')
71 CALL_FUNCTION 2
74 STORE_NAME 7 (bart) 13 77 LOAD_NAME 7 (bart)
80 LOAD_ATTR 8 (name)
83 PRINT_ITEM
84 PRINT_NEWLINE 14 85 LOAD_NAME 7 (bart)
88 LOAD_ATTR 9 (score)
91 PRINT_ITEM
92 PRINT_NEWLINE
93 LOAD_CONST 9 (None)
96 RETURN_VALUE
None -----------------------------------------------------------
typedef struct _frame {
PyObject_VAR_HEAD
struct _frame *f_back; /* 调用者的帧 */
PyCodeObject *f_code; /* 帧对应的字节码对象 */
PyObject *f_builtins; /* 内置名字空间 */
PyObject *f_globals; /* 全局名字空间 */
PyObject *f_locals; /* 本地名字空间 */
PyObject **f_valuestack; /* 运行时栈底 */
PyObject **f_stacktop; /* 运行时栈顶 */
…….
}
typedef struct {
PyObject_HEAD
int co_argcount; /* 位置参数个数 */
int co_nlocals; /* 局部变量个数 */
int co_stacksize; /* 栈大小 */
int co_flags;
PyObject *co_code; /* 字节码指令序列 */
PyObject *co_consts; /* 所有常量集合 */
PyObject *co_names; /* 所有符号名称集合 */
PyObject *co_varnames; /* 局部变量名称集合 */
PyObject *co_freevars; /* 闭包用的的变量名集合 */
PyObject *co_cellvars; /* 内部嵌套函数引用的变量名集合 */
/* The rest doesn’t count for hash/cmp */
PyObject *co_filename; /* 代码所在文件名 */
PyObject *co_name; /* 模块名|函数名|类名 */
int co_firstlineno; /* 代码块在文件中的起始行号 */
PyObject *co_lnotab; /* 字节码指令和行号的对应关系 */
void *co_zombieframe; /* for optimization only (see frameobject.c) */
} PyCodeObject; -----------------------------------------------------------------------
[root@monitor ~]# vi test.py a="hello"
b=1
c=1.0
d=''
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score def func():
a="hello"
b=1
c=1.0
d=''
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score def func():
import sys
frame = sys._getframe()
print frame.f_locals
print frame.f_globals
print frame.f_back.f_locals
print a func() [root@monitor ~]# python test.py { 'sys': <module 'sys' (built-in)>,
'frame': <frame object at 0x1569750>
}
{'a': 'hello',
'c': 1.0,
'b': 1,
'func': <function func at 0x7facf5cbbc08>,
'd': '',
'__builtins__': <module '__builtin__' (built-in)>,
'__file__': 'test.py',
'__package__': None,
'Student': <class '__main__.Student'>,
'__name__': '__main__',
'__doc__': None
} {'a': 'hello',
'c': 1.0,
'b': 1,
'func': <function func at 0x7facf5cbbc08>,
'd': '',
'__builtins__': <module '__builtin__' (built-in)>,
'__file__': 'test.py',
'__package__': None,
'Student': <class '__main__.Student'>,
'__name__': '__main__', '__doc__': None
}
hello
this is name
this is score
------------------------------------------------------------------------
a="hello" def func():
import sys
frame = sys._getframe()
print frame.f_locals
print frame.f_globals
print frame.f_back.f_locals
print a "test.py" 12L, 165C written

[root@monitor ~]# python test.py
{        'sys': <module 'sys' (built-in)>,

'frame': <frame object at 0xb67d30>}
{          'a': 'hello',

'__builtins__': <module '__builtin__' (built-in)>,

'__file__': 'test.py',

'__package__': None,

'func': <function func at 0x7fc658a87938>,

'__name__': '__main__',

'__doc__': None}
{          'a': 'hello',

'__builtins__': <module '__builtin__' (built-in)>,

'__file__': 'test.py',

'__package__': None,

'func': <function func at 0x7fc658a87938>,

'__name__': '__main__',

'__doc__': None}
hello

-----------------------------------------------------------
>>> src=open("./test.py").read()
>>> co=compile(src,"test.py","exec")
>>> co.co_consts
('hello', <code object func at 0x7f1f75deb558, file "test.py", line 4>, None)
>>> import dis
>>> dis.dis(co.co_consts[1]) 5 0 LOAD_CONST 1 (-1)
3 LOAD_CONST 0 (None)
6 IMPORT_NAME 0 (sys)
9 STORE_FAST 0 (sys) 6 12 LOAD_FAST 0 (sys)
15 LOAD_ATTR 1 (_getframe)
18 CALL_FUNCTION 0
21 STORE_FAST 1 (frame) 7 24 LOAD_FAST 1 (frame)
27 LOAD_ATTR 2 (f_locals)
30 PRINT_ITEM
31 PRINT_NEWLINE 8 32 LOAD_FAST 1 (frame)
35 LOAD_ATTR 3 (f_globals)
38 PRINT_ITEM
39 PRINT_NEWLINE 9 40 LOAD_FAST 1 (frame)
43 LOAD_ATTR 4 (f_back)
46 LOAD_ATTR 2 (f_locals)
49 PRINT_ITEM
50 PRINT_NEWLINE 10 51 LOAD_GLOBAL 5 (a)
54 PRINT_ITEM
55 PRINT_NEWLINE
56 LOAD_CONST 0 (None) >>> print co.co_names
('a', 'func')
>>> print co.co_consts
('hello', <code object func at 0x7f1f75deb558, file "test.py", line 4>, None) 第一列表示以下几个指令在py文件中的行号;
第二列是该指令在指令序列co_code里的偏移量;
第三列是指令opcode的名称,分为有操作数和无操作数两种,opcode在指令序列中是一个字节的整数;
第四列是操作数oparg,在指令序列中占两个字节,基本都是co_consts或者co_names的下标;
第五列带括号的是操作数说明。

python 源码解读2的更多相关文章

  1. selenium之python源码解读-expected_conditions

    一.expected_conditions 之前在 selenium之python源码解读-WebDriverWait 中说到,until方法中method参数,需要传入一个function对象,如果 ...

  2. 如何判断一个Http Message的结束——python源码解读

    HTTP/1.1 默认的连接方式是长连接,不能通过简单的TCP连接关闭判断HttpMessage的结束. 以下是几种判断HttpMessage结束的方式: 1.      HTTP协议约定status ...

  3. selenium之python源码解读-webdriver继承关系

    一.webdriver继承关系 在selenium中,无论是常用的Firefox Driver 还是Chrome Driver和Ie Drive,他们都继承至selenium\webdriver\re ...

  4. selenium之python源码解读-WebDriverWait

    一.显示等待 所谓显示等待,是针对某一个特定的元素设置等待时间,如果在规定的时间内找到了该元素,就执行相关的操作,如果在规定的时间内没有找到该元素,在抛出异常 PS:注意显示等待和隐身等待的区别,隐身 ...

  5. Apache Beam WordCount编程实战及源码解读

    概述:Apache Beam WordCount编程实战及源码解读,并通过intellij IDEA和terminal两种方式调试运行WordCount程序,Apache Beam对大数据的批处理和流 ...

  6. 基于Docker的TensorFlow机器学习框架搭建和实例源码解读

    概述:基于Docker的TensorFlow机器学习框架搭建和实例源码解读,TensorFlow作为最火热的机器学习框架之一,Docker是的容器,可以很好的结合起来,为机器学习或者科研人员提供便捷的 ...

  7. Spark学习之路 (十六)SparkCore的源码解读(二)spark-submit提交脚本

    一.概述 上一篇主要是介绍了spark启动的一些脚本,这篇主要分析一下Spark源码中提交任务脚本的处理逻辑,从spark-submit一步步深入进去看看任务提交的整体流程,首先看一下整体的流程概要图 ...

  8. ansible源码解读

    Ansible源码获取 Ansible Github:https://github.com/ansible Ansible目录结构 $ tree -L 2 ansible-2.0.0.0 ansibl ...

  9. DRF(1) - REST、DRF(View源码解读、APIView源码解读)

    一.REST 1.什么是编程? 数据结构和算法的结合. 2.什么是REST? 首先回顾我们曾经做过的图书管理系统,我们是这样设计url的,如下: /books/ /get_all_books/ 访问所 ...

随机推荐

  1. SSH超时断开(ClientAliveInterval和ClientAliveCountMax )的使用

    有 2个方法 1 配置服务器 打开 /etc/ssh/sshd_config 找到 ClientAliveInterval 参数,如果没有就自己加一行 数值是秒,比如你设置为300,就是5分钟. Cl ...

  2. SQL Server2005安装配置以及测试

    SQL Server2005有2种版本,一种是集成版的, 一种是2个文件夹形式的.这里使用后者,安装文件夹名字为:SQL Server x86,该文件夹里面有Servers和Tools文件夹以及一些其 ...

  3. canvas 模拟小球上抛运动的物理效果

    最近一直想用学的canvas做一个漂亮的小应用,但是,发现事情并不是想的那么简单.比如,游戏的逼真效果,需要自己来coding…… 所以,自己又先做了一个小demo,算是体验一下亲手打造物理引擎的感觉 ...

  4. Aggregation(1):Blending、Bagging、Random Forest

    假设我们有很多机器学习算法(可以是前面学过的任何一个),我们能不能同时使用它们来提高算法的性能?也即:三个臭皮匠赛过诸葛亮. 有这么几种aggregation的方式: 一些性能不太好的机器学习算法(弱 ...

  5. 初学AngularJS

    最近一直想写个网站,所以在做技术准备.在搜索资料的过程中发现了AngularJS,于是顺藤摸瓜找到了一些资料. 学习的最好途径是:上课.                        其次是:看录像: ...

  6. 在Raspberry Pi上安装XBMC

    2013-05-22 XBMC is a free and open source media player application developed by the XBMC Foundation, ...

  7. mysql的point类型查询处理

    mysql的point类型,很蛋疼的表示更习惯于key—value的lng,lat 假设不得不处理数据库字段poi是point类型,其中的数据为 : POINT(28.2789745229671 11 ...

  8. JavaScript,通过分析Array.prototype.push重新认识Array

    在阅读ECMAScript的文档的时候,有注意到它说,数组的push方法其实不仅限于在数组中使用,专门留作通用方法.难道是说,在一些类数组的地方也可以使用?而哪些是和数组非常相像的呢,大家或许一下子就 ...

  9. JavaScript——对this指针的新理解

    一直以来对this的理解只在可以用,会用,却没有去深究其本质.这次,借着<JavaScript The Good Parts>,作了一次深刻的理解.(所有调试都可以在控制台中看到,浏览器F ...

  10. HDU 4562 守护雅典娜(dp)

    守护雅典娜 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submi ...