]> granicus.if.org Git - python/commitdiff
Closes #12579. Positional fields with str.format_map() now raise a ValueError instead...
authorEric V. Smith <eric@trueblade.com>
Mon, 18 Jul 2011 18:03:41 +0000 (14:03 -0400)
committerEric V. Smith <eric@trueblade.com>
Mon, 18 Jul 2011 18:03:41 +0000 (14:03 -0400)
Lib/test/test_unicode.py
Misc/ACKS
Misc/NEWS
Objects/stringlib/string_format.h

index 885e740b7663bb0ae3dcfd29d542e64064dfad1f..55aaba6d3b48f8c1ec62970a6bb0cd02f308557a 100644 (file)
@@ -736,6 +736,11 @@ class UnicodeTest(string_tests.CommonTest,
         self.assertRaises(TypeError, '{a'.format_map)
         self.assertRaises(TypeError, '}a'.format_map)
 
+        # issue #12579: can't supply positional params to format_map
+        self.assertRaises(ValueError, '{}'.format_map, {'a' : 2})
+        self.assertRaises(ValueError, '{}'.format_map, 'a')
+        self.assertRaises(ValueError, '{a} {}'.format_map, {"a" : 2, "b" : 1})
+
     def test_format_auto_numbering(self):
         class C:
             def __init__(self, x=100):
index ee9b3734aa1e43d4ad17f337052290eec57c8fa6..ccbe152f6f9a6b389de831f4487c85ce093df282 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -78,6 +78,7 @@ Eli Bendersky
 Andrew Bennetts
 Andy Bensky
 Michel Van den Bergh
+Julian Berman
 Eric Beser
 Steven Bethard
 Stephen Bevan
index bf337458375354c6c47ce03caaff04c81f2a03c3..f444709ab50a1b710d88d96b58a1fb22b800d521 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,10 @@ What's New in Python 3.2.2?
 Core and Builtins
 -----------------
 
+- Issue #12579: str.format_map() now raises a ValueError if used on a
+  format string that contains positional fields. Initial patch by
+  Julian Berman.
+
 - Issue #11627: Fix segfault when __new__ on a exception returns a non-exception
   class.
 
index 6f10727e24596f23b8764f787e196a75b3439f9c..6c7adcb01ed89d2069903f7a673656860d423c24 100644 (file)
@@ -511,6 +511,16 @@ get_field_object(SubString *input, PyObject *args, PyObject *kwargs,
         Py_DECREF(key);
     }
     else {
+        /* If args is NULL, we have a format string with a positional field
+           with only kwargs to retrieve it from. This can only happen when
+           used with format_map(), where positional arguments are not
+           allowed. */
+        if (args == NULL) {
+            PyErr_SetString(PyExc_ValueError, "Format string contains "
+                            "positional fields");
+            goto error;
+        }
+
         /* look up in args */
         obj = PySequence_GetItem(args, index);
         if (obj == NULL)