]> granicus.if.org Git - python/commitdiff
Issue #1686: Fix string.Template when overriding the pattern attribute.
authorFlorent Xicluna <florent.xicluna@gmail.com>
Sat, 18 Sep 2010 23:34:07 +0000 (23:34 +0000)
committerFlorent Xicluna <florent.xicluna@gmail.com>
Sat, 18 Sep 2010 23:34:07 +0000 (23:34 +0000)
Lib/string.py
Lib/test/test_pep292.py
Misc/NEWS

index 2a450cd962873ac835a17b8fae726f388fc4e59a..d4fee391c1e802e816cbdac644ef42dadd53e5d5 100644 (file)
@@ -145,24 +145,18 @@ class Template(metaclass=_TemplateMetaclass):
             mapping = args[0]
         # Helper function for .sub()
         def convert(mo):
-            named = mo.group('named')
+            named = mo.group('named') or mo.group('braced')
             if named is not None:
                 try:
                     # We use this idiom instead of str() because the latter
                     # will fail if val is a Unicode containing non-ASCII
                     return '%s' % (mapping[named],)
                 except KeyError:
-                    return self.delimiter + named
-            braced = mo.group('braced')
-            if braced is not None:
-                try:
-                    return '%s' % (mapping[braced],)
-                except KeyError:
-                    return self.delimiter + '{' + braced + '}'
+                    return mo.group()
             if mo.group('escaped') is not None:
                 return self.delimiter
             if mo.group('invalid') is not None:
-                return self.delimiter
+                return mo.group()
             raise ValueError('Unrecognized named group in pattern',
                              self.pattern)
         return self.pattern.sub(convert, self.template)
index 8537b25616e80873c280de8d2a676626ea756cd0..a9676495e97eb761ed741926d4c0371e55672097 100644 (file)
@@ -125,6 +125,40 @@ class TestTemplate(unittest.TestCase):
         self.assertRaises(ValueError, s.substitute, {})
         self.assertRaises(ValueError, s.safe_substitute, {})
 
+    def test_braced_override(self):
+        class MyTemplate(Template):
+            pattern = r"""
+            \$(?:
+              (?P<escaped>$)                     |
+              (?P<named>[_a-z][_a-z0-9]*)        |
+              @@(?P<braced>[_a-z][_a-z0-9]*)@@   |
+              (?P<invalid>)                      |
+           )
+           """
+
+        tmpl = 'PyCon in $@@location@@'
+        t = MyTemplate(tmpl)
+        self.assertRaises(KeyError, t.substitute, {})
+        val = t.substitute({'location': 'Cleveland'})
+        self.assertEqual(val, 'PyCon in Cleveland')
+
+    def test_braced_override_safe(self):
+        class MyTemplate(Template):
+            pattern = r"""
+            \$(?:
+              (?P<escaped>$)                     |
+              (?P<named>[_a-z][_a-z0-9]*)        |
+              @@(?P<braced>[_a-z][_a-z0-9]*)@@   |
+              (?P<invalid>)                      |
+           )
+           """
+
+        tmpl = 'PyCon in $@@location@@'
+        t = MyTemplate(tmpl)
+        self.assertEqual(t.safe_substitute(), tmpl)
+        val = t.safe_substitute({'location': 'Cleveland'})
+        self.assertEqual(val, 'PyCon in Cleveland')
+
     def test_unicode_values(self):
         s = Template('$who likes $what')
         d = dict(who='t\xffm', what='f\xfe\fed')
index 34cea645f70827f9c397f3b3b054619c4fcc6006..cdac64e413795dd422b8e01a4352e609c104db0e 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -52,6 +52,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #1686: Fix string.Template when overriding the pattern attribute.
+
 - Issue #9854: SocketIO objects now observe the RawIOBase interface in
   non-blocking mode: they return None when an operation would block (instead
   of raising an exception).