summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorFlorent Xicluna <florent.xicluna@gmail.com>2010-09-18 23:34:07 (GMT)
committerFlorent Xicluna <florent.xicluna@gmail.com>2010-09-18 23:34:07 (GMT)
commitff05e522375d1b8e06bda9a5727cc890e94c5d90 (patch)
tree8f39629976d3ef296bdf1090ccd13e05ad72be65 /Lib
parent71ede5047de4d745c02175b94da03adcc8c00593 (diff)
downloadcpython-ff05e522375d1b8e06bda9a5727cc890e94c5d90.zip
cpython-ff05e522375d1b8e06bda9a5727cc890e94c5d90.tar.gz
cpython-ff05e522375d1b8e06bda9a5727cc890e94c5d90.tar.bz2
Issue #1686: Fix string.Template when overriding the pattern attribute.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/string.py12
-rw-r--r--Lib/test/test_pep292.py34
2 files changed, 37 insertions, 9 deletions
diff --git a/Lib/string.py b/Lib/string.py
index 9727803..d762e04 100644
--- a/Lib/string.py
+++ b/Lib/string.py
@@ -182,24 +182,18 @@ class Template:
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)
diff --git a/Lib/test/test_pep292.py b/Lib/test/test_pep292.py
index cb8a244..5ff280d 100644
--- a/Lib/test/test_pep292.py
+++ b/Lib/test/test_pep292.py
@@ -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=u't\xffm', what=u'f\xfe\fed')