demo.py:
i = 1
def f():
j = 2
f()
test.py:
import dis
source = open('./demo.py').read()
co = compile(source, './demo.py', 'exec')
print(co.co_name)
dis.dis(co)
print("\n")
fCode = co.co_consts[1]
print(fCode.co_name)
dis.dis(fCode)
输出:
<module>
1 0 LOAD_CONST 0 (1)
3 STORE_NAME 0 (i)
3 6 LOAD_CONST 1 (<code object f at 0x022F5430, file "./demo.py", line 3>)
9 MAKE_FUNCTION 0
12 STORE_NAME 1 (f)
6 15 LOAD_NAME 1 (f)
18 CALL_FUNCTION 0
21 POP_TOP
22 LOAD_CONST 2 (None)
25 RETURN_VALUE
f
4 0 LOAD_CONST 1 (2)
3 STORE_FAST 0 (j)
6 LOAD_CONST 0 (None)
9 RETURN_VALUE
对于def f():这一语句,Python虚拟机先将函数f对应的PyCodeObject入栈,然后再MAKE_FUNCTION。
case MAKE_FUNCTION:
v = POP(); /* code object */
x = PyFunction_New(v, f->f_globals);
Py_DECREF(v);
/* XXX Maybe this should be a separate opcode? */
if (x != NULL && oparg > 0) {
v = PyTuple_New(oparg);
if (v == NULL) {
Py_DECREF(x);
x = NULL;
break;
}
while (--oparg >= 0) {
w = POP();
PyTuple_SET_ITEM(v, oparg, w);
}
err = PyFunction_SetDefaults(x, v);
Py_DECREF(v);
}
PUSH(x);
break;
在相应代码中,将对应的PyCodeObject和帧的全局符号表指针传递给PyFunction_New函数,调用之,最后将返回值入栈。
在PyFunction_New函数中,创建一个PyFunctionObject,然后初始化相应的成员信息,返回之。
而对于函数f的调用,首先将函数名入栈,再执行CALL_FUNCTION:
case CALL_FUNCTION:
{
PyObject **sp;
PCALL(PCALL_ALL);
sp = stack_pointer;
#ifdef WITH_TSC
x = call_function(&sp, oparg, &intr0, &intr1);
#else
x = call_function(&sp, oparg);
#endif
stack_pointer = sp;
PUSH(x);
if (x != NULL)
continue;
break;
}
在这里,将栈顶指针和参数信息传递给函数call_function,然后恢复栈顶指针,将返回值入栈。
最后实际上是创建了一页帧,然后以帧作为活动环境,调用PyEval_EvalFrameEx函数。
f = PyFrame_New(tstate, co, globals, NULL);
if (f == NULL)
return NULL;
fastlocals = f->f_localsplus;
stack = (*pp_stack) - n;
for (i = 0; i < n; i++) {
Py_INCREF(*stack);
fastlocals[i] = *stack++;
}
retval = PyEval_EvalFrameEx(f,0);
JasonLee 2011.08.27 19:52
分享到:
相关推荐
python高阶函数心得笔记
python笔记python笔记python笔记python笔记python笔记python笔记python笔记python笔记python笔记
Python笔记PythonPython笔记笔Python笔Python笔记记记Python笔记
python学习笔记,包含一般函数-向量化函数-二元运算-ufunc对象
疯狂Python讲义笔记 Python基础入门到进阶知识手册 对照原文的笔记 由浅入深 循序渐进的笔记
Python学习笔记 .pdf Python学习笔记 .pdf Python学习笔记 .pdf Python学习笔记 .pdf Python学习笔记 .pdf Python学习笔记 .pdf Python学习笔记 .pdf Python学习笔记 .pdf Python学习笔记 .pdf Python学习笔记 .pdf ...
Python数据分析实战 内利著 学习笔记 Python数据分析实战 内利著 学习笔记 Python数据分析实战 内利著 学习笔记 Python数据分析实战 内利著 学习笔记 Python数据分析实战 内利著 学习笔记 Python数据分析实战 内利著...
个人学习所用,对python3内置函数以及面向对象等思想的整理所得
Python笔记 ,python笔记全,Python源码
上课笔记——虚拟机基础知识
python学习笔记,包含choose 函数实现条件筛选-数组广播机制-数组读写-结构化数组
2.1 Python中的输入输出函数 2.2 Python中的注释 2.3 Python中的变量 3、Python中的基本数据类型 3.1 整型-int 3.2 浮点型-float 3.3 布尔类型-bool 3.4 字符串类型-str 4、Python中的常见运算符 4.1 算术...
win7笔记本与虚拟机中的Ubuntu用tftp进行文件传输
Python基础,适合小白学习使用,本人学习时整理的笔记。
python的毕业设计云笔记平台分析与设计。基于python的云笔记平台分析与设计python的毕业设计云笔记平台分析与设计。基于python的云笔记平台分析与设计python的毕业设计云笔记平台分析与设计。基于python的云笔记平台...
Python基础知识总结笔记(四)函数 python中的函数 函数中的参数 变量作用域 偏函数PFA 递归函数 高阶函数 BIFs中的高阶函数 匿名函数lambda 闭包Closure 装饰器Decorator 函数式编程Functional Programming 1. ...
Python语言目前是容易学习的语言,而且是前景最好的语言,感兴趣的朋友可以下载学习
python源码剖析笔记 python源码剖析笔记 python源码剖析笔记
Python 笔记源码——内含python后端&机器学习等.zip Python 笔记源码——内含python后端&机器学习等.zip Python 笔记源码——内含python后端&机器学习等.zip Python 笔记源码——内含python后端&机器学习等.zip ...
python学习笔记python学习笔记python学习笔记python学习笔记python学习笔记