PyArg_ParseTuple和一个回调函数指针

时间:2010-08-20 15:37:14

标签: python c callback python-c-extension

我的代码如下:

    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 :(得分:1)

PyArg_ParseTuple并不关心“O”arg的类型。没有转换。没有创建新对象。对象的地址将被放入您指定的PyObject * C变量中。它对你的两个args完全相同。

我无法想象PyObject_Hash的相关性。如果你想比较你的回调arg的两个版本,只需在地址上使用==

答案 1 :(得分:0)

重点是,如果你传递两次相同的回调,它将收到两个对象,但你永远不会被允许只读一个是las写的。您将有一种内存泄漏,因为两个指针之一将不会被引用。当然垃圾收集器最终会在你清理完所有垃圾之后通过。但无论如何......

我误读PyObject_Hash应该在回调和路径上调用。它会是一样的。但你可能想要比较回调和路径:if(callback == paths){printf(“它是相同的callabck”);}