如何在 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::handlestring 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