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/ 访问所 ...
随机推荐
- <译>Selenium Python Bindings 2 - Getting Started
Simple Usage如果你已经安装了Selenium Python,你可以通过Python这样使用: #coding=gbk ''' Created on 2014年5月6日 @author: u ...
- 常用SQL语句汇总整理
1.SQL 插入语句得到自动生成的递增ID 值 insert into Table1(Name,des,num) values (''ltp'',''thisisbest'',10); select ...
- 【转】javascript-图片预加载技术
1,脚本代码: /** * 图片头数据加载就绪事件 - 更快获取图片尺寸 * @version 2011.05.27 * @author TangBin * @see http://www.plane ...
- PHP 调用外部程序的几种方式
/* php 调用python 的代码 // 第一种: // echo passthru('C:/Python34/PY.exe D:/do.py'); // 第二种: // echo exec('C ...
- Tkinter教程之Scale篇
本文转载自:http://blog.csdn.net/jcodeer/article/details/1811313 '''Tkinter教程之Scale篇'''#Scale为输出限定范围的数字区间, ...
- ACM竞赛 Java编程小结
1.字符串的长度 String str = new String(" abcd"); int length = str.length(); 2.数组的长度.排序 2.1对于 a[] ...
- CentOS 安装 Sun JDK
1. 卸载原Open JDK 查看已安装包 rpm -qa | grep java 如果已经安装有Open JDK,可能会列出类似下面的内容: tzdata-java-2015e-.el6.noarc ...
- Apache Spark GraphX的特点
GraphX 的特点是离线计算.批量处理,基于同步的 BSP 模型(Bulk Synchronous Parallel Computing Model,整体同步并行计算模型),这样的优势在于可以提升数 ...
- 【转】你真的了解iOS代理设计模式吗?
转自:http://www.cocoachina.com/ios/20160317/15696.html 在项目中我们经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式来传递 ...
- 【转】使用Auto Layout中的VFL(Visual format language)--代码实现自动布局
本文将通过简单的UI来说明如何用VFL来实现自动布局.在自动布局的时候避免不了使用代码来加以优化以及根据内容来实现不同的UI. 一:API介绍 NSLayoutConstraint API 1 2 3 ...