[Python-checkins] cpython (2.7): allow any type with __getitem__ to be a mapping for the purposes of % (#15801)

benjamin.peterson python-checkins at python.org
Sun Mar 24 04:37:21 CET 2013


http://hg.python.org/cpython/rev/391e3a7db1a3
changeset:   82938:391e3a7db1a3
branch:      2.7
parent:      82929:87d266988905
user:        Benjamin Peterson <benjamin at python.org>
date:        Sat Mar 23 22:32:00 2013 -0500
summary:
  allow any type with __getitem__ to be a mapping for the purposes of % (#15801)

files:
  Lib/test/string_tests.py |  4 ++++
  Misc/NEWS                |  7 +++++++
  Objects/stringobject.c   |  4 ++--
  Objects/unicodeobject.c  |  4 ++--
  4 files changed, 15 insertions(+), 4 deletions(-)


diff --git a/Lib/test/string_tests.py b/Lib/test/string_tests.py
--- a/Lib/test/string_tests.py
+++ b/Lib/test/string_tests.py
@@ -1130,6 +1130,10 @@
 
         class X(object): pass
         self.checkraises(TypeError, 'abc', '__mod__', X())
+        class X(Exception):
+            def __getitem__(self, k):
+                return k
+        self.checkequal('melon apple', '%(melon)s %(apple)s', '__mod__', X())
 
     def test_floatformatting(self):
         # float formatting
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -6,6 +6,13 @@
 
 *Release date: XXXX-XX-XX*
 
+Core and Builtins
+-----------------
+
+- Issue #15801 (again): With string % formatting, relax the type check for a
+  mapping such that any type with a __getitem__ can be used on the right hand
+  side.
+
 Library
 -------
 
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -4257,8 +4257,8 @@
         arglen = -1;
         argidx = -2;
     }
-    if (PyMapping_Check(args) && !PyTuple_Check(args) &&
-        !PyObject_TypeCheck(args, &PyBaseString_Type))
+    if (Py_TYPE(args)->tp_as_mapping && Py_TYPE(args)->tp_as_mapping->mp_subscript &&
+        !PyTuple_Check(args) && !PyObject_TypeCheck(args, &PyBaseString_Type))
         dict = args;
     while (--fmtcnt >= 0) {
         if (*fmt != '%') {
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -8287,8 +8287,8 @@
         arglen = -1;
         argidx = -2;
     }
-    if (PyMapping_Check(args) && !PyTuple_Check(args) &&
-        !PyObject_TypeCheck(args, &PyBaseString_Type))
+    if (Py_TYPE(args)->tp_as_mapping && Py_TYPE(args)->tp_as_mapping->mp_subscript &&
+        !PyTuple_Check(args) && !PyObject_TypeCheck(args, &PyBaseString_Type))
         dict = args;
 
     while (--fmtcnt >= 0) {

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list