Python C Api 检查 PyObject 是否指向特定的 PyCFunction

Python C Api check if PyObject points to a specific PyCFunction

我有一个使用 Python C API:

编写的模块
static PyObject* my_func1(PyObject* /*self*/, PyObject* args)
{
  Py_RETURN_NONE;
}

static PyObject* my_func2(PyObject* /*self*/, PyObject* args)
{
  Py_RETURN_NONE;
}


static PyMethodDef methods[] = {
    {"my_func1", (PyCFunction)my_func1, METH_VARARGS, ""}, 
    {"my_func2", (PyCFunction)my_func2, METH_VARARGS, ""},
    {NULL, NULL, 0, NULL} /* sentinel */
};

static struct PyModuleDef moduledef = {                                                          
      PyModuleDef_HEAD_INIT, my_module, NULL, -1, methods, NULL, NULL, NULL, NULL
};                     
 
PyMODINIT_FUNC PyInit_my_module(void){                                                                                                
    return PyModule_Create(&moduledef);                                                            
}

作为参数之一,用户可以传递一个函数,例如:

my_func1(my_func2)

我如何在 my_func1 中检测到用户传递的参数是一个函数,它使用 Python C API 指向 my_func2

您可以使用 PyCFunction_Check 来测试 object 是否是 C 函数,并使用 PyCFunction_GetFunction 来获取 C 函数指针。然后您可以只比较 C 函数指针。如果您想查看签名,相关 header 在 https://github.com/python/cpython/blob/4c9ea093cd752a6687864674d34250653653f743/Include/methodobject.h

这看起来至少可以追溯到 Python 3.6(可能更远),尽管它有点难以追踪,因为他们已经移动了 header 这些定义的内容。

请注意,这一切看起来都没有记录,所以您不应该完全依赖它而不改变。