diff options
author | Fred Drake <fdrake@acm.org> | 2001-12-13 19:52:22 (GMT) |
---|---|---|
committer | Fred Drake <fdrake@acm.org> | 2001-12-13 19:52:22 (GMT) |
commit | 526c7a0101d826fdab8b1ef5a757e1eae351687c (patch) | |
tree | fe3c026e4862df026da3aa91eba621e19f29877c | |
parent | 733c8935f9dfd1be70c472649eb845ea22bbc878 (diff) | |
download | cpython-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.tex | 8 | ||||
-rw-r--r-- | Lib/test/test_b1.py | 8 | ||||
-rw-r--r-- | Objects/complexobject.c | 14 |
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) |