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

C和Python集成:回调函数的名称,python,c,python-c-api,Python,C,Python C Api,我正在从事一个需要Python与C集成的项目。除了下面的一个问题外,我已经让它大部分工作正常: 如何在C代码中获取回调函数对象的字符串表示形式。(见我在代码中的注释) 导入mymodule c=0 def double_it(): c=c*2 返回 def倍增(a、b): 全球c c=a*b mymodule.print_结果(c,双击它) 返回 其中mymodule.print\u result定义为: 静态PyObject* 打印结果(PyObject*self,PyObject*args

我正在从事一个需要Python与C集成的项目。除了下面的一个问题外,我已经让它大部分工作正常: 如何在C代码中获取回调函数对象的字符串表示形式。(见我在代码中的注释)

导入mymodule
c=0
def double_it():
c=c*2
返回
def倍增(a、b):
全球c
c=a*b
mymodule.print_结果(c,双击它)
返回
其中
mymodule.print\u result
定义为:

静态PyObject*
打印结果(PyObject*self,PyObject*args)
{
PyObject*pCallBackFunc,*pArgs;
int result;
char*func_name=NULL;//我想填写这个
if(!PyArg_ParseTuple(args、iO、&result和pCallBackFunc))
{
printf(“ERRPR\n”);
返回NULL;
}
if(PyCallable_检查(pCallBackFunc)){
Py_XINCREF(pCallBackFunc);
//func_name=…如何获取回调函数的“double_it”???
PyObject_CallObject(pCallBackFunc,pArgs);
Py_XDECREF(pCallBackFunc);
返回Py_None;
}
非常感谢您的帮助。

您可以了解该功能是如何实现的

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

PyObject*
获取函数名称(PyFunctionObject*fun){
Py_增量(乐趣->功能名称);
返回fun->func_name;
}
用作:

if(!PyArg_ParseTuple(args、iO、&result和pCallBackFunc))
{
printf(“ERRPR\n”);
返回NULL;
}
if(PyFunction_Check(pCallBackFunc)){
func_name=get_function_name((PyFunctionObject*)pCallBackFunc);
PyObject_CallObject(pCallBackFunc,pArgs);
Py_返回_无;
}
但是
func\u name
是一个
PyObject*
。因此您还必须将其转换为
char*


注意:您不想使用
PyCallable\u Check
,因为只有函数有名称。其他可调用项不需要名称。如果您想能够处理通用可调用项并仅在函数的情况下获取名称,您仍然必须显式检查
PyFunction
s,然后检查通用可调用项


上述解决方案避免了属性查找,因此它应该比调用
PyObject\u GetAttr*

更有效。您可以查看函数的实现方式

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

PyObject*
获取函数名称(PyFunctionObject*fun){
Py_增量(乐趣->功能名称);
返回fun->func_name;
}
用作:

if(!PyArg_ParseTuple(args、iO、&result和pCallBackFunc))
{
printf(“ERRPR\n”);
返回NULL;
}
if(PyFunction_Check(pCallBackFunc)){
func_name=get_function_name((PyFunctionObject*)pCallBackFunc);
PyObject_CallObject(pCallBackFunc,pArgs);
Py_返回_无;
}
但是
func\u name
是一个
PyObject*
。因此您还必须将其转换为
char*


注意:您不想使用
PyCallable\u Check
,因为只有函数有名称。其他可调用项不需要名称。如果您想能够处理通用可调用项并仅在函数的情况下获取名称,您仍然必须显式检查
PyFunction
s,然后检查通用可调用项



上面的解决方案避免了属性查找,因此它应该比调用
PyObject\u GetAttr*

的效率更高,这与在Python中使用的方法相同,但在C中则相反

PyObject_GetAttrString(pCallBackFunc, "__name__")

与在Python中执行此操作的方式相同,但使用C

PyObject_GetAttrString(pCallBackFunc, "__name__")

func\u-get\u-name
声明为静态。@tynn您是对的。但是实现很简单。我将把它添加到答案中。
func\u-get\u-name
声明为静态。@tynn完全可以。如果对象有名称,可以使用对象的表示形式而不是名称。