我正在使用Python C API從我的應用程序調用Python函數。我想介紹一個可以調用的函數列表,並希望能夠將這個列表限制爲只有那些具有期望數量的參數的列表。如何從C中查找Python函數的參數數量?
我很高興我可以走字典來提取函數列表,並使用PyCallable_Check
來查明它們是否可以調用,但我不知道如何找出每個函數有多少個參數需要?
我發現了一種涉及Boost :: Python的技術,但寧願不加添加(爲什麼)(我希望!)將是一個小增加。
謝謝:)
我正在使用Python C API從我的應用程序調用Python函數。我想介紹一個可以調用的函數列表,並希望能夠將這個列表限制爲只有那些具有期望數量的參數的列表。如何從C中查找Python函數的參數數量?
我很高興我可以走字典來提取函數列表,並使用PyCallable_Check
來查明它們是否可以調用,但我不知道如何找出每個函數有多少個參數需要?
我發現了一種涉及Boost :: Python的技術,但寧願不加添加(爲什麼)(我希望!)將是一個小增加。
謝謝:)
Maybe this is helpful?(未測試,有可能是沿着這條線信息相關件)...
你的C代碼可以調用inspect.getargspec就像任何Python代碼會(例如,通過PyObject_CallMethod或其他等效的方式)並獲得關於每個功能或其他可關注的可調用的簽名的所有獨家新聞。
好的,所以最終我發現瞭如何去做。用戶定義的Python函數有一個名爲func_code
的成員(在Python 3.0+中它是__code__
),它本身有一個成員co_argcount
,這大概是由Christophe給出的示例中Boost :: Python提取的。
我用這樣的容貌(它主要基於如何走一個Python字典中的文檔,示例)代碼:
PyObject *key, *value;
int pos = 0;
while(PyDict_Next(pyDictionary, &pos, &key, &value)) {
if(PyCallable_Check(value)) {
PyObject* fc = PyObject_GetAttrString(value, "func_code");
if(fc) {
PyObject* ac = PyObject_GetAttrString(fc, "co_argcount");
if(ac) {
const int count = PyInt_AsLong(ac);
// we now have the argument count, do something with this function
Py_DECREF(ac);
}
Py_DECREF(fc);
}
}
}
還是要謝謝你 - 那個線程確實導致我在正確的方向:)
是upvoting因爲確實有相關的信息:) – Peter 2009-07-13 04:49:19