From 17cb60083c53b464a329f1a660a922db677389dd Mon Sep 17 00:00:00 2001 From: Barry Warsaw Date: Sat, 18 Sep 2004 00:06:34 +0000 Subject: [PATCH] At the cost of a modest (but useful in its own right) change in the semantics of the Template.delimiter attribute, we make use of the delimiter in the escaped group, and in the safe_substitute() method more robust. Now, .delimiter should be the unescaped delimiter literal, e.g. '$' or '&', or whatever. The _TemplateMetaclass will re.escape() this value when it builds the pattern. --- Lib/string.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/Lib/string.py b/Lib/string.py index 3c37b0ba73e..623eb0edab8 100644 --- a/Lib/string.py +++ b/Lib/string.py @@ -113,7 +113,7 @@ class _TemplateMetaclass(type): pattern = cls.pattern else: pattern = _TemplateMetaclass.pattern % { - 'delim' : cls.delimiter, + 'delim' : _re.escape(cls.delimiter), 'id' : cls.idpattern, } cls.pattern = _re.compile(pattern, _re.IGNORECASE | _re.VERBOSE) @@ -123,7 +123,7 @@ class Template: """A string class for supporting $-substitutions.""" __metaclass__ = _TemplateMetaclass - delimiter = r'\$' + delimiter = '$' idpattern = r'[_a-z][_a-z0-9]*' def __init__(self, template): @@ -152,7 +152,6 @@ class Template: mapping = _multimap(kws, args[0]) else: mapping = args[0] - delimiter = self.delimiter[-1] # Helper function for .sub() def convert(mo): # Check the most common path first. @@ -163,7 +162,7 @@ class Template: # fail if val is a Unicode containing non-ASCII characters. return '%s' % val if mo.group('escaped') is not None: - return delimiter + return self.delimiter if mo.group('invalid') is not None: self._invalid(mo) raise ValueError('Unrecognized named group in pattern', pattern) @@ -178,7 +177,6 @@ class Template: mapping = _multimap(kws, args[0]) else: mapping = args[0] - delimiter = self.delimiter[-1] # Helper function for .sub() def convert(mo): named = mo.group('named') @@ -188,15 +186,15 @@ class Template: # will fail if val is a Unicode containing non-ASCII return '%s' % mapping[named] except KeyError: - return delimiter + named + return self.delimiter + named braced = mo.group('braced') if braced is not None: try: return '%s' % mapping[braced] except KeyError: - return delimiter + '{' + braced + '}' + return self.delimiter + '{' + braced + '}' if mo.group('escaped') is not None: - return delimiter + return self.delimiter if mo.group('invalid') is not None: self._invalid(mo) raise ValueError('Unrecognized named group in pattern', pattern)