Как я могу получить доступ к обратным вызовам, хранящимся в pybind :: list? - PullRequest
0 голосов
/ 14 апреля 2020

Я создаю обратные вызовы в моей оболочке 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()! Есть ли другой лучший способ сделать это?

...