Author: Carl Friedrich Bolz-Tereick <cfb...@gmx.de>
Branch: 
Changeset: r94694:cadf86879441
Date: 2018-05-28 21:33 +0200
http://bitbucket.org/pypy/pypy/changeset/cadf86879441/

Log:    fix error messages in complex number handling a bit

diff --git a/pypy/objspace/std/complexobject.py 
b/pypy/objspace/std/complexobject.py
--- a/pypy/objspace/std/complexobject.py
+++ b/pypy/objspace/std/complexobject.py
@@ -128,7 +128,7 @@
     return format_float(x, 'g', DTSF_STR_PRECISION)
 
 
-def unpackcomplex(space, w_complex, strict_typing=True):
+def unpackcomplex(space, w_complex, strict_typing=True, firstarg=True):
     """
     convert w_complex into a complex and return the unwrapped (real, imag)
     tuple. If strict_typing==True, we also typecheck the value returned by
@@ -180,7 +180,20 @@
         raise oefmt(space.w_TypeError,
                     "complex number expected, got '%T'", w_complex)
     #
-    return (space.float_w(space.float(w_complex)), 0.0)
+    try:
+        return (space.float_w(space.float(w_complex)), 0.0)
+    except OperationError as e:
+        if not e.match(space, space.w_TypeError):
+            raise
+        if firstarg:
+            raise oefmt(space.w_TypeError,
+                        "complex() first argument must be a string or a 
number, not '%T'",
+                         w_complex)
+        else:
+            raise oefmt(space.w_TypeError,
+                        "complex() second argument must be a number, not '%T'",
+                         w_complex)
+
 
 
 class W_ComplexObject(W_Root):
@@ -326,7 +339,8 @@
             if not noarg2:
                 # complex(x, y) == x+y*j, even if 'y' is already a complex.
                 realval2, imagval2 = unpackcomplex(space, w_imag,
-                                                   strict_typing=False)
+                                                   strict_typing=False,
+                                                   firstarg=False)
 
                 # try to preserve the signs of zeroes of realval and realval2
                 if imagval2 != 0.0:
@@ -476,7 +490,7 @@
         try:
             return self.div(w_rhs)
         except ZeroDivisionError as e:
-            raise OperationError(space.w_ZeroDivisionError, 
space.newtext(str(e)))
+            raise oefmt(space.w_ZeroDivisionError, "complex division by zero")
 
     def descr_rtruediv(self, space, w_lhs):
         w_lhs = self._to_complex(space, w_lhs)
@@ -485,7 +499,7 @@
         try:
             return w_lhs.div(self)
         except ZeroDivisionError as e:
-            raise OperationError(space.w_ZeroDivisionError, 
space.newtext(str(e)))
+            raise oefmt(space.w_ZeroDivisionError, "complex division by zero")
 
     def descr_floordiv(self, space, w_rhs):
         w_rhs = self._to_complex(space, w_rhs)
@@ -495,7 +509,7 @@
         try:
             return self.divmod(space, w_rhs)[0]
         except ZeroDivisionError as e:
-            raise OperationError(space.w_ZeroDivisionError, 
space.newtext(str(e)))
+            raise oefmt(space.w_ZeroDivisionError, "complex division by zero")
 
     def descr_rfloordiv(self, space, w_lhs):
         w_lhs = self._to_complex(space, w_lhs)
@@ -505,7 +519,7 @@
         try:
             return w_lhs.divmod(space, self)[0]
         except ZeroDivisionError as e:
-            raise OperationError(space.w_ZeroDivisionError, 
space.newtext(str(e)))
+            raise oefmt(space.w_ZeroDivisionError, "complex division by zero")
 
     def descr_mod(self, space, w_rhs):
         w_rhs = self._to_complex(space, w_rhs)
@@ -514,7 +528,7 @@
         try:
             return self.divmod(space, w_rhs)[1]
         except ZeroDivisionError as e:
-            raise OperationError(space.w_ZeroDivisionError, 
space.newtext(str(e)))
+            raise oefmt(space.w_ZeroDivisionError, "complex modulo by zero")
 
     def descr_rmod(self, space, w_lhs):
         w_lhs = self._to_complex(space, w_lhs)
@@ -523,7 +537,7 @@
         try:
             return w_lhs.divmod(space, self)[1]
         except ZeroDivisionError as e:
-            raise OperationError(space.w_ZeroDivisionError, 
space.newtext(str(e)))
+            raise oefmt(space.w_ZeroDivisionError, "complex modulo by zero")
 
     def descr_divmod(self, space, w_rhs):
         w_rhs = self._to_complex(space, w_rhs)
@@ -532,7 +546,7 @@
         try:
             div, mod = self.divmod(space, w_rhs)
         except ZeroDivisionError as e:
-            raise OperationError(space.w_ZeroDivisionError, 
space.newtext(str(e)))
+            raise oefmt(space.w_ZeroDivisionError, "complex divmod by zero")
         return space.newtuple([div, mod])
 
     def descr_rdivmod(self, space, w_lhs):
@@ -542,7 +556,7 @@
         try:
             div, mod = w_lhs.divmod(space, self)
         except ZeroDivisionError as e:
-            raise OperationError(space.w_ZeroDivisionError, 
space.newtext(str(e)))
+            raise oefmt(space.w_ZeroDivisionError, "complex divmod by zero")
         return space.newtuple([div, mod])
 
     @unwrap_spec(w_third_arg=WrappedDefault(None))
diff --git a/pypy/objspace/std/test/test_complexobject.py 
b/pypy/objspace/std/test/test_complexobject.py
--- a/pypy/objspace/std/test/test_complexobject.py
+++ b/pypy/objspace/std/test/test_complexobject.py
@@ -375,6 +375,21 @@
         assert self.almost_equal(complex(real=float2(17.), imag=float2(23.)), 
17+23j)
         raises(TypeError, complex, float2(None))
 
+
+    def test_constructor_bad_error_message(self):
+        err = raises(TypeError, complex, {}).value
+        assert "float" not in str(err)
+        assert str(err) == "complex() first argument must be a string or a 
number, not 'dict'"
+        err = raises(TypeError, complex, 1, {}).value
+        assert "float" not in str(err)
+        assert str(err) == "complex() second argument must be a number, not 
'dict'"
+
+    def test_error_messages(self):
+        err = raises(ZeroDivisionError, "1+1j / 0").value
+        assert str(err) == "complex division by zero"
+        err = raises(ZeroDivisionError, "1+1j // 0").value
+        assert str(err) == "complex division by zero"
+
     def test___complex___returning_non_complex(self):
         import cmath
         class Obj(object):
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to