C和Python集成:回调函数的名称

时间:2015-10-02 06:13:16

标签: python c python-c-api

我正在开发一个需要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;
}

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

你可以用Python做同样的事情,但用C代替。

PyObject_GetAttrString(pCallBackFunc, "__name__")

答案 1 :(得分:1)

您可以查看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_namePyObject *。因此,您还必须将其转换为char *

注意:您想要使用PyCallable_Check因为只有函数具有名称。其他callables不需要它。如果您希望能够处理通用callables并仅在函数的情况下获取名称,则仍需要显式检查PyFunction s,然后检查通用callables。

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