diff --git a/include/pybind11/pytypes.h b/include/pybind11/pytypes.h index db07a03139..32b3d2575d 100644 --- a/include/pybind11/pytypes.h +++ b/include/pybind11/pytypes.h @@ -1942,13 +1942,14 @@ class weakref : public object { class slice : public object { public: - PYBIND11_OBJECT_DEFAULT(slice, object, PySlice_Check) + PYBIND11_OBJECT(slice, object, PySlice_Check) slice(handle start, handle stop, handle step) : object(PySlice_New(start.ptr(), stop.ptr(), step.ptr()), stolen_t{}) { if (!m_ptr) { pybind11_fail("Could not allocate slice object!"); } } + slice() : slice(none(), none(), none()) {} #ifdef PYBIND11_HAS_OPTIONAL slice(std::optional start, std::optional stop, std::optional step) diff --git a/tests/test_pytypes.cpp b/tests/test_pytypes.cpp index cbbf42178b..9d7c955d8b 100644 --- a/tests/test_pytypes.cpp +++ b/tests/test_pytypes.cpp @@ -671,6 +671,8 @@ TEST_SUBMODULE(pytypes, m) { m.def("test_list_slicing", [](const py::list &a) { return a[py::slice(0, -1, 2)]; }); + m.def("test_list_slicing_default", [](const py::list &a) { return a[py::slice()]; }); + // See #2361 m.def("issue2361_str_implicit_copy_none", []() { py::str is_this_none = py::none(); diff --git a/tests/test_pytypes.py b/tests/test_pytypes.py index b20b098834..d1044d995d 100644 --- a/tests/test_pytypes.py +++ b/tests/test_pytypes.py @@ -603,7 +603,8 @@ def test_number_protocol(): def test_list_slicing(): li = list(range(100)) - assert li[::2] == m.test_list_slicing(li) + assert li[0:-1:2] == m.test_list_slicing(li) + assert li[::] == m.test_list_slicing_default(li) def test_issue2361():