python 源码解读2
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的更多相关文章
- selenium之python源码解读-expected_conditions
一.expected_conditions 之前在 selenium之python源码解读-WebDriverWait 中说到,until方法中method参数,需要传入一个function对象,如果 ...
- 如何判断一个Http Message的结束——python源码解读
HTTP/1.1 默认的连接方式是长连接,不能通过简单的TCP连接关闭判断HttpMessage的结束. 以下是几种判断HttpMessage结束的方式: 1. HTTP协议约定status ...
- selenium之python源码解读-webdriver继承关系
一.webdriver继承关系 在selenium中,无论是常用的Firefox Driver 还是Chrome Driver和Ie Drive,他们都继承至selenium\webdriver\re ...
- selenium之python源码解读-WebDriverWait
一.显示等待 所谓显示等待,是针对某一个特定的元素设置等待时间,如果在规定的时间内找到了该元素,就执行相关的操作,如果在规定的时间内没有找到该元素,在抛出异常 PS:注意显示等待和隐身等待的区别,隐身 ...
- Apache Beam WordCount编程实战及源码解读
概述:Apache Beam WordCount编程实战及源码解读,并通过intellij IDEA和terminal两种方式调试运行WordCount程序,Apache Beam对大数据的批处理和流 ...
- 基于Docker的TensorFlow机器学习框架搭建和实例源码解读
概述:基于Docker的TensorFlow机器学习框架搭建和实例源码解读,TensorFlow作为最火热的机器学习框架之一,Docker是的容器,可以很好的结合起来,为机器学习或者科研人员提供便捷的 ...
- Spark学习之路 (十六)SparkCore的源码解读(二)spark-submit提交脚本
一.概述 上一篇主要是介绍了spark启动的一些脚本,这篇主要分析一下Spark源码中提交任务脚本的处理逻辑,从spark-submit一步步深入进去看看任务提交的整体流程,首先看一下整体的流程概要图 ...
- ansible源码解读
Ansible源码获取 Ansible Github:https://github.com/ansible Ansible目录结构 $ tree -L 2 ansible-2.0.0.0 ansibl ...
- DRF(1) - REST、DRF(View源码解读、APIView源码解读)
一.REST 1.什么是编程? 数据结构和算法的结合. 2.什么是REST? 首先回顾我们曾经做过的图书管理系统,我们是这样设计url的,如下: /books/ /get_all_books/ 访问所 ...
随机推荐
- 联通光纤上网配置+华为HG8240光猫+TL-WR842N
最近搬家改用北京联通宽带,光纤入户的那种.联通送的光猫是华为HG8240,没看到天线,应该是不带无线路由.然后自己再买了个TP-Link的TL-WR842N,用来组局域网,也供ipad.kindle. ...
- poj-3056 http://poj.org/problem?id=3056
http://poj.org/problem?id=3056 The Bavarian Beer Party Time Limit: 6000MS Memory Limit: 65536K Tot ...
- 使用IP欺骗Loadrunner并发测试小结
测试要求: 在本次测试中,我需要并发50个User,每一个User占用一个独立的IP,并且只执行一次脚本.脚本中发起两个请求,其中第一次请求返回200后才执行第二个请求.使用win7 OS. ...
- Redrain仿酷狗音乐播放器开发完毕,发布测试程序
转载请说明原出处,谢谢~~ 从暑假到现在中秋刚过,我用duilib开发仿酷狗播放器大概经历了50天.做仿酷狗的意图只是看原酷狗的界面比较漂亮,想做个完整一些的工程来练习一下duilib.今天把写好的程 ...
- 总结:ADO.NET在开发中的部分使用方法和技巧
如何使用 SqlDataAdapter 来检索多个行 以下代码阐明了如何使用 SqlDataAdapter 对象发出可生成 DataSet 或 DataTable 的命令.它从 SQL Server ...
- [原创]cocos2d-x + Lua接入iOS原生SDK的实现方案
相信很多朋友在使用cocos2d-x+lua开发游戏时都遇到过接入iOS原生SDK的问题,比如常见的接应用内支付SDK,广告SDK或是一些社交平台SDK等等,我也没少接过这类SDK.这篇文章主要是对我 ...
- 数往知来C#之面向对象准备〈一〉
1.CLR加载编译源文件 注1.:当你点击调试或者生成解决方案的时候这就是一个编译过程首先CLR加载源文件也就是你写的代码(此代码在文件中是字符串)然后将项目中的嗲吗编译成IL代码进而生成程序集 证明 ...
- codeforce 702E Analysis of Pathes in Functional Graph RMQ+二进制
http://codeforces.com/contest/702 题意:n个点,n条边,每个点出边只有一条,问从每个点出发经过k条边的边权和,以及边权最小值 思路: f[i][j] 第i个点出发,经 ...
- bzoj4578: [Usaco2016 OPen]Splitting the Field
2365: Splitting the Field 题意:n个点,求用两个矩形面积覆盖完所有点和一个矩形覆盖完少多少面积 思路:枚举两个矩形的分割线,也就是把所有点分成两个部分,枚举分割点:先预处理每 ...
- Android与Mysql服务器通信
需求:在手机端读取蓝牙传输过来的数据,然后发送到mysql 安卓前期版本可以直接使用mysql connector, 现在只能通过访问url传递数据了. 服务器端写php脚本,接受发送过来的url请求 ...