Я создаю обратные вызовы в моей оболочке C ++, которые затем отправляю в мой модуль python, и они выполняются очень хорошо.
Однако, поскольку у меня есть список обратных вызовов, и он может быть обновлен, я хочу получить список обратных вызовов, используемых в настоящее время из модуля Python, и сохраните его в векторе C ++.
py::print()
показывает список очень хорошо, но я хочу иметь возможность получить доступ к каждому элементу списка по отдельности и использовать их как Я sh, я не хочу печатать их на экране.
Я пытался перебрать py::list
и получить каждый элемент таким образом, но они практически бесполезны в исходном виде. Кажется, что каждый элемент py::handle
, и я не знаю, какое свойство можно использовать для получения объекта обратного вызова или его ссылки, или даже строкового представления обратного вызова (точно так же, как мы получаем, когда мы печатаем список, используя py::print
))
Как мне go об этом?
Обновление:
Я узнал о преобразовании строк, поэтому в основном я могу сделать:
std::vector<std::string> callbackList;
for (py::handle item : this->getCallbacksFunc())
{
callbackList.push_back(py::str(item));
}
return callbackList;
, чтобы получить строковое представление py::list
, что замечательно.
Но что интересно:
return py::cast<std::vector<std::string>>(this->getCallbacksFunc());
завершается неудачно с сообщением об исключении:
Unable to cast Python instance of type <class 'list'> to C++ type 'std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char>
>,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char>
> > >'
, что странно, но, тем не менее, первое решение работает.
Однако получение фактического указатель функции для меня до сих пор загадка. str
выполняет необработанную строку PyObjects
, если я не ошибаюсь, и она сама выполняет python str()
для объекта и возвращает результат. Доступ к самому PyObject*
можно получить с помощью метода py::object
ptr()
, но я не уверен, как получить доступ к фактическому указателю на функцию, если я не проанализирую строковое представление, полученное с помощью str()
! Есть ли другой лучший способ сделать это?