[Python-checkins] r77292 - in python/trunk: Lib/test/test_descr.py Misc/NEWS Objects/complexobject.c
benjamin.peterson
python-checkins at python.org
Mon Jan 4 01:43:01 CET 2010
Author: benjamin.peterson
Date: Mon Jan 4 01:43:01 2010
New Revision: 77292
Log:
do correct lookup of the __complex__ method
Modified:
python/trunk/Lib/test/test_descr.py
python/trunk/Misc/NEWS
python/trunk/Objects/complexobject.c
Modified: python/trunk/Lib/test/test_descr.py
==============================================================================
--- python/trunk/Lib/test/test_descr.py (original)
+++ python/trunk/Lib/test/test_descr.py Mon Jan 4 01:43:01 2010
@@ -1691,6 +1691,8 @@
return []
def zero(self):
return 0
+ def complex_num(self):
+ return 1j
def stop(self):
raise StopIteration
def return_true(self, thing=None):
@@ -1725,6 +1727,7 @@
set(("__bases__",)), {}),
("__enter__", run_context, iden, set(), {"__exit__" : swallow}),
("__exit__", run_context, swallow, set(), {"__enter__" : iden}),
+ ("__complex__", complex, complex_num, set(), {}),
]
class Checker(object):
Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS (original)
+++ python/trunk/Misc/NEWS Mon Jan 4 01:43:01 2010
@@ -12,6 +12,9 @@
Core and Builtins
-----------------
+- The __complex__ method is now looked up on the class of instances to make it
+ consistent with other special methods.
+
- Issue #7462: Implement the stringlib fast search algorithm for the `rfind`,
`rindex`, `rsplit` and `rpartition` methods. Patch by Florent Xicluna.
Modified: python/trunk/Objects/complexobject.c
==============================================================================
--- python/trunk/Objects/complexobject.c (original)
+++ python/trunk/Objects/complexobject.c Mon Jan 4 01:43:01 2010
@@ -1114,21 +1114,27 @@
return NULL;
}
- /* XXX Hack to support classes with __complex__ method */
if (complexstr == NULL) {
complexstr = PyString_InternFromString("__complex__");
if (complexstr == NULL)
return NULL;
}
- f = PyObject_GetAttr(r, complexstr);
- if (f == NULL)
- PyErr_Clear();
+ if (PyInstance_Check(r)) {
+ f = PyObject_GetAttr(r, complexstr);
+ if (f == NULL) {
+ if (PyErr_ExceptionMatches(PyExc_AttributeError))
+ PyErr_Clear();
+ else
+ return NULL;
+ }
+ }
else {
- PyObject *args = PyTuple_New(0);
- if (args == NULL)
+ f = _PyObject_LookupSpecial(r, "__complex__", &complexstr);
+ if (f == NULL && PyErr_Occurred())
return NULL;
- r = PyEval_CallObject(f, args);
- Py_DECREF(args);
+ }
+ if (f != NULL) {
+ r = PyObject_CallFunctionObjArgs(f, NULL);
Py_DECREF(f);
if (r == NULL)
return NULL;
More information about the Python-checkins
mailing list