Pybind11:将元组列表从 Python 传递到 C++
Pybind11: Passing list of tuples from Python to C++
我正在使用 pybind11,我想将元组(坐标)列表从 Python 传递到 C++。这是示例 C++ 代码:
parse_coords(py::list coords) {
std::vector<PointI> coordinates(py::len(coords));
for (size_t i = 1; i < py::len(coords); i++) {
coordinates[i].x = coords[i][0];
coordinates[i].z = coords[i][1];
}
}
显然,这是行不通的。我得到的错误是 cannot convert ‘pybind11::detail::item_accessor’ {aka ‘pybind11::detail::accessor<pybind11::detail::accessor_policies::generic_item>’} to ‘int’ in assignment
如何传递比 int 更复杂的列表,这是我能找到的所有示例?
你必须使用 py::cast
。如果没有为您的自定义类型注册转换函数,或者类型不匹配,那么您将得到一个异常:
示例:
void cast_test(const py::list& l)
{
for(auto it = l.begin(); it != l.end(); ++it)
{
std::cout << it->cast<int>() << std::endl;
}
}
>>> example.cast_test([1,2,3])
1
2
3
>>> example.cast_test([1,2,"a"])
1
2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: Unable to cast Python instance to C++ type (compile in debug mode for details)
>>>
在这里您可以找到有关内置转换的更多详细信息:
https://pybind11.readthedocs.io/en/stable/advanced/pycpp/object.html
这里是如何添加自定义类型的脚轮:
https://pybind11.readthedocs.io/en/stable/advanced/cast/custom.html
我正在使用 pybind11,我想将元组(坐标)列表从 Python 传递到 C++。这是示例 C++ 代码:
parse_coords(py::list coords) {
std::vector<PointI> coordinates(py::len(coords));
for (size_t i = 1; i < py::len(coords); i++) {
coordinates[i].x = coords[i][0];
coordinates[i].z = coords[i][1];
}
}
显然,这是行不通的。我得到的错误是 cannot convert ‘pybind11::detail::item_accessor’ {aka ‘pybind11::detail::accessor<pybind11::detail::accessor_policies::generic_item>’} to ‘int’ in assignment
如何传递比 int 更复杂的列表,这是我能找到的所有示例?
你必须使用 py::cast
。如果没有为您的自定义类型注册转换函数,或者类型不匹配,那么您将得到一个异常:
示例:
void cast_test(const py::list& l)
{
for(auto it = l.begin(); it != l.end(); ++it)
{
std::cout << it->cast<int>() << std::endl;
}
}
>>> example.cast_test([1,2,3])
1
2
3
>>> example.cast_test([1,2,"a"])
1
2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: Unable to cast Python instance to C++ type (compile in debug mode for details)
>>>
在这里您可以找到有关内置转换的更多详细信息: https://pybind11.readthedocs.io/en/stable/advanced/pycpp/object.html
这里是如何添加自定义类型的脚轮: https://pybind11.readthedocs.io/en/stable/advanced/cast/custom.html