¿Cómo encontrar el número de parámetros para una función de Python desde C?

Estoy usando la API de Python C para llamar a funciones de Python desde mi aplicación. Me gustaría presentar una lista de funciones que podrían llamarse y me gustaría poder limitar esta lista a solo aquellas con el número esperado de parámetros.

Estoy feliz de poder recorrer el diccionario para extraer una lista de funciones y usar PyCallable_Check para averiguar si se pueden llamar, pero no estoy seguro de cómo puedo saber cuántos parámetros espera cada función.

He encontrado una técnica que involucra a Boost :: Python, pero preferiría no agregarla, ya que (¡espero!) Será una adición menor.

Gracias 🙂

Bien, al final he descubierto cómo hacerlo. Las funciones de Python definidas por el usuario tienen un miembro llamado func_code (en Python 3.0+ es __code__ ), que a su vez tiene un miembro co_argcount , que probablemente sea lo que Boost :: Python extrae en el ejemplo dado por Christophe.

El código que estoy usando se parece a esto (se basa en gran medida en un ejemplo de documentación sobre cómo utilizar un diccionario de 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); } } } 

Gracias de todos modos, ese hilo me guió en la dirección correcta 🙂

Tal vez esto es útil? (No probado, podría haber información relevante a lo largo de este hilo) …

Su código C puede llamar a inspect.getargspec como lo haría cualquier código Python (por ejemplo, a través de PyObject_CallMethod u otras formas equivalentes) y obtener toda la primicia sobre la firma de cada función u otro nombre que se pueda llamar.