我的代码如下:
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回调中,每次都会产生不同的值,对吧? (因为地址每次都不同..)
答案 0 :(得分:1)
PyArg_ParseTuple
并不关心“O”arg的类型。没有转换。没有创建新对象。对象的地址将被放入您指定的PyObject *
C变量中。它对你的两个args完全相同。
我无法想象PyObject_Hash
的相关性。如果你想比较你的回调arg的两个版本,只需在地址上使用==
。
答案 1 :(得分:0)
重点是,如果你传递两次相同的回调,它将收到两个对象,但你永远不会被允许只读一个是las写的。您将有一种内存泄漏,因为两个指针之一将不会被引用。当然垃圾收集器最终会在你清理完所有垃圾之后通过。但无论如何......
我误读PyObject_Hash应该在回调和路径上调用。它会是一样的。但你可能想要比较回调和路径:if(callback == paths){printf(“它是相同的callabck”);}