【问题标题】:pybind11: working with nested py::dict and py::list?pybind11:使用嵌套的 py::dict 和 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 中间体?或者如果没有,有没有办法将这些结构转换为更容易以我希望的方式操作的东西?

【问题讨论】:

    标签: python c++ nested nested-lists pybind11


    【解决方案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"]);
    }
    

    【讨论】:

      最近更新 更多