Хорошо, в конце концов я обнаружил, как это сделать. Пользовательские функции Python имеют член с именем func_code
(в Python 3.0+ это __code__
), который сам имеет член co_argcount
, что, по-видимому, является тем, что 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);
}
}
}
В любом случае, спасибо - эта нить действительно привела меня в правильном направлении:)