您应该查看Concrete Objects Layer 上的 Python 文档。基本上,您必须使用 Py*T*_As*T*(PyObject* obj) 形式的函数将 PyObject 转换为 C++ 类型,其中 T 是您要检索的具体类型。
API 假设您知道应该调用哪个函数。但是,正如doc 中所述,您可以在使用前检查类型:
...如果您从 Python 程序接收到一个对象,但您不确定它的类型是否正确,则必须先执行类型检查;例如,要检查对象是否为字典,请使用 PyDict_Check()。
以下是将PyObject 转换为long 的示例:
PyObject* some_py_object = /* ... */;
long as_long(
PyLong_AsLong(some_py_object)
);
Py_DECREF(some_py_object);
这是另一个更复杂的示例,将 Python list 转换为 std::vector:
PyObject* some_py_list = /* ... */;
// assuming the list contains long
std::vector<long> as_vector(PyList_Size(some_py_list));
for(size_t i = 0; i < as_vector.size(); ++i)
{
PyObject* item = PyList_GetItem(some_py_list, i);
as_vector[i] = PyLong_AsLong(item);
Py_DECREF(item);
}
Py_DECREF(some_py_list);
最后一个更复杂的示例,将 Python dict 解析为 std::map:
PyObject* some_py_dict = /* ... */;
// assuming the dict uses long as keys, and contains string as values
std::map<long, std::string> as_map;
// first get the keys
PyObject* keys = PyDict_Keys(some_py_dict);
size_t key_count = PyList_Size(keys);
// loop on the keys and get the values
for(size_t i = 0; i < key_count; ++i)
{
PyObject* key = PyList_GetItem(keys, i);
PyObject* item = PyDict_GetItem(some_py_dict, key);
// add to the map
as_map.emplace(PyLong_AsLong(key), PyString_AsString(item));
Py_DECREF(key);
Py_DECREF(item);
}
Py_DECREF(keys);
Py_DECREF(some_py_dict);