Перегрузка встроенных функций Python с использованием PyArg_ParseTuple - PullRequest
2 голосов
/ 18 февраля 2010

Если я пытаюсь перегрузить встроенную функцию Python, чтобы второй аргумент мог быть длинным или объектом, существует ли стандартный способ сделать это? Это оно?

Что я сейчас пытаюсь (имена изменены, чтобы защитить невинных):

  bool UseLongVar2 = true;
  if (!PyArg_ParseTuple(args, "ll:foo", &LongVar1, &LongVar2))
  {
      PyErr_Clear();
      if (!PyArg_ParseTuple(args, "lO&:foo", &LongVar1, convertObject, &Object))
      {
         UseLongVar2 = false;
         return NULL;
      }
  }

1 Ответ

3 голосов
/ 19 февраля 2010

Что я обычно делаю, так это две функции C, которые принимают разные аргументы. Задача функции, обращенной к python, состоит в том, чтобы проанализировать аргументы, вызвать соответствующую функцию C и построить возвращаемое значение, если оно есть.

Это довольно часто, когда, например, вы хотите разрешить как байтовые, так и Unicode-строки.

Вот пример того, что я имею в виду.

// Silly example: get the length of a string, supporting Unicode and byte strings
static PyObject* getlen_py(PyObject *self, PyObject *args)
{
    // Unpack our argument (error handling omitted...)
    PyObject *arg = NULL;
    PyArg_UnpackTuple(args, "getlen", 1, 1, arg) ;

    if ( PyUnicode_Check(arg) )
    {
        // It's a Unicode string
        return PyInt_FromLong(getlen_w(PyUnicode_AS_UNICODE(arg))) ;
    }
    else
    {
        // It's a byte string
        return PyInt_FromLong(getlen_a(PyString_AS_STRING(arg))) ;
    }
}
...