Enable py::ellipsis on Python 2 (#2360)

* Enable py::ellipsis on Python 2

* Enable py::ellipsis tests on Python 2 and mention `Ellipsis` in the docs
This commit is contained in:
Yannick Jadoul 2020-08-04 14:45:55 +02:00 committed by GitHub
parent 1caf1d0613
commit 3e448c0b5e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 5 additions and 10 deletions

View File

@ -371,6 +371,8 @@ Ellipsis
Python 3 provides a convenient ``...`` ellipsis notation that is often used to Python 3 provides a convenient ``...`` ellipsis notation that is often used to
slice multidimensional arrays. For instance, the following snippet extracts the slice multidimensional arrays. For instance, the following snippet extracts the
middle dimensions of a tensor with the first and last index set to zero. middle dimensions of a tensor with the first and last index set to zero.
In Python 2, the syntactic sugar ``...`` is not available, but the singleton
``Ellipsis`` (of type ``ellipsis``) can still be used directly.
.. code-block:: python .. code-block:: python

View File

@ -736,9 +736,7 @@ inline bool PyIterable_Check(PyObject *obj) {
} }
inline bool PyNone_Check(PyObject *o) { return o == Py_None; } inline bool PyNone_Check(PyObject *o) { return o == Py_None; }
#if PY_MAJOR_VERSION >= 3
inline bool PyEllipsis_Check(PyObject *o) { return o == Py_Ellipsis; } inline bool PyEllipsis_Check(PyObject *o) { return o == Py_Ellipsis; }
#endif
inline bool PyUnicode_Check_Permissive(PyObject *o) { return PyUnicode_Check(o) || PYBIND11_BYTES_CHECK(o); } inline bool PyUnicode_Check_Permissive(PyObject *o) { return PyUnicode_Check(o) || PYBIND11_BYTES_CHECK(o); }
@ -1020,13 +1018,11 @@ public:
none() : object(Py_None, borrowed_t{}) { } none() : object(Py_None, borrowed_t{}) { }
}; };
#if PY_MAJOR_VERSION >= 3
class ellipsis : public object { class ellipsis : public object {
public: public:
PYBIND11_OBJECT(ellipsis, object, detail::PyEllipsis_Check) PYBIND11_OBJECT(ellipsis, object, detail::PyEllipsis_Check)
ellipsis() : object(Py_Ellipsis, borrowed_t{}) { } ellipsis() : object(Py_Ellipsis, borrowed_t{}) { }
}; };
#endif
class bool_ : public object { class bool_ : public object {
public: public:

View File

@ -382,9 +382,7 @@ TEST_SUBMODULE(numpy_array, sm) {
return a; return a;
}); });
#if PY_MAJOR_VERSION >= 3 sm.def("index_using_ellipsis", [](py::array a) {
sm.def("index_using_ellipsis", [](py::array a) { return a[py::make_tuple(0, py::ellipsis(), 0)];
return a[py::make_tuple(0, py::ellipsis(), 0)]; });
});
#endif
} }

View File

@ -431,7 +431,6 @@ def test_array_create_and_resize(msg):
assert(np.all(a == 42.)) assert(np.all(a == 42.))
@pytest.unsupported_on_py2
def test_index_using_ellipsis(): def test_index_using_ellipsis():
a = m.index_using_ellipsis(np.zeros((5, 6, 7))) a = m.index_using_ellipsis(np.zeros((5, 6, 7)))
assert a.shape == (6,) assert a.shape == (6,)