【问题标题】:PyArg_ParseTuple and a callback function pointerPyArg_ParseTuple 和回调函数指针
【发布时间】:2010-08-20 15:37:13
【问题描述】:

我有如下代码:

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

【问题讨论】:

    标签: python c callback python-c-extension


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我想要的是能够知道它是同一个回调函数。我该怎么做?
      猜你喜欢
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多