]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
use the stricter PyMapping_Check (closes #15801)
authorBenjamin Peterson <benjamin@python.org>
Tue, 28 Aug 2012 21:55:35 +0000 (17:55 -0400)
committerBenjamin Peterson <benjamin@python.org>
Tue, 28 Aug 2012 21:55:35 +0000 (17:55 -0400)
Lib/test/string_tests.py
Misc/NEWS
Objects/stringobject.c
Objects/unicodeobject.c

index 5931f3d88ba26d6f6559880743a36f3b8371375f..a1615126349b3db2c702d2bd1faa674a2c07f3dd 100644 (file)
@@ -1113,6 +1113,9 @@ class MixinStrUnicodeUserStringTest:
         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):
index 71a858eb538bb513c6df5d10b62c805a057edc60..54c260c660a9d8c90b4893fa1177471fdd41c42f 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -9,6 +9,9 @@ What's New in Python 2.7.4
 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.
 
index fd2f63001d97b654277aed25591a47f7764bc6cf..7c4a86b5e647957669abbe87e73e4195676c6318 100644 (file)
@@ -4254,7 +4254,7 @@ PyString_Format(PyObject *format, PyObject *args)
         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) {
index 59b138a21fa41e27c7a1fa3b19ecad273832bf86..d40f2e46b22e9e96f1ed9a4b5c4e26451b66bda8 100644 (file)
@@ -8275,7 +8275,7 @@ PyObject *PyUnicode_Format(PyObject *format,
         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;