5

我有如下代码:

    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 回调,它每次都会产生不同的值,对吧?(因为地址每次都不一样..)

4

2 回答 2

1

PyArg_ParseTuple不关心“O”参数的类型。没有进行转换。没有创建新对象。对象的地址被放入PyObject *您指定的 C 变量中。它对您的两个参数中的每一个都完全相同。

我无法想象 的相关性是什么PyObject_Hash。如果要比较回调 arg 的两个化身,只需==在地址上使用。

于 2010-08-22T12:00:56.310 回答
0

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

我误读了 PyObject_Hash 应该在回调和路径上调用。它会是一样的。但您可能想比较回调和路径: if(callback==paths) {printf("it's the same callabck");}

于 2010-08-20T17:14:05.027 回答