#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;()}
};