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::list
或py::dict
时的数据结构分别是py::detail::list_accessor
或py::detail::item_accessor
,而不仅仅是(py::list
和py::dict
)。
我知道py::detail::item_accessor
可以通过py::dict nestDict = rootDict["a"]
声明为py::dict
,假设rootDict["a"]
的值是py::dict
(以及py::list
的等价物),但如果rootDict["a"]
的值不是py::dict
,声明将导致TypeError
所以最终的问题是,是否可以分别访问py::dict
或py::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?的主要内容,如果未能解决你的问题,请参考以下文章