Python C API-返回功能超载中的不同类型



i有一个C 类,其中包含两个超载方法 sayhi((,每个类别都具有不同的返回类型:

class Box {
   public:
      Box();
      void sayHi(char *name);
      int sayHi(int number);
};

当我尝试包装此功能时,我遵循了Shadowranger的建议,"编写单个包装器函数,该功能可以检查提供的参数并派遣到正确的'真实'函数'

这里是:

static PyObject *pyBox_sayHi_char(PyBox *self, char *Name)
{
    self->bx->sayHi(Name);
    Py_RETURN_NONE;
}
static int *pyBox_sayHi_int(PyBox *self,  int number)
{
    int answer;
    answer = self->bx->sayHi(number);
    return answer;
}
static PyObject *Hi_overload_switch(PyBox *self,  PyObject *args)
{
    PyObject *x;
    if (!PyArg_ParseTuple(args, "O", &x))
        return NULL;
    if (PyUnicode_Check(x))
    {
        const char* s = PyBytes_AsString(PyUnicode_AsUTF8String(x)); // convert PyObject to char*
        Py_DECREF(x);
        return pyBox_sayHi_char(self, s);
    }
    if (PyLong_Check(x))
    {   
        return pyBox_sayHi_int( self, PyLong_AsLong(x) );
    }
    Py_RETURN_NOTIMPLEMENTED;
}

和以下方法表:

static PyMethodDef pyBox_methods[] = {
    {"Hi", (PyCFunction)Hi_overload_switch, METH_VARARGS, "Hi"},
    {NULL, NULL, 0, NULL}
};

但是,我遇到了错误:

error: cannot convert ‘int*’ to ‘PyObject*’ {aka ‘_object*’} in return
         return pyBox_sayHi_int( self, PyLong_AsLong(x) );

afaik,我不想将返回类型转换为PyObject,因为超载方法可能需要返回自定义类型。因此,在我的示例中, int vs void 只是出于插图目的 - 我很可能已经写了 Pybanana vs PYORANGE 据类型。

我的问题是,如何使函数 hi_overload_switch 返回不同的类型?

谢谢!

您需要返回Python int。在C/C 源中,这是一个PyLongObject(是PyObject的子类型,因此您可以将PyLongObject*施放到PyObject*和后背(。要将C int转换为PyObject* Python int,请使用PyObject* PyLong_FromLong(long)

static PyObject *pyBox_sayHi_int(PyBox *self,  int number)
{
    int answer;
    answer = self->bx->sayHi(number);
    return PyLong_FromLong(answer);
}

最新更新