使用PyArg_ParseTuple重载嵌入式Python函数
如果我想要重载一个嵌入式的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
我通常会写两个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))) ;
}
}