Author: mattip <matti.pi...@gmail.com> Branch: Changeset: r77717:acba2565aeee Date: 2015-05-29 16:21 +0300 http://bitbucket.org/pypy/pypy/changeset/acba2565aeee/
Log: fix tests, error messages to be strictly numpy 1.9.0 diff --git a/pypy/module/micronumpy/boxes.py b/pypy/module/micronumpy/boxes.py --- a/pypy/module/micronumpy/boxes.py +++ b/pypy/module/micronumpy/boxes.py @@ -579,7 +579,9 @@ try: ofs, dtype = self.dtype.fields[item] except KeyError: - raise oefmt(space.w_ValueError, "field named %s not found", item) + raise oefmt(space.w_IndexError, "222only integers, slices (`:`), " + "ellipsis (`...`), numpy.newaxis (`None`) and integer or " + "boolean arrays are valid indices") dtype.itemtype.store(self.arr, self.ofs, ofs, dtype.coerce(space, w_value)) 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 @@ -207,7 +207,7 @@ raise ArrayArgumentException return self._lookup_by_index(space, view_w) if shape_len == 0: - raise oefmt(space.w_IndexError, "0-d arrays can't be indexed") + raise oefmt(space.w_IndexError, "too many indices for array") elif shape_len > 1: raise IndexError idx = support.index_w(space, w_idx) @@ -218,7 +218,11 @@ if space.isinstance_w(w_idx, space.w_str): idx = space.str_w(w_idx) dtype = self.dtype - if not dtype.is_record() or idx not in dtype.fields: + if not dtype.is_record(): + raise oefmt(space.w_IndexError, "only integers, slices (`:`), " + "ellipsis (`...`), numpy.newaxis (`None`) and integer or " + "boolean arrays are valid indices") + elif idx not in dtype.fields: raise oefmt(space.w_ValueError, "field named %s not found", idx) return RecordChunk(idx) elif (space.isinstance_w(w_idx, space.w_int) or diff --git a/pypy/module/micronumpy/ndarray.py b/pypy/module/micronumpy/ndarray.py --- a/pypy/module/micronumpy/ndarray.py +++ b/pypy/module/micronumpy/ndarray.py @@ -100,10 +100,10 @@ def getitem_filter(self, space, arr): if arr.ndims() > 1 and arr.get_shape() != self.get_shape(): - raise OperationError(space.w_ValueError, space.wrap( + raise OperationError(space.w_IndexError, space.wrap( "boolean index array should have 1 dimension")) if arr.get_size() > self.get_size(): - raise OperationError(space.w_ValueError, space.wrap( + raise OperationError(space.w_IndexError, space.wrap( "index out of range for array")) size = loop.count_all_true(arr) if arr.ndims() == 1: @@ -116,10 +116,10 @@ def setitem_filter(self, space, idx, val): if idx.ndims() > 1 and idx.get_shape() != self.get_shape(): - raise OperationError(space.w_ValueError, space.wrap( + raise OperationError(space.w_IndexError, space.wrap( "boolean index array should have 1 dimension")) if idx.get_size() > self.get_size(): - raise OperationError(space.w_ValueError, space.wrap( + raise OperationError(space.w_IndexError, space.wrap( "index out of range for array")) size = loop.count_all_true(idx) if size > val.get_size() and val.get_size() != 1: @@ -205,9 +205,13 @@ def descr_getitem(self, space, w_idx): if space.is_w(w_idx, space.w_Ellipsis): return self - elif isinstance(w_idx, W_NDimArray) and w_idx.get_dtype().is_bool() \ - and w_idx.ndims() > 0: - w_ret = self.getitem_filter(space, w_idx) + elif isinstance(w_idx, W_NDimArray) and w_idx.get_dtype().is_bool(): + if w_idx.ndims() > 0: + w_ret = self.getitem_filter(space, w_idx) + else: + raise oefmt(space.w_IndexError, + "in the future, 0-d boolean arrays will be " + "interpreted as a valid boolean index") else: try: w_ret = self.implementation.descr_getitem(space, self, w_idx) diff --git a/pypy/module/micronumpy/support.py b/pypy/module/micronumpy/support.py --- a/pypy/module/micronumpy/support.py +++ b/pypy/module/micronumpy/support.py @@ -19,7 +19,9 @@ try: return space.int_w(space.int(w_obj)) except OperationError: - raise oefmt(space.w_IndexError, "cannot convert index to integer") + raise oefmt(space.w_IndexError, "only integers, slices (`:`), " + "ellipsis (`...`), numpy.newaxis (`None`) and integer or " + "boolean arrays are valid indices") @jit.unroll_safe 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 @@ -413,7 +413,7 @@ b = np.empty_like(a, dtype='i4') assert b.shape == a.shape assert b.dtype == np.dtype('i4') - assert b[0,0] != 1 + # assert b[0,0] != 1 # no guarantees on values in b b = np.empty_like([1,2,3]) assert b.shape == (3,) assert b.dtype == np.int_ @@ -667,9 +667,9 @@ from numpy import arange a = arange(10) exc = raises(IndexError, "a[ErrorIndex()] == 0") - assert exc.value.message == 'cannot convert index to integer' + assert exc.value.message.startswith('only integers, slices') exc = raises(IndexError, "a[ErrorInt()] == 0") - assert exc.value.message == 'cannot convert index to integer' + assert exc.value.message.startswith('only integers, slices') def test_setslice_array(self): from numpy import array @@ -785,9 +785,9 @@ from numpy import array, dtype, int_ a = array(3) exc = raises(IndexError, "a[0]") - assert exc.value[0] == "0-d arrays can't be indexed" + assert exc.value[0] == "too many indices for array" exc = raises(IndexError, "a[0] = 5") - assert exc.value[0] == "0-d arrays can't be indexed" + assert exc.value[0] == "too many indices for array" assert a.size == 1 assert a.shape == () assert a.dtype is dtype(int) @@ -2156,16 +2156,14 @@ [7, 8, 9]]) assert (a[np.array(0)] == a[0]).all() assert (a[np.array(1)] == a[1]).all() - assert (a[np.array(True)] == a[1]).all() - assert (a[np.array(False)] == a[0]).all() + exc = raises(IndexError, "a[np.array(True)]") + assert exc.value.message == 'in the future, 0-d boolean arrays will be interpreted as a valid boolean index' exc = raises(IndexError, "a[np.array(1.1)]") assert exc.value.message == 'arrays used as indices must be of ' \ 'integer (or boolean) type' a[np.array(1)] = a[2] assert a[1][1] == 8 - a[np.array(True)] = a[0] - assert a[1][1] == 2 exc = raises(IndexError, "a[np.array(1.1)] = a[2]") assert exc.value.message == 'arrays used as indices must be of ' \ 'integer (or boolean) type' @@ -2174,8 +2172,8 @@ from numpy import arange, array b = arange(10) assert (b[array([True, False, True])] == [0, 2]).all() - raises(ValueError, "array([1, 2])[array([True, True, True])]") - raises(ValueError, "b[array([[True, False], [True, False]])]") + raises(IndexError, "array([1, 2])[array([True, True, True])]") + raises(IndexError, "b[array([[True, False], [True, False]])]") a = array([[1,2,3],[4,5,6],[7,8,9]],int) c = array([True,False,True],bool) b = a[c] @@ -2186,7 +2184,7 @@ b = arange(5) b[array([True, False, True])] = [20, 21, 0, 0, 0, 0, 0] assert (b == [20, 1, 21, 3, 4]).all() - raises(ValueError, "array([1, 2])[array([True, False, True])] = [1, 2, 3]") + raises(IndexError, "array([1, 2])[array([True, False, True])] = [1, 2, 3]") def test_weakref(self): import _weakref @@ -2433,12 +2431,19 @@ def test_ellipsis_indexing(self): import numpy as np + import sys a = np.array(1.5) - assert a[...] is a + if '__pypy__' in sys.builtin_module_names: + assert a[...] is a + else: + assert a[...].base is a a[...] = 2.5 assert a == 2.5 a = np.array([1, 2, 3]) - assert a[...] is a + if '__pypy__' in sys.builtin_module_names: + assert a[...] is a + else: + assert a[...].base is a a[...] = 4 assert (a == [4, 4, 4]).all() @@ -3604,7 +3609,7 @@ arr['x'] = 2 assert arr['x'] == 2 exc = raises(IndexError, "arr[3L]") - assert exc.value.message == "0-d arrays can't be indexed" + assert exc.value.message == "too many indices for array" exc = raises(ValueError, "arr['xx'] = 2") assert exc.value.message == "field named xx not found" assert arr['y'].dtype == a @@ -3807,8 +3812,8 @@ a[0, 0] = 500 assert (a[0, 0, 0] == 500).all() assert a[0, 0, 0].shape == (10,) - exc = raises(ValueError, "a[0, 0]['z']") - assert exc.value.message == 'field named z not found' + exc = raises(IndexError, "a[0, 0]['z']") + assert exc.value.message.startswith('only integers, slices') import sys a = array(1.5, dtype=float) @@ -3976,7 +3981,10 @@ def test_create_from_memory(self): import numpy as np - dat = np.array(__builtins__.buffer('1.0'), dtype=np.float64) + import sys + builtins = getattr(__builtins__, '__dict__', __builtins__) + _buffer = builtins.get('buffer') + dat = np.array(_buffer('1.0'), dtype=np.float64) assert (dat == [49.0, 46.0, 48.0]).all() diff --git a/pypy/module/micronumpy/test/test_scalar.py b/pypy/module/micronumpy/test/test_scalar.py --- a/pypy/module/micronumpy/test/test_scalar.py +++ b/pypy/module/micronumpy/test/test_scalar.py @@ -141,9 +141,9 @@ assert f.round() == 13. assert f.round(decimals=-1) == 10. assert f.round(decimals=1) == 13.4 + assert b.round(decimals=5) is b assert f.round(decimals=1, out=None) == 13.4 assert b.round() == 1.0 - raises(TypeError, b.round, decimals=5) def test_astype(self): import numpy as np diff --git a/pypy/module/micronumpy/types.py b/pypy/module/micronumpy/types.py --- a/pypy/module/micronumpy/types.py +++ b/pypy/module/micronumpy/types.py @@ -437,9 +437,8 @@ @specialize.argtype(1) def round(self, v, decimals=0): if decimals != 0: - # numpy incompatible message - raise oefmt(self.space.w_TypeError, - "Cannot use float math on bool dtype") + # numpy 1.9.0 compatible + return v return Float64(self.space).box(self.unbox(v)) class Integer(Primitive): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit