pybind11:使用嵌套的 py::dict 和 py::list?

Posted

技术标签:

【中文标题】pybind11:使用嵌套的 py::dict 和 py::list?【英文标题】:pybind11: working with nested py::dict and py::list? 【发布时间】:2021-07-14 22:59:41 【问题描述】:

假设我有这样的东西(注意 pybind11/pybind11.h and pybind11/stl.h 包括在内)

namespace py = pybind11;

int nestedObjSize(py::list plist)
    // This is what I would like to achieve, but it doesn't work

    return plist[0].size()


int nestedObjSize(py::dict pdict)
    // Again doesn't work, but this is what I essentially want to do
    
    return pdict["a"].size()

现在在 python 中

bindedModule.nestedObjSize(["a": 1, "b": 2])

>> 2

bindedModule.nestedObjSize([[1,2,3]])

>> 3


bindedModule.nestedObjSize("a": "b": 1, "c": 2")

>> 2

问题源于索引py::listpy::dict 时的数据结构分别是py::detail::list_accessorpy::detail::item_accessor,而不仅仅是(py::listpy::dict)。

我知道py::detail::item_accessor 可以通过py::dict nestDict = rootDict["a"] 声明为py::dict,假设rootDict["a"] 的值是py::dict(以及py::list 的等价物),但如果rootDict["a"] 的值不是py::dict,声明将导致TypeError


所以最终的问题是,是否可以分别访问py::dictpy::list 中的键或索引的值,而无需通过..._accessor 中间体?或者如果没有,有没有办法将这些结构转换为更容易以我希望的方式操作的东西?

【问题讨论】:

【参考方案1】:

使用py::len() 代替size()

namespace py = pybind11;

int nestedObjSize(py::list plist)

    return py::len(plist[0]);


int nestedObjSize(py::dict pdict)

    return py::len(pdict["a"]);

【讨论】:

以上是关于pybind11:使用嵌套的 py::dict 和 py::list?的主要内容,如果未能解决你的问题,请参考以下文章

拆分 pybind11 模块和自动类型转换的问题

多态性和pybind11

Cmake:使用柯南 pybind11 包

pybind11 用于 C++14/C++17

如何通过pybind11在python中捕获C++的异常?

使用 carma(犰狳矩阵和 numpy 数组)用 pybind11 包装 c++ 类时出错