changeset: 78792:2801bf875a24 branch: 2.7 parent: 78789:ec4ea40be2f6 user: Benjamin Peterson date: Tue Aug 28 17:55:35 2012 -0400 files: Lib/test/string_tests.py Misc/NEWS Objects/stringobject.c Objects/unicodeobject.c description: use the stricter PyMapping_Check (closes #15801) diff -r ec4ea40be2f6 -r 2801bf875a24 Lib/test/string_tests.py --- a/Lib/test/string_tests.py Tue Aug 28 19:23:56 2012 +0200 +++ b/Lib/test/string_tests.py Tue Aug 28 17:55:35 2012 -0400 @@ -1113,6 +1113,9 @@ self.checkraises(TypeError, '%10.*f', '__mod__', ('foo', 42.)) self.checkraises(ValueError, '%10', '__mod__', (42,)) + class X(object): pass + self.checkraises(TypeError, 'abc', '__mod__', X()) + def test_floatformatting(self): # float formatting for prec in xrange(100): diff -r ec4ea40be2f6 -r 2801bf875a24 Misc/NEWS --- a/Misc/NEWS Tue Aug 28 19:23:56 2012 +0200 +++ b/Misc/NEWS Tue Aug 28 17:55:35 2012 -0400 @@ -9,6 +9,9 @@ Core and Builtins ----------------- +- Issue #15801: Make sure mappings passed to '%' formatting are actually + subscriptable. + - Issue #15604: Update uses of PyObject_IsTrue() to check for and handle errors correctly. Patch by Serhiy Storchaka. diff -r ec4ea40be2f6 -r 2801bf875a24 Objects/stringobject.c --- a/Objects/stringobject.c Tue Aug 28 19:23:56 2012 +0200 +++ b/Objects/stringobject.c Tue Aug 28 17:55:35 2012 -0400 @@ -4254,7 +4254,7 @@ arglen = -1; argidx = -2; } - if (Py_TYPE(args)->tp_as_mapping && !PyTuple_Check(args) && + if (PyMapping_Check(args) && !PyTuple_Check(args) && !PyObject_TypeCheck(args, &PyBaseString_Type)) dict = args; while (--fmtcnt>= 0) { diff -r ec4ea40be2f6 -r 2801bf875a24 Objects/unicodeobject.c --- a/Objects/unicodeobject.c Tue Aug 28 19:23:56 2012 +0200 +++ b/Objects/unicodeobject.c Tue Aug 28 17:55:35 2012 -0400 @@ -8275,7 +8275,7 @@ arglen = -1; argidx = -2; } - if (Py_TYPE(args)->tp_as_mapping && !PyTuple_Check(args) && + if (PyMapping_Check(args) && !PyTuple_Check(args) && !PyObject_TypeCheck(args, &PyBaseString_Type)) dict = args;

AltStyle によって変換されたページ (->オリジナル) /