]> granicus.if.org Git - python/commitdiff
Ensure that complex() only accepts a string argument as the first arg,
authorFred Drake <fdrake@acm.org>
Thu, 13 Dec 2001 19:52:22 +0000 (19:52 +0000)
committerFred Drake <fdrake@acm.org>
Thu, 13 Dec 2001 19:52:22 +0000 (19:52 +0000)
and only if there is no second arg.
This closes SF patch #479551.

Doc/lib/libfuncs.tex
Lib/test/test_b1.py
Objects/complexobject.c

index a7508752713f6b5f6a268b907dd3668238a48580..17c17226b043908ba48f3d1959f083a323a8dcaf 100644 (file)
@@ -159,12 +159,14 @@ def my_import(name):
 
 \begin{funcdesc}{complex}{real\optional{, imag}}
   Create a complex number with the value \var{real} + \var{imag}*j or
-  convert a string or number to a complex number.
+  convert a string or number to a complex number.  If the first
+  parameter is a string, it will be interpreted as a complex number
+  and the function must be called without a second parameter.  The
+  second parameter can never be a string.
   Each argument may be any numeric type (including complex).
   If \var{imag} is omitted, it defaults to zero and the function
   serves as a numeric conversion function like \function{int()},
-  \function{long()} and \function{float()}; in this case it also
-  accepts a string argument which should be a valid complex number.
+  \function{long()} and \function{float()}.
 \end{funcdesc}
 
 \begin{funcdesc}{delattr}{object, name}
index b328b38c412508327ea0476f869b55c379ba0b59..f2d0c24d4cc56edc9cab10abe609235e73533764 100644 (file)
@@ -122,6 +122,14 @@ if complex(0j, 3.14j) != -3.14+0j: raise TestFailed, 'complex(0j, 3.14j)'
 if complex(0.0, 3.14j) != -3.14+0j: raise TestFailed, 'complex(0.0, 3.14j)'
 if complex(0j, 3.14) != 3.14j: raise TestFailed, 'complex(0j, 3.14)'
 if complex(0.0, 3.14) != 3.14j: raise TestFailed, 'complex(0.0, 3.14)'
+if complex("1") != 1+0j: raise TestFailed, 'complex("1")'
+if complex("1j") != 1j: raise TestFailed, 'complex("1j")'
+try: complex("1", "1")
+except TypeError: pass
+else: raise TestFailed, 'complex("1", "1")'
+try: complex(1, "1")
+except TypeError: pass
+else: raise TestFailed, 'complex(1, "1")'
 if complex("  3.14+J  ") != 3.14+1j:  raise TestFailed, 'complex("  3.14+J  )"'
 if have_unicode:
     if complex(unicode("  3.14+J  ")) != 3.14+1j:
index 18dfa7dff67f003357599eed72a3cacb20092200..1ee1c546e5a35984fa10ecb9e3bf8a8bd5bd62f0 100644 (file)
@@ -806,8 +806,20 @@ complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
        if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
                                         &r, &i))
                return NULL;
-       if (PyString_Check(r) || PyUnicode_Check(r))
+       if (PyString_Check(r) || PyUnicode_Check(r)) {
+               if (i != NULL) {
+                       PyErr_SetString(PyExc_TypeError,
+                                       "complex() can't take second arg"
+                                       " if first is a string");
+                       return NULL;
+                }
                return complex_subtype_from_string(type, r);
+       }
+       if (i != NULL && (PyString_Check(i) || PyUnicode_Check(i))) {
+               PyErr_SetString(PyExc_TypeError,
+                               "complex() second arg can't be a string");
+               return NULL;
+       }
 
        nbr = r->ob_type->tp_as_number;
        if (i != NULL)