diff options
author | Barry Warsaw <barry@python.org> | 2004-09-18 00:06:34 (GMT) |
---|---|---|
committer | Barry Warsaw <barry@python.org> | 2004-09-18 00:06:34 (GMT) |
commit | 17cb60083c53b464a329f1a660a922db677389dd (patch) | |
tree | 71cd312c89fef47908b2d6beae434f62d6148abf /Lib/string.py | |
parent | 2e6fb4634cf7fce9938f80661dc000d9748a7bc7 (diff) | |
download | cpython-17cb60083c53b464a329f1a660a922db677389dd.zip cpython-17cb60083c53b464a329f1a660a922db677389dd.tar.gz cpython-17cb60083c53b464a329f1a660a922db677389dd.tar.bz2 |
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.
Diffstat (limited to 'Lib/string.py')
-rw-r--r-- | Lib/string.py | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/Lib/string.py b/Lib/string.py index 3c37b0b..623eb0e 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) |