]> granicus.if.org Git - python/commitdiff
complex() was the only numeric constructor that created a new instance
authorRaymond Hettinger <python@rcn.com>
Thu, 29 Aug 2002 14:22:51 +0000 (14:22 +0000)
committerRaymond Hettinger <python@rcn.com>
Thu, 29 Aug 2002 14:22:51 +0000 (14:22 +0000)
when given its own type as an argument.

Lib/test/test_b1.py
Objects/complexobject.c

index d80767b0ccd625814b1ef1d4e37396b9302d6ef7..5536246e258ad0e84046c964e788a8139e34eb6a 100644 (file)
@@ -140,6 +140,10 @@ 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")'
 
+c = 3.14 + 1j
+if complex(c) is not c: raise TestFailed, 'complex(3.14+1j) changed identity'
+del c
+
 try: complex("1", "1")
 except TypeError: pass
 else: raise TestFailed, 'complex("1", "1")'
index bb2835420a2ecf7133ac2b07bac93a131beb508f..56638d5ec0722dcafd7c57acb6b5ab55db743a32 100644 (file)
@@ -823,6 +823,15 @@ complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
        if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
                                         &r, &i))
                return NULL;
+
+       /* Special-case for single argumet that is already complex */
+       if (PyComplex_CheckExact(r) && i == NULL) {
+               /* Note that we can't know whether it's safe to return
+                  a complex *subclass* instance as-is, hence the restriction
+                  to exact complexes here.  */
+               Py_INCREF(r);
+               return r;
+       }
        if (PyString_Check(r) || PyUnicode_Check(r)) {
                if (i != NULL) {
                        PyErr_SetString(PyExc_TypeError,