Как очистить py::list, если в Pybind11 2.6 не существует метода Clear()?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как очистить py::list, если в Pybind11 2.6 не существует метода Clear()?

Сообщение Anonymous »

Я пытаюсь очистить список pybind11. В версии 2.13 Pybind11 это работает отлично, есть методclear(), который делает следующее:

Код: Выделить всё

    void clear() /* py-non-const */ {
if (PyList_SetSlice(m_ptr, 0, PyList_Size(m_ptr), nullptr) == -1) {
throw error_already_set();
}
}
Итак, я могу делать такие вещи, как:

Код: Выделить всё

py::list myList;
// todo: append some data, do some things
myList.clear();
И это прекрасно работает. Однако сейчас я работаю в среде с более старой версией Pybind11. Я считаю, что это версия 2.6.2.
Теперь, если я попробую то же самое, я получу ошибку: «класс pybind11::list» не имеет элемента с именем «clear» . И это похоже на правду. Если я посмотрю на исходный код, метода Clear() больше не существует:

Код: Выделить всё

class list : public object {
public:
PYBIND11_OBJECT_CVT(list, object, PyList_Check, PySequence_List)
template 
// Some compilers generate link errors when using `const SzType &` here:
explicit list(SzType size = 0) : object(PyList_New(ssize_t_cast(size)), stolen_t{}) {
if (!m_ptr) {
pybind11_fail("Could not allocate list object!");
}
}
size_t size() const { return (size_t) PyList_Size(m_ptr); }
bool empty() const { return size() == 0; }
detail::list_accessor operator[](size_t index) const { return {*this, index}; }
template 
detail::item_accessor operator[](T &&o) const {
return object::operator[](std::forward(o));
}
detail::list_iterator begin() const { return {*this, 0}; }
detail::list_iterator end() const { return {*this, PyList_GET_SIZE(m_ptr)}; }
template 
void append(T &&val) /* py-non-const */ {
if (PyList_Append(m_ptr, detail::object_or_cast(std::forward(val)).ptr()) != 0) {
throw error_already_set();
}
}
template 
void insert(const IdxType &index, ValType &&val) /* py-non-const */ {
if (PyList_Insert(m_ptr,
ssize_t_cast(index),
detail::object_or_cast(std::forward(val)).ptr())
!= 0) {
throw error_already_set();
}
}
};
Итак, как мне очистить этот список?
Я могу попытаться воспроизвести функцию, приведя список к PyObject*:

Код: Выделить всё

  PyList_SetSlice(py::cast
(myList), 0,
PyList_Size(py::cast(myList)), nullptr);
Но действительно ли это предназначенный способ очистки списка? Выглядит немного странно.


Подробнее здесь: https://stackoverflow.com/questions/793 ... bind11-2-6
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»