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/ 访问所 ...
随机推荐
- 转载:看c++ primer 学习心得
学习C++ Primer时遇到的问题及解释 chenm91 感觉: l 啰嗦有时会掩盖主题:这本书确实有些啰嗦,比如在讲函数重载的时候,讲了太长一大段(有两节是打了*号的,看还是不看 ...
- webdriver(python)学习笔记二
自己开始一个脚本开始学习: # coding = utf-8 from selenium import webdriver browser = webdriver.Firefox() browser. ...
- bzoj3884: 上帝与集合的正确用法 欧拉降幂公式
欧拉降幂公式:http://blog.csdn.net/acdreamers/article/details/8236942 糖教题解处:http://blog.csdn.net/skywalkert ...
- flashback database 基本介绍一
flashback database 整个架构包括一个进程recover writer (rvwr)后台进程,flashback database log 日志和flash recovery area ...
- ASP.NET MVC3 系列教程 - Razor视图引擎基础语法
http://www.cnblogs.com/highend/archive/2011/04/09/aspnet_mvc3_razor_engine.html 4. 关于所有带"_" ...
- Buffer -nodejs
纯 JavaScript 对 Unicode 友好但是无法很好地处理二进制数据.当我们面对类似 TCP 流或文件系统时,是需要处理八位流的.Node 有几种操作.创建以及消费八位流的策略.原始数据保存 ...
- Things App Engine Doesn't Do...Yet
当人们第一次使用App Engine的时候,他们会问一些App Engine不会做的事情.其中的一些事情Google在不久的将来会实现的,还有一些违背了App Engine设计的本质,将不可能增加(到 ...
- Getting Started(Google Cloud Storage Client Library)
在运行下面的步骤之前,请确保: 1.你的项目已经激活了Google Cloud Storage和App Engine,包括已经创建了至少一个Cloud Storage bucket. 2.你已经下载了 ...
- Excel动态生成JSON
在最近的一个项目中,有大量的数据源来至Excel,转成JSON供前台使用.Excel数据是人工录入的,难免会有错误,所以中间会有逻辑检查.在C#中读取Excel的方式有很多,网上一搜一大堆,这里我也贴 ...
- 03 javadoc
javadoc从程序源代码中抽取类.方法.成员等注释形成一个和源代码配套的API帮助文档 1.标签.命令格式: 2.使用方式: 2.1 dos命令行格式:javadoc XXX.java 2.2 ec ...