您的位置:首页 > 编程语言 > Python开发

python 源码解读2

2016-05-19 20:22 543 查看
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, '100', '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 ('100')
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='100'
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score

def func():
a="hello"
b=1
c=1.0
d='100'
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': '100',
'__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': '100',
'__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的下标;
第五列带括号的是操作数说明。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: