我正在使用Python的C-API。具体来说,我想看看是否可以检查值堆栈当前有多少个元素。这是我的代码:
#include <Python.h>
#include <frameobject.h>
int test() {
PyFrameObject* f = PyEval_GetFrame();
return (int)(f->f_stacktop - f->f_valuestack);
}
我不确定这是否可以工作,但是Python's source code中存在此行,因此我尝试了一下。
这通常导致负数,类似于-547715639
。
很明显,我做错了,可能是因为文档"Frame evaluation usually NULLs it (f_stacktop)"中所述。什么是正确的方法,甚至有可能?
不可能。参见this answer。
总之,我应该使用
(int)(stack_pointer - f->f_valuestack);
但是,stack_pointer
是_PyEval_EvalFrameDefault函数内部的局部变量,因此无法从外部访问。