summaryrefslogtreecommitdiffstats
path: root/Lib/string.py
diff options
context:
space:
mode:
authorBarry Warsaw <barry@python.org>2004-09-18 00:06:34 (GMT)
committerBarry Warsaw <barry@python.org>2004-09-18 00:06:34 (GMT)
commit17cb60083c53b464a329f1a660a922db677389dd (patch)
tree71cd312c89fef47908b2d6beae434f62d6148abf /Lib/string.py
parent2e6fb4634cf7fce9938f80661dc000d9748a7bc7 (diff)
downloadcpython-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.py14
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)