Что я обычно делаю, так это две функции 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))) ;
}
}