使用PyArg_ParseTuple重载嵌入的Python函数

时间:2010-02-18 19:54:16

标签: python overloading embedded-language

如果我试图重载嵌入式Python函数,以便第二个参数可以是long或Object,那么有一种标准的方法吗?这是吗?

我现在正在尝试(更改名称以保护无辜者):

  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 个答案:

答案 0 :(得分:3)

我通常做的是有两个带有不同参数的C函数。 “python-facing”函数的工作是解析参数,调用适当的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))) ;
    }
}