Как узнать количество параметров для функции Python из C? - PullRequest
3 голосов
/ 13 июля 2009

Я использую Python C API для вызова функций Python из моего приложения. Я хотел бы представить список функций, которые можно вызывать, и хотел бы иметь возможность ограничить этот список только теми, которые имеют ожидаемое количество параметров.

Я счастлив, что могу пройтись по словарю, чтобы извлечь список функций, и использовать PyCallable_Check, чтобы узнать, можно ли их вызвать, но я не уверен, как узнать, сколько параметров у каждой функции ожидая

Я нашел одну технику, включающую Boost :: Python, но не хотел бы добавлять ее, что (надеюсь!) Будет незначительным дополнением.

Спасибо:)

Ответы [ 3 ]

4 голосов
/ 13 июля 2009

Хорошо, в конце концов я обнаружил, как это сделать. Пользовательские функции 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);
         }
      }
   }

В любом случае, спасибо - эта нить действительно привела меня в правильном направлении:)

1 голос
/ 13 июля 2009

Может быть, это полезно? (не проверено, может быть соответствующая информация в этой теме) ...

0 голосов
/ 13 июля 2009

Ваш код на C может вызвать inspect.getargspec , как и любой код Python (например, через PyObject_CallMethod или другими эквивалентными способами), и получить всю информацию о сигнатуре каждой функции или другой вызываемый, который может заботиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...