Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 8dd1932

Browse files
committed
Change filtertuple() to use tp_as_sequence->sq_item
instead of PyTuple_GetItem, so an overwritten __getitem__ in a tuple subclass works. SF bug #665835.
1 parent 8d326b8 commit 8dd1932

2 files changed

Lines changed: 7 additions & 3 deletions

File tree

Lib/test/test_builtin.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,6 @@ def __getitem__(self, index):
419419
def test_filter_subclasses(self):
420420
# test, that filter() never returns tuple, str or unicode subclasses
421421
# and that the result always go's through __getitem__
422-
# FIXME: For tuple currently it doesn't go through __getitem__
423422
funcs = (None, lambda x: True)
424423
class tuple2(tuple):
425424
def __getitem__(self, index):
@@ -428,7 +427,7 @@ class str2(str):
428427
def __getitem__(self, index):
429428
return 2*str.__getitem__(self, index)
430429
inputs = {
431-
tuple2: {(): (), (1, 2, 3): (1, 2, 3)}, # FIXME
430+
tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
432431
str2: {"": "", "123": "112233"}
433432
}
434433
if have_unicode:

Python/bltinmodule.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1888,8 +1888,13 @@ filtertuple(PyObject *func, PyObject *tuple)
18881888
PyObject *item, *good;
18891889
int ok;
18901890

1891-
if ((item = PyTuple_GetItem(tuple, i)) == NULL)
1891+
if (tuple->ob_type->tp_as_sequence &&
1892+
tuple->ob_type->tp_as_sequence->sq_item) {
1893+
item = tuple->ob_type->tp_as_sequence->sq_item(tuple, i);
1894+
} else {
1895+
PyErr_SetString(PyExc_TypeError, "unsubscriptable object");
18921896
goto Fail_1;
1897+
}
18931898
if (func == Py_None) {
18941899
Py_INCREF(item);
18951900
good = item;

0 commit comments

Comments
 (0)