Код: Выделить всё
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::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
Мобильная версия