我有一些代码可以将 Python 与 C++ 接口,这些代码运行良好,但每次我看到它时,我都认为必须有更好的方法来做到这一点。在 C++ 方面,有一个“变体”类型可以处理固定范围的基本类型——int、real、string、变体向量等。我有一些代码使用 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;
这显然让我快速了解类型信息,但是使用它与我感兴趣的有限类型集相关的最简洁的方法是什么?