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 这些定义的内容。
请注意,这一切看起来都没有记录,所以您不应该完全依赖它而不改变。
我有一个使用 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 这些定义的内容。
请注意,这一切看起来都没有记录,所以您不应该完全依赖它而不改变。