gpt4 book ai didi

Python C API : Switch on PyObject type

转载 作者:太空狗 更新时间:2023-10-29 21:55:51 25 4
gpt4 key购买 nike

我有一些代码可以将 Python 连接到 C++,它工作正常,但每次我看它时我都认为一定有更好的方法来实现它。在 C++ 方面,有一个“变体”类型可以处理固定范围的基本类型 - int、real、string、vector of variants 等。我有一些代码使用 Python API 从等效的 Python 类型进行转换。它看起来像这样:

variant makeVariant(PyObject* value)
{
if (PyString_Check(value)) {
return PyString_AsString(value);
}
else if (value == Py_None) {
return variant();
}
else if (PyBool_Check(value)) {
return value == Py_True;
}
else if (PyInt_Check(value)) {
return PyInt_AsLong(value);
}
else if (PyFloat_Check(value)) {
return PyFloat_AsDouble(value);
}
// ... etc

问题是链式 if-else ifs。它似乎需要一个 switch 语句,或者一个由类型标识符键入的创建函数表或映射。换句话说,我希望能够写出类似这样的东西:

  return createFunMap[typeID(value)](value);

根据对 API 文档的粗略浏览,在此处直接获取“typeID”的最佳方法并不明显。我知道我可以做这样的事情:

  PyTypeObject* type = value->ob_type;

这显然让我可以快速获得类型信息,但使用它来关联我感兴趣的有限类型集的最简洁方法是什么?

最佳答案

在某种程度上,我认为您已经回答了自己的问题。

在某个地方,您将不得不根据数据选择功能。在 C 中执行此操作的方法是使用函数指针。

创建一个 object_type->function 映射器的映射...其中每个函数都有一个明确定义的接口(interface)。

variant PyBoolToVariant(PyObject *value) {
return value == Py_True;
}

Map<PyTypeObject*,variant* (PyObject*)> function_map;

function_map.add(PyBool, PyBoolToVariant);

现在您的 makeVariant 看起来像这样。

variant makeVariant(PyObject *value) {
return (*function_map.get(value->ob_type))(value);
}

困难的部分是为 Map 对象获取正确的语法。此外,我假设您可以使用一个带有类型参数 ( <PyTypeObject*, variant*(PyObject*)) 的 Map 对象。

对于第二种类型的 map ,我可能还没有完全理解正确的语法。它应该是一个指向函数的指针,该函数接受一个指针并返回一个指向变体的指针。

希望对您有所帮助。

关于Python C API : Switch on PyObject type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3092786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com