Index: py26/Objects/structseq.c =================================================================== --- py26/Objects/structseq.c (revision 59960) +++ py26/Objects/structseq.c (working copy) @@ -460,7 +460,7 @@ structseq_methods, /* tp_methods */ NULL, /* tp_members */ 0, /* tp_getset */ - 0, /* tp_base */ + &PyTuple_Type, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ Index: py26/Misc/NEWS =================================================================== --- py26/Misc/NEWS (revision 59960) +++ py26/Misc/NEWS (working copy) @@ -975,6 +975,10 @@ Extension Modules ----------------- +- Issue 1820: structseq objects did not subclass from tuple so they did + not pass isinstance(t, tuple) tests and they could not be passed to + the % string formatting operator as an input tuple. + - _winreg's HKEY object has gained __enter__ and __exit__ methods to support the context manager protocol. The _winreg module also gained a new function ``ExpandEnvironmentStrings`` to expand REG_EXPAND_SZ keys. Index: py26/Misc/ACKS =================================================================== --- py26/Misc/ACKS (revision 59960) +++ py26/Misc/ACKS (working copy) @@ -686,6 +686,7 @@ Charles Waldman Richard Walker Larry Wall +Leif Walsh Greg Ward Barry Warsaw Steve Waterbury Index: py26/Lib/test/test_structseq.py =================================================================== --- py26/Lib/test/test_structseq.py (revision 59960) +++ py26/Lib/test/test_structseq.py (working copy) @@ -26,6 +26,12 @@ for i in xrange(-len(t), len(t)-1): self.assertEqual(t[i], astuple[i]) + def test_tuple_subclass(self): + # Issue 1820 + t = time.localtime() + s = ('%s ' * len(t)) % t # This used to fail because t was not a tuple subclass + self.assert_(isinstance(t, tuple)) + def test_repr(self): t = time.gmtime() self.assert_(repr(t))