[Python-checkins] cpython (2.7): Issue #1686: Fix string.Template when overriding the pattern attribute.

georg.brandl python-checkins at python.org
Mon Oct 6 17:38:15 CEST 2014


https://hg.python.org/cpython/rev/8a98ee6baa1e
changeset: 92856:8a98ee6baa1e
branch: 2.7
parent: 92851:6e2a72e05b4f
user: Florent Xicluna <florent.xicluna at gmail.com>
date: Sat Sep 18 23:34:07 2010 +0000
summary:
 Issue #1686: Fix string.Template when overriding the pattern attribute.
files:
 Lib/string.py | 12 ++-------
 Lib/test/test_pep292.py | 34 +++++++++++++++++++++++++++++
 Misc/NEWS | 2 +
 3 files changed, 39 insertions(+), 9 deletions(-)
diff --git a/Lib/string.py b/Lib/string.py
--- a/Lib/string.py
+++ b/Lib/string.py
@@ -182,24 +182,18 @@
 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
--- a/Lib/test/test_pep292.py
+++ b/Lib/test/test_pep292.py
@@ -125,6 +125,40 @@
 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')
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -34,6 +34,8 @@
 Library
 -------
 
+- Issue #1686: Fix string.Template when overriding the pattern attribute.
+
 - Issue #11866: Eliminated race condition in the computation of names
 for new threads.
 
-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /