Author: Ronan Lamy <ronan.l...@gmail.com>
Branch: 
Changeset: r78661:07616c948f75
Date: 2015-07-25 17:37 +0100
http://bitbucket.org/pypy/pypy/changeset/07616c948f75/

Log:    Create out_converter() to factor out some code

diff --git a/pypy/module/micronumpy/converters.py 
b/pypy/module/micronumpy/converters.py
--- a/pypy/module/micronumpy/converters.py
+++ b/pypy/module/micronumpy/converters.py
@@ -113,3 +113,12 @@
         shape.append(space.int_w(w_item))
     shape += dtype.shape
     return shape[:]
+
+def out_converter(space, w_out):
+    from .ndarray import W_NDimArray
+    if space.is_none(w_out):
+        return None
+    elif not isinstance(w_out, W_NDimArray):
+        raise oefmt(space.w_TypeError, 'output must be an array')
+    else:
+        return w_out
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
@@ -15,8 +15,9 @@
 from pypy.module.micronumpy.base import W_NDimArray, convert_to_array, \
     ArrayArgumentException, wrap_impl
 from pypy.module.micronumpy.concrete import BaseConcreteArray
-from pypy.module.micronumpy.converters import multi_axis_converter, \
-    order_converter, shape_converter, searchside_converter
+from pypy.module.micronumpy.converters import (
+    multi_axis_converter, order_converter, shape_converter,
+    searchside_converter, out_converter)
 from pypy.module.micronumpy.flagsobj import W_FlagsObject
 from pypy.module.micronumpy.strides import (
     get_shape_from_iterable, shape_agreement, shape_agreement_multiple,
@@ -1090,12 +1091,7 @@
 
     def descr_dot(self, space, w_other, w_out=None):
         from .casting import find_result_type
-        if space.is_none(w_out):
-            out = None
-        elif not isinstance(w_out, W_NDimArray):
-            raise oefmt(space.w_TypeError, 'output must be an array')
-        else:
-            out = w_out
+        out = out_converter(space, w_out)
         other = convert_to_array(space, w_other)
         if other.is_scalar():
             #Note: w_out is not modified, this is numpy compliant.
@@ -1152,12 +1148,7 @@
     def _reduce_ufunc_impl(ufunc_name, cumulative=False, bool_result=False):
         @unwrap_spec(keepdims=bool)
         def impl(self, space, w_axis=None, w_dtype=None, w_out=None, 
keepdims=False):
-            if space.is_none(w_out):
-                out = None
-            elif not isinstance(w_out, W_NDimArray):
-                raise oefmt(space.w_TypeError, 'output must be an array')
-            else:
-                out = w_out
+            out = out_converter(space, w_out)
             if bool_result:
                 w_dtype = descriptor.get_dtype_cache(space).w_booldtype
             return getattr(ufuncs.get(space), ufunc_name).reduce(
diff --git a/pypy/module/micronumpy/ufuncs.py b/pypy/module/micronumpy/ufuncs.py
--- a/pypy/module/micronumpy/ufuncs.py
+++ b/pypy/module/micronumpy/ufuncs.py
@@ -20,6 +20,7 @@
 from pypy.module.micronumpy.strides import shape_agreement
 from pypy.module.micronumpy.support import (_parse_signature, product,
         get_storage_as_int, is_rhs_priority_higher)
+from .converters import out_converter
 from .casting import (
     can_cast_type, can_cast_array, can_cast_to,
     find_result_type, promote_types)
@@ -124,10 +125,7 @@
         args_w, kwds_w = __args__.unpack()
         # sig, extobj are used in generic ufuncs
         w_subok, w_out, sig, w_casting, extobj = self.parse_kwargs(space, 
kwds_w)
-        if space.is_w(w_out, space.w_None):
-            out = None
-        else:
-            out = w_out
+        out = out_converter(space, w_out)
         if (w_subok is not None and space.is_true(w_subok)):
             raise oefmt(space.w_NotImplementedError, "parameter subok 
unsupported")
         if kwds_w:
@@ -149,9 +147,6 @@
             out = args_w[-1]
         else:
             args_w = args_w + [out]
-        if out is not None and not isinstance(out, W_NDimArray):
-            raise OperationError(space.w_TypeError, space.wrap(
-                                            'output must be an array'))
         if w_casting is None:
             casting = 'unsafe'
         else:
@@ -163,13 +158,7 @@
     def descr_accumulate(self, space, w_obj, w_axis=None, w_dtype=None, 
w_out=None):
         if space.is_none(w_axis):
             w_axis = space.wrap(0)
-        if space.is_none(w_out):
-            out = None
-        elif not isinstance(w_out, W_NDimArray):
-            raise OperationError(space.w_TypeError, space.wrap(
-                                                'output must be an array'))
-        else:
-            out = w_out
+        out = out_converter(space, w_out)
         return self.reduce(space, w_obj, w_axis, True, #keepdims must be true
                            out, w_dtype, cumulative=True)
 
@@ -231,13 +220,7 @@
         from pypy.module.micronumpy.ndarray import W_NDimArray
         if w_axis is None:
             w_axis = space.wrap(0)
-        if space.is_none(w_out):
-            out = None
-        elif not isinstance(w_out, W_NDimArray):
-            raise OperationError(space.w_TypeError, space.wrap(
-                'output must be an array'))
-        else:
-            out = w_out
+        out = out_converter(space, w_out)
         return self.reduce(space, w_obj, w_axis, keepdims, out, w_dtype)
 
     def reduce(self, space, w_obj, w_axis, keepdims=False, out=None, 
dtype=None,
@@ -460,11 +443,7 @@
         w_obj = args_w[0]
         out = None
         if len(args_w) > 1:
-            out = args_w[1]
-            if space.is_w(out, space.w_None):
-                out = None
-            elif out is not None and not isinstance(out, W_NDimArray):
-                raise oefmt(space.w_TypeError, 'output must be an array')
+            out = out_converter(space, args_w[1])
         w_obj = numpify(space, w_obj)
         dtype = w_obj.get_dtype(space)
         calc_dtype, dt_out, func = self.find_specialization(space, dtype, out, 
casting)
@@ -562,10 +541,7 @@
     def call(self, space, args_w, sig, casting, extobj):
         if len(args_w) > 2:
             [w_lhs, w_rhs, out] = args_w
-            if space.is_none(out):
-                out = None
-            elif not isinstance(out, W_NDimArray):
-                raise oefmt(space.w_TypeError, 'output must be an array')
+            out = out_converter(space, out)
         else:
             [w_lhs, w_rhs] = args_w
             out = None
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to