summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFred Drake <fdrake@acm.org>2001-12-13 19:52:22 (GMT)
committerFred Drake <fdrake@acm.org>2001-12-13 19:52:22 (GMT)
commit526c7a0101d826fdab8b1ef5a757e1eae351687c (patch)
treefe3c026e4862df026da3aa91eba621e19f29877c
parent733c8935f9dfd1be70c472649eb845ea22bbc878 (diff)
downloadcpython-526c7a0101d826fdab8b1ef5a757e1eae351687c.zip
cpython-526c7a0101d826fdab8b1ef5a757e1eae351687c.tar.gz
cpython-526c7a0101d826fdab8b1ef5a757e1eae351687c.tar.bz2
Ensure that complex() only accepts a string argument as the first arg,
and only if there is no second arg. This closes SF patch #479551.
-rw-r--r--Doc/lib/libfuncs.tex8
-rw-r--r--Lib/test/test_b1.py8
-rw-r--r--Objects/complexobject.c14
3 files changed, 26 insertions, 4 deletions
diff --git a/Doc/lib/libfuncs.tex b/Doc/lib/libfuncs.tex
index a750875..17c1722 100644
--- a/Doc/lib/libfuncs.tex
+++ b/Doc/lib/libfuncs.tex
@@ -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}
diff --git a/Lib/test/test_b1.py b/Lib/test/test_b1.py
index b328b38..f2d0c24 100644
--- a/Lib/test/test_b1.py
+++ b/Lib/test/test_b1.py
@@ -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:
diff --git a/Objects/complexobject.c b/Objects/complexobject.c
index 18dfa7d..1ee1c54 100644
--- a/Objects/complexobject.c
+++ b/Objects/complexobject.c
@@ -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)