Как конвертировать Python dict в счетчик C ++ в Pybind11? - PullRequest
1 голос
/ 27 марта 2020

В настоящее время я пытаюсь преобразовать py::dict в его аналог C++ s std::map. Попытка использовать автоматическое преобразование c следующим образом завершается неудачей:

#include <pybind11/stl.h>
namespace py = pybind11;
using namespace py::literals;
...
py::dict py_kwargs = py::dict("number1"_a = 5, "number2"_a = 42);
auto cpp_kwargs = py_kwargs.cast<std::map<int, int>>();

с исключением:

Unable to cast Python instance of type <class 'dict'> to C++ type 'std::map<int,int,std::less<int>,std::allocator<std::pair<int const ,int> > >'

Чего мне здесь не хватает?

Также на заметку, как мне go рассказать о ситуации, когда словарь python имеет разные типы ключей, например:

py::dict py_kwargs = py::dict("name"_a = "World", "number"_a = 42);

Как мне go о конвертации в таких случаях?

1 Ответ

0 голосов
/ 28 марта 2020

ОК, я обнаружил проблему, до этого я закончил делать преобразование следующим образом:

map<std::string, int> convert_dict_to_map(py::dict dictionary)
{
    map<std::string, int> result;
    for (std::pair<py::handle, py::handle> item : dictionary)
    {
        auto key = item.first.cast<std::string>();
        auto value = item.second.cast<int>();
        //cout << key << " : " << value;
        result[key] = value;
    }
    return result;
}

, а затем внимательно посмотрел на:

auto cppmap = kwargs.cast<map<int, int>>();

и, наконец, заметил моя проблема. это должно было быть:

auto cppmap = kwargs.cast<map<std::string, int>>();

Я допустил ошибку, когда изменил свой пример dict, а затем отменил изменения, но забыл изменить подпись!

В любом случае, кажется, что первое решение может быть лучшим выбором, поскольку оно позволяет разработчику лучше работать с динамикой Python c.
То есть словарь Python вполне может включать в себя разные пары (например, string:string, string:int, int:float, et c в одном словаре). Поэтому, убедившись, что элементы корректно реконструированы в c ++, можно сделать намного лучше, используя первый грубый метод!

...