diff -r 09bd552999bf Lib/test/seq_tests.py --- a/Lib/test/seq_tests.py Sat May 16 22:13:27 2015 +0300 +++ b/Lib/test/seq_tests.py Sun May 17 12:49:09 2015 +0300 @@ -85,6 +85,14 @@ def itermulti(seqn): 'Test multiple tiers of iterators' return chain(map(lambda x:x, iterfunc(IterGen(Sequence(seqn))))) +class LyingTuple(tuple): + def __iter__(self): + yield 1 + +class LyingList(list): + def __iter__(self): + yield 1 + class CommonTest(unittest.TestCase): # The type to be tested type2test = None @@ -131,6 +139,10 @@ class CommonTest(unittest.TestCase): self.assertRaises(TypeError, self.type2test, IterNoNext(s)) self.assertRaises(ZeroDivisionError, self.type2test, IterGenExc(s)) + # Issue #23757 + self.assertEqual(self.type2test(LyingTuple((2,))), self.type2test((1,))) + self.assertEqual(self.type2test(LyingList([2])), self.type2test([1])) + def test_truth(self): self.assertFalse(self.type2test()) self.assertTrue(self.type2test([42])) diff -r 09bd552999bf Objects/abstract.c --- a/Objects/abstract.c Sat May 16 22:13:27 2015 +0300 +++ b/Objects/abstract.c Sun May 17 12:49:09 2015 +0300 @@ -1681,7 +1681,7 @@ PySequence_Tuple(PyObject *v) Py_INCREF(v); return v; } - if (PyList_Check(v)) + if (PyList_CheckExact(v)) return PyList_AsTuple(v); /* Get iterator. */