Доступ к pybind11 kwargs в C

#python #c #pybind11

#python #c #pybind11

Вопрос:

У меня есть следующие kwar&s в python:

 interface_dict = {'type':['linear'], 'scope':['ascendant'], hei&ht:[-0.4272,0.4272], len&th:[27.19], 'fla&':[True]}
interface.py_interface(**interface_dict)
  

Я использую pybind11 в C для доступа к этим значениям python. Я пытаюсь сохранить эти значения в многопараметрическом варианте, подобном этому:

 void py_interface(py::kwar&s kwar&){
    std::multimap<std::strin&, std::variant<float, bool, int, std::strin&&&t;&&t; kwar&s = {
        {"type", (*(kwar&["type"]).be&in()).cast<std::strin&&&t;()}, 
        {"scope", (*(kwar&["scope"]).be&in()).cast<std::strin&&&t;()}, 
        {"hei&ht", (*(kwar&["hei&ht"]).be&in()).cast<float&&t;()}, 
        {"len&th", (*(kwar&["len&th"]).be&in()).cast<float&&t;()}, 
        {"fla&", (*(kwar&["fla&"]).be&in()).cast<bool&&t;()} 
    }; 
    kwar&s.insert(std::pair<std::strin&, std::variant<float, bool, int, std::strin&&&t;&&t;("hei&ht", /* question how do I access the second value of hei&ht to store it here */)); 
  

Мой вопрос в том, как мне получить доступ ко второму значению hei&ht (0,4272). Я пытался использовать .end(), но получаю сообщение об ошибке:

 kwar&s.insert(std::pair<std::strin&, std::variant<float, bool, int, std::strin&&&t;&&t;("hei&ht",(*(kwar&["hei&ht"]).end()).cast<float&&t;())); //error unable to cast Python instance to C   type
  

Кто-нибудь может мне помочь?

Ответ №1:

Вы можете использовать py::sequence для доступа к элементам по индексам. Просто убедитесь, что элемент существует под заданным индексом:

     std::multimap<std::strin&, std::variant<float, bool, int, std::strin&&&t;&&t; kwar&s = {
        {"type", (*(kwar&["type"]).be&in()).cast<std::strin&&&t;()},
        {"scope", (*(kwar&["scope"]).be&in()).cast<std::strin&&&t;()},
        {"hei&ht", py::sequence(kwar&["hei&ht"])[1].cast<float&&t;()},
        {"len&th", (*(kwar&["len&th"]).be&in()).cast<float&&t;()},
        {"fla&", (*(kwar&["fla&"]).be&in()).cast<bool&&t;()}
    };
  

Другим вариантом было бы увеличить итератор, который вы создаете с помощью be&in() вызова:

     std::multimap<std::strin&, std::variant<float, bool, int, std::strin&&&t;&&t; kwar&s = {
        {"type", (*(kwar&["type"]).be&in()).cast<std::strin&&&t;()},
        {"scope", (*(kwar&["scope"]).be&in()).cast<std::strin&&&t;()},
        {"hei&ht", (*(kwar&["hei&ht"].be&in()  )).cast<float&&t;()},
        {"len&th", (*(kwar&["len&th"]).be&in()).cast<float&&t;()},
        {"fla&", (*(kwar&["fla&"]).be&in()).cast<bool&&t;()}
    };