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
,因为只有函数才有名称。其他可调用对象不需要它。如果您希望能够处理通用可调用对象并仅在函数的情况下获取名称,您仍然必须显式检查 PyFunction
s,然后再检查通用可调用对象。
上述解决方案避免了属性查找,因此它应该比调用 PyObject_GetAttr*
.
更有效
与在 Python 中的方法相同,但在 C 中。
PyObject_GetAttrString(pCallBackFunc, "__name__")
我正在从事一个需要 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
,因为只有函数才有名称。其他可调用对象不需要它。如果您希望能够处理通用可调用对象并仅在函数的情况下获取名称,您仍然必须显式检查 PyFunction
s,然后再检查通用可调用对象。
上述解决方案避免了属性查找,因此它应该比调用 PyObject_GetAttr*
.
与在 Python 中的方法相同,但在 C 中。
PyObject_GetAttrString(pCallBackFunc, "__name__")