我正在开发一个需要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;
}
非常感谢任何帮助。
答案 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_name
是PyObject *
。因此,您还必须将其转换为char *
。
注意:您不想要使用PyCallable_Check
因为只有函数具有名称。其他callables不需要它。如果您希望能够处理通用callables并仅在函数的情况下获取名称,则仍需要显式检查PyFunction
s,然后检查通用callables。
上述解决方案避免了属性查找,因此它应该比调用PyObject_GetAttr*
更有效。