2010-08-20 75 views
4

我有類似下面的代碼:PyArg_ParseTuple和回調函數指針

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回調,每次都會產生不同的值,對嗎? (因爲地址每次都不一樣)。

回答

1

PyArg_ParseTuple不關心「O」arg的類型。沒有轉換完成。沒有新的對象被創建。該對象的地址將被放入您已指定的PyObject * C變量中。它與你的兩個參數完全相同。

我無法想象PyObject_Hash的相關性是什麼。如果你想比較你的回調參數的兩個化身,只需在地址上使用==即可。

0

問題是如果你兩次傳回相同的回調函數,它會收到兩個對象,但你永遠不會被允許只讀一個las寫的。您將有一種內存泄漏,因爲兩個指針中的一個不會被引用。當然垃圾收集器最終會在你清理完所有的垃圾之後通過。但無論如何...

我誤讀PyObject_Hash應在回調和路徑上調用。這將是相同的。但你可能想比較回調和路徑:if(callback == paths){printf(「它是相同的callabck」);}

+0

我想要的是能夠知道它是相同的回調函數。我怎麼做? – Paul 2010-08-20 17:20:30