如何在 C++ 中设置 py::dict 的值?
How to set values of py::dict in C++?
我想使用来自 C++ 的 py::dict
。但是 operator[]
似乎没有定义,我在这里或 pybind11 文档中找不到任何关于如何为键添加 key/value 对或 return 值的信息?
编辑:也许也很重要,我有整数作为键。
edit2:需要使用 py::int_()
我看到 operator[]
是为 py::dict
定义的,示例:
m.def("test", [](){
py::dict d;
d[py::int_{0}] = "foo";
return d;
});
>>> example.test()
{10: 'foo'}
您可以看到 operator[] 有两个重载采用 py::handle
或 string literal
,因此 d["xxx"]
或 d[py::int_{0}]
有效但 d[0] 无效(在编译时会被错误地解析为无效的字符串文字,并会导致 运行-time segment-fault)
template <typename Derived>
class object_api : public pyobject_tag {
...
/** \rst
Return an internal functor to invoke the object's sequence protocol. Casting
the returned ``detail::item_accessor`` instance to a `handle` or `object`
subclass causes a corresponding call to ``__getitem__``. Assigning a `handle`
or `object` subclass causes a call to ``__setitem__``.
\endrst */
item_accessor operator[](handle key) const;
/// See above (the only difference is that they key is provided as a string literal)
item_accessor operator[](const char *key) const;
你也不能使用 std::string 作为键:
std::string key="xxx";
d[key] = 1; // failed to compile, must change to d[pybind11::str(key)]
为了使事情更简单,使用 pybind11::cast() 将任何支持的 C++ 类型显式转换为相应的 python 类型,如下所示:
std::string key="xxx";
d[pybind11::cast(1)] = 2
d[pybind11::cast(key)] = 3
我想使用来自 C++ 的 py::dict
。但是 operator[]
似乎没有定义,我在这里或 pybind11 文档中找不到任何关于如何为键添加 key/value 对或 return 值的信息?
编辑:也许也很重要,我有整数作为键。
edit2:需要使用 py::int_()
我看到 operator[]
是为 py::dict
定义的,示例:
m.def("test", [](){
py::dict d;
d[py::int_{0}] = "foo";
return d;
});
>>> example.test()
{10: 'foo'}
您可以看到 operator[] 有两个重载采用 py::handle
或 string literal
,因此 d["xxx"]
或 d[py::int_{0}]
有效但 d[0] 无效(在编译时会被错误地解析为无效的字符串文字,并会导致 运行-time segment-fault)
template <typename Derived>
class object_api : public pyobject_tag {
...
/** \rst
Return an internal functor to invoke the object's sequence protocol. Casting
the returned ``detail::item_accessor`` instance to a `handle` or `object`
subclass causes a corresponding call to ``__getitem__``. Assigning a `handle`
or `object` subclass causes a call to ``__setitem__``.
\endrst */
item_accessor operator[](handle key) const;
/// See above (the only difference is that they key is provided as a string literal)
item_accessor operator[](const char *key) const;
你也不能使用 std::string 作为键:
std::string key="xxx";
d[key] = 1; // failed to compile, must change to d[pybind11::str(key)]
为了使事情更简单,使用 pybind11::cast() 将任何支持的 C++ 类型显式转换为相应的 python 类型,如下所示:
std::string key="xxx";
d[pybind11::cast(1)] = 2
d[pybind11::cast(key)] = 3