[pypy-commit] pypy indexing: Raise an error when indexing with 2 ellipses

rlamy noreply at buildbot.pypy.org
Fri Jul 10 14:46:49 CEST 2015


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: indexing
Changeset: r78527:a0c21224679b
Date: 2015-07-10 13:46 +0100
http://bitbucket.org/pypy/pypy/changeset/a0c21224679b/

Log:	Raise an error when indexing with 2 ellipses

diff --git a/pypy/module/micronumpy/concrete.py b/pypy/module/micronumpy/concrete.py
--- a/pypy/module/micronumpy/concrete.py
+++ b/pypy/module/micronumpy/concrete.py
@@ -9,7 +9,8 @@
 from pypy.module.micronumpy.base import convert_to_array, W_NDimArray, \
     ArrayArgumentException, W_NumpyObject
 from pypy.module.micronumpy.iterators import ArrayIter
-from pypy.module.micronumpy.strides import (Chunk, Chunks, NewAxisChunk,
+from pypy.module.micronumpy.strides import (
+    Chunk, Chunks, NewAxisChunk, EllipsisChunk,
     RecordChunk, calc_strides, calc_new_strides, shape_agreement,
     calculate_broadcast_strides, calc_backstrides, calc_start, is_c_contiguous,
     is_f_contiguous)
@@ -204,6 +205,8 @@
                 if (isinstance(w_item, W_NDimArray) or
                     space.isinstance_w(w_item, space.w_list)):
                     raise ArrayArgumentException
+                elif space.is_w(w_item, space.w_Ellipsis):
+                    raise IndexError
             return self._lookup_by_index(space, view_w)
         if shape_len == 0:
             raise oefmt(space.w_IndexError, "too many indices for array")
@@ -240,8 +243,17 @@
             return Chunks([NewAxisChunk()])
         result = []
         i = 0
+        has_ellipsis = False
         for w_item in space.fixedview(w_idx):
-            if space.is_w(w_item, space.w_None):
+            if space.is_w(w_item, space.w_Ellipsis):
+                if has_ellipsis:
+                    # in CNumPy, this is only a deprecation warning
+                    raise oefmt(space.w_ValueError,
+                        "an index can only have a single Ellipsis (`...`); "
+                        "replace all but one with slices (`:`).")
+                result.append(EllipsisChunk())
+                has_ellipsis = True
+            elif space.is_w(w_item, space.w_None):
                 result.append(NewAxisChunk())
             else:
                 result.append(Chunk(*space.decode_index4(w_item,
diff --git a/pypy/module/micronumpy/strides.py b/pypy/module/micronumpy/strides.py
--- a/pypy/module/micronumpy/strides.py
+++ b/pypy/module/micronumpy/strides.py
@@ -82,6 +82,10 @@
     def __init__(self):
         pass
 
+class EllipsisChunk(BaseChunk):
+    def __init__(self):
+        pass
+
 
 class BaseTransform(object):
     pass
diff --git a/pypy/module/micronumpy/test/test_ndarray.py b/pypy/module/micronumpy/test/test_ndarray.py
--- a/pypy/module/micronumpy/test/test_ndarray.py
+++ b/pypy/module/micronumpy/test/test_ndarray.py
@@ -2484,6 +2484,10 @@
         assert b.shape == b[...].shape
         assert (b == b[...]).all()
 
+        a = np.arange(6).reshape(2, 3)
+        if '__pypy__' in sys.builtin_module_names:
+            raises(ValueError, "a[..., ...]")
+
     def test_empty_indexing(self):
         import numpy as np
         r = np.ones(3)


More information about the pypy-commit mailing list