[Python-Dev] __reversed__ protocol
Guido van Rossum
guido at python.org
Tue Nov 18 18:06:05 EST 2003
> diff -c -r1.10 enumobject.c
> *** enumobject.c 7 Nov 2003 15:38:08 -0000 1.10
> --- enumobject.c 18 Nov 2003 21:39:51 -0000
> ***************
> *** 174,181 ****
> if (!PyArg_UnpackTuple(args, "reversed", 1, 1, &seq))
> return NULL;
>
> ! /* Special case optimization for xrange and lists */
> ! if (PyRange_Check(seq) || PyList_Check(seq))
> return PyObject_CallMethod(seq, "__reversed__", NULL);
>
> if (!PySequence_Check(seq)) {
> --- 174,181 ----
> if (!PyArg_UnpackTuple(args, "reversed", 1, 1, &seq))
> return NULL;
>
> ! if (PyObject_HasAttrString(seq, "__reversed__") &&
> ! PyObject_HasAttrString(seq, "__len__"))
> return PyObject_CallMethod(seq, "__reversed__", NULL);
>
> if (!PySequence_Check(seq)) {
Note that the two HasAttrString calls can be quite a bit more
expensive than the PyRange_Check and PyList_Check calls...
--Guido van Rossum (home page: http://www.python.org/~guido/)
More information about the Python-Dev
mailing list