Author: Brian Kearns <[email protected]>
Branch:
Changeset: r67449:3388d5c537f8
Date: 2013-10-16 17:42 -0400
http://bitbucket.org/pypy/pypy/changeset/3388d5c537f8/
Log: enhance ndarray mode argument parsing, test
diff --git a/pypy/module/micronumpy/constants.py
b/pypy/module/micronumpy/constants.py
--- a/pypy/module/micronumpy/constants.py
+++ b/pypy/module/micronumpy/constants.py
@@ -1,4 +1,21 @@
+from pypy.interpreter.error import OperationError
-MODE_WRAP, MODE_RAISE, MODE_CLIP = range(3)
+MODE_CLIP, MODE_WRAP, MODE_RAISE = range(3)
-MODES = {'wrap': MODE_WRAP, 'raise': MODE_RAISE, 'clip': MODE_CLIP}
+def clipmode_converter(space, w_mode):
+ if space.is_none(w_mode):
+ return MODE_RAISE
+ if space.isinstance_w(w_mode, space.w_str):
+ mode = space.str_w(w_mode)
+ if mode.startswith('C') or mode.startswith('c'):
+ return MODE_CLIP
+ if mode.startswith('W') or mode.startswith('w'):
+ return MODE_WRAP
+ if mode.startswith('R') or mode.startswith('r'):
+ return MODE_RAISE
+ elif space.isinstance_w(w_mode, space.w_int):
+ mode = space.int_w(w_mode)
+ if MODE_CLIP <= mode <= MODE_RAISE:
+ return mode
+ raise OperationError(space.w_TypeError,
+ space.wrap("clipmode not understood"))
diff --git a/pypy/module/micronumpy/interp_arrayops.py
b/pypy/module/micronumpy/interp_arrayops.py
--- a/pypy/module/micronumpy/interp_arrayops.py
+++ b/pypy/module/micronumpy/interp_arrayops.py
@@ -1,10 +1,9 @@
-
from pypy.module.micronumpy.base import convert_to_array, W_NDimArray
-from pypy.module.micronumpy import loop, interp_dtype, interp_ufuncs
+from pypy.module.micronumpy import loop, interp_dtype, interp_ufuncs, constants
from pypy.module.micronumpy.iter import Chunk, Chunks
from pypy.module.micronumpy.strides import shape_agreement,\
shape_agreement_multiple
-from pypy.module.micronumpy.constants import MODES
+from pypy.module.micronumpy.constants import clipmode_converter
from pypy.interpreter.error import OperationError, operationerrfmt
from pypy.interpreter.gateway import unwrap_spec
@@ -171,8 +170,7 @@
def count_nonzero(space, w_obj):
return space.wrap(loop.count_all_true(convert_to_array(space, w_obj)))
-@unwrap_spec(mode=str)
-def choose(space, w_arr, w_choices, w_out, mode):
+def choose(space, w_arr, w_choices, w_out, w_mode):
arr = convert_to_array(space, w_arr)
choices = [convert_to_array(space, w_item) for w_item
in space.listview(w_choices)]
@@ -187,23 +185,16 @@
shape = shape_agreement_multiple(space, choices + [w_out])
out = interp_dtype.dtype_agreement(space, choices, shape, w_out)
dtype = out.get_dtype()
- if mode not in MODES:
- raise OperationError(space.w_ValueError,
- space.wrap("mode %s not known" % (mode,)))
- loop.choose(space, arr, choices, shape, dtype, out, MODES[mode])
+ mode = clipmode_converter(space, w_mode)
+ loop.choose(space, arr, choices, shape, dtype, out, mode)
return out
-
-@unwrap_spec(mode=str)
-def put(space, w_arr, w_indices, w_values, mode='raise'):
- from pypy.module.micronumpy import constants
+def put(space, w_arr, w_indices, w_values, w_mode):
from pypy.module.micronumpy.support import int_w
arr = convert_to_array(space, w_arr)
+ mode = clipmode_converter(space, w_mode)
- if mode not in constants.MODES:
- raise OperationError(space.w_ValueError,
- space.wrap("mode %s not known" % (mode,)))
if not w_indices:
raise OperationError(space.w_ValueError,
space.wrap("indice list cannot be empty"))
@@ -228,13 +219,13 @@
index = int_w(space, idx)
if index < 0 or index >= arr.get_size():
- if constants.MODES[mode] == constants.MODE_RAISE:
+ if mode == constants.MODE_RAISE:
raise OperationError(space.w_IndexError, space.wrap(
"index %d is out of bounds for axis 0 with size %d" %
(index, arr.get_size())))
- elif constants.MODES[mode] == constants.MODE_WRAP:
+ elif mode == constants.MODE_WRAP:
index = index % arr.get_size()
else:
- assert constants.MODES[mode] == constants.MODE_CLIP
+ assert mode == constants.MODE_CLIP
if index < 0:
index = 0
else:
@@ -247,7 +238,6 @@
arr.setitem(space, [index], dtype.coerce(space, value))
-
def diagonal(space, arr, offset, axis1, axis2):
shape = arr.get_shape()
shapelen = len(shape)
diff --git a/pypy/module/micronumpy/interp_numarray.py
b/pypy/module/micronumpy/interp_numarray.py
--- a/pypy/module/micronumpy/interp_numarray.py
+++ b/pypy/module/micronumpy/interp_numarray.py
@@ -1,4 +1,3 @@
-
from pypy.interpreter.error import operationerrfmt, OperationError
from pypy.interpreter.typedef import TypeDef, GetSetProperty,
make_weakref_descr
from pypy.interpreter.gateway import interp2app, unwrap_spec, WrappedDefault
@@ -14,7 +13,7 @@
from pypy.module.micronumpy.appbridge import get_appbridge_cache
from pypy.module.micronumpy import loop
from pypy.module.micronumpy.dot import match_dot_shapes
-from pypy.module.micronumpy.interp_arrayops import repeat, choose
+from pypy.module.micronumpy.interp_arrayops import repeat, choose, put
from pypy.module.micronumpy.arrayimpl import scalar
from rpython.tool.sourcetools import func_with_new_name
from rpython.rlib import jit
@@ -509,9 +508,8 @@
loop.byteswap(self.implementation, w_res.implementation)
return w_res
- @unwrap_spec(mode=str)
- def descr_choose(self, space, w_choices, w_out=None, mode='raise'):
- return choose(space, self, w_choices, w_out, mode)
+ def descr_choose(self, space, w_choices, w_out=None, w_mode=None):
+ return choose(space, self, w_choices, w_out, w_mode)
def descr_clip(self, space, w_min, w_max, w_out=None):
if space.is_none(w_out):
@@ -590,10 +588,8 @@
raise OperationError(space.w_NotImplementedError, space.wrap(
"ptp (peak to peak) not implemented yet"))
- @unwrap_spec(mode=str)
- def descr_put(self, space, w_indices, w_values, mode='raise'):
- from pypy.module.micronumpy.interp_arrayops import put
- put(space, self, w_indices, w_values, mode)
+ def descr_put(self, space, w_indices, w_values, w_mode=None):
+ put(space, self, w_indices, w_values, w_mode)
def descr_resize(self, space, w_new_shape, w_refcheck=True):
raise OperationError(space.w_NotImplementedError, space.wrap(
diff --git a/pypy/module/micronumpy/test/test_arrayops.py
b/pypy/module/micronumpy/test/test_arrayops.py
--- a/pypy/module/micronumpy/test/test_arrayops.py
+++ b/pypy/module/micronumpy/test/test_arrayops.py
@@ -154,4 +154,11 @@
a.put(22, -5, mode='wrap')
assert (a == array([0, 1, -5, 3, 4])).all()
raises(IndexError, "arange(5).put(22, -5, mode='raise')")
- raises(ValueError, "arange(5).put(22, -5, mode='wrongmode')")
+ raises(IndexError, "arange(5).put(22, -5, mode=2)") # raise
+ a.put(22, -10, mode='wrongmode_starts_with_w_so_wrap')
+ assert (a == array([0, 1, -10, 3, 4])).all()
+ a.put(22, -15, mode='cccccccc')
+ assert (a == array([0, 1, -10, 3, -15])).all()
+ a.put(23, -1, mode=1) # wrap
+ assert (a == array([0, 1, -10, -1, -15])).all()
+ raises(TypeError, "arange(5).put(22, -5, mode='zzzz')") #
unrecognized mode
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit