Python C++ api - 在函数重载中返回不同类型

标签 python c++ overloading python-c-api

我有一个 C++ 类,它包含两个重载方法 sayHi(),每个方法都有不同的返回类型:

class Box {
   public:

      Box();

      void sayHi(char *name);

      int sayHi(int number);

};

当我尝试包装这个函数时,我遵循了 ShadowRanger 的建议和 “编写一个包装函数,对提供的参数进行类型检查并分派(dispatch)到正确的‘真实’函数”

这里是:

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) );

据我所知,我不想将返回类型转换为 PyObjects,因为重载方法可能需要返回自定义类型。因此,我的示例中的 intvoid 仅用于说明目的 - 我可能会编写 PyBananaPyOrange数据类型。

我的问题是,如何让函数 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);
}

关于Python C++ api - 在函数重载中返回不同类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56189869/

相关文章:

python - 类型对象 'User' 没有属性 'objects' (AbstractUser) python

c++ - 重载运算符中的段错误 =

c++ - DirectShow - 获取视频帧

c++ - 如何解决 FSEventStream 中损坏的事件压缩

javascript - 如果我不在 Javascript 函数中传递参数会怎样?

c++ - 为什么 NULL 被转换成 string*?

python - 时区的 celery 计划任务问题

python - 将翻转图像改变图像尺寸

python - 如何在不知道类名的情况下使用 NDB 查询

c++ - 具有更多模板参数的模板友元类