PyArg_ParseTuple 和回调函数指针

5 投票
2 回答
1339 浏览
提问于 2025-04-16 03:05

我有如下的代码:

    PyObject *callback;
    PyObject *paths;

    // Process and convert arguments
    if (!PyArg_ParseTuple(args, "OO:schedule", &paths, &callback))
            return NULL;

那么,PyArg_ParseTuple里面到底发生了什么呢?我猜测是回调函数得到了我传给args的函数指针(也是PyObject*)。PyArg_ParseTuple是怎么把这个函数指针转换成PyObject*的呢?

我想知道的是,如果我两次传入同一个回调函数指针,会发生什么?我觉得在PyArg_ParseTuple里面,回调函数会被分配一个新的PyObject,所以每次的内存地址会不同,但里面的回调函数指针是一样的。

但是如果我对回调函数使用PyObject_Hash,它每次会产生不同的值,对吧?(因为每次的地址都不同……)

2 个回答

0

重点是,如果你把同一个回调函数传递两次,它会接收到两个对象,但你只能读取最后一个写入的对象。这样会造成一种内存泄漏,因为这两个对象中有一个不会被引用。当然,垃圾回收器最终会来清理这些混乱。不过不管怎样……

我之前误解了,PyObject_Hash 应该在回调函数和路径上调用。其实它们是一样的,但你可能想比较回调函数和路径:如果(callback==paths) {printf("这是同一个回调函数");}

1

PyArg_ParseTuple 这个函数不在乎你传入的 "O" 参数是什么类型。它不会进行任何转换,也不会创建新的对象。它只是把对象的地址放进你指定的 PyObject * C 变量里。对你传入的两个参数,它的处理方式是完全一样的。

我想不出 PyObject_Hash 有什么用。如果你想比较两个回调参数的不同实例,只需要用 == 来比较它们的地址就可以了。

撰写回答