C与Python集成:回调函数名

C and Python integration: name of callback function

我正在从事一个需要 Python 与 C 集成的项目。除了以下一个问题外,我大部分时间都在使用它: 如何在 C 代码中获取回调函数对象的字符串表示形式。 (见我在代码中的评论)

import mymodule
c=0

def double_it():
   c = c * 2
   return

def multiply(a, b):
   global c
   c = a*b
   mymodule.print_result(c, double_it)
   return

其中 mymodule.print_result 定义为:

static PyObject*
print_result(PyObject* self, PyObject* args)
{
    PyObject *pCallBackFunc, *pArgs;
    int restult;
    char *func_name = NULL; // I want to fill this

    if (!PyArg_ParseTuple(args, "iO", &result, &pCallBackFunc))
    {
         printf ("ERRPR\n");
         return NULL;
     }

 if (PyCallable_Check(pCallBackFunc)) {
    Py_XINCREF(pCallBackFunc);

     // func_name = .... How to get the of the call back function that is "double_it" ??? 

   PyObject_CallObject(pCallBackFunc, pArgs);
   Py_XDECREF(pCallBackFunc);
   return Py_None;
}

非常感谢任何帮助。

你可以看看func_get_name函数是如何实现的。

因此,要访问函数的名称,只需使用:

PyObject *
get_function_name(PyFunctionObject *fun) {
    Py_INCREF(fun->func_name);
    return fun->func_name;
}

用作:

if (!PyArg_ParseTuple(args, "iO", &result, &pCallBackFunc))
{
     printf ("ERRPR\n");
     return NULL;
}

if (PyFunction_Check(pCallBackFunc)) {

   func_name = get_function_name((PyFunctionObject *)pCallBackFunc);

   PyObject_CallObject(pCallBackFunc, pArgs);
   Py_RETURN_NONE;
}

然而func_name是一个PyObject *。所以你还必须将它转换成 char *.


注意:您不是想要使用PyCallable_Check,因为只有函数才有名称。其他可调用对象不需要它。如果您希望能够处理通用可调用对象并仅在函数的情况下获取名称,您仍然必须显式检查 PyFunctions,然后再检查通用可调用对象。


上述解决方案避免了属性查找,因此它应该比调用 PyObject_GetAttr*.

更有效

与在 Python 中的方法相同,但在 C 中。

PyObject_GetAttrString(pCallBackFunc, "__name__")