经由过程 SET_TOP, 已经将我们须要真正履行的函数压入运行时栈, 接下来就是经由过程CALL_FUNCTION 来调用这个函数对象, 持续来看看具体过程:
- //取自: python2.7/objects/ceval.c
- TARGET(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) DISPATCH();
- break;
- }
- static PyObject *
- call_function(PyObject ***pp_stack, int oparg)
- {
- int na = oparg & 0xff; // 地位参数个数
- int nk = (oparg>>8) & 0xff; // 关键地位参数的个数
- int n = na + 2 * nk; // 总的个数和
- PyObject **pfunc = (*pp_stack) - n - 1; // 当前栈地位-参数个数,获得函数对象
- PyObject *func = *pfunc;
- PyObject *x, *w;
- ... // 省略前面细节, 只看关键调用
- if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) {
- /* optimize access to bound methods */
- PyObject *self = PyMethod_GET_SELF(func);
- PCALL(PCALL_METHOD);
推荐阅读
5月11日下昼,以“视”创将来为主题的首届家庭及时视频家当联盟论坛在深圳福田隆重召开。华为云核心>>>详细阅读
本文标题:Python中的函数与方法 以及Bound Method和Unbound Method
地址:http://www.17bianji.com/lsqh/35218.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示