summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBarry Warsaw <barry@python.org>2004-09-13 14:35:04 +0000
committerBarry Warsaw <barry@python.org>2004-09-13 14:35:04 +0000
commite87eef1bd130997fd16e6c376937b986fde66c81 (patch)
treefc7eb5a28c98f6709e6ea2f281dc7cf1eb1f2dc3
parent7501bf3832bf3cbf10c8428489aa5510fdb14b8a (diff)
downloadcpython-e87eef1bd130997fd16e6c376937b986fde66c81.tar.gz
Accepted Raymond's patch to combine mapping and keyword arguments, with slight
modification. Also, renamed the positional argument to '__mapping' to further reduce the chance of duplicate keyword arguments.
-rw-r--r--Lib/string.py37
1 files changed, 32 insertions, 5 deletions
diff --git a/Lib/string.py b/Lib/string.py
index fd9cc99231..9d6a602a7d 100644
--- a/Lib/string.py
+++ b/Lib/string.py
@@ -82,6 +82,23 @@ def maketrans(fromstr, tostr):
####################################################################
import re as _re
+class _multimap:
+ """Helper class for combining multiple mappings.
+
+ Used by .{safe_,}substitute() to combine the mapping and keyword
+ arguments.
+ """
+ def __init__(self, primary, secondary):
+ self._primary = primary
+ self._secondary = secondary
+
+ def __getitem__(self, key):
+ try:
+ return self._primary[key]
+ except KeyError:
+ return self._secondary[key]
+
+
class _TemplateMetaclass(type):
pattern = r"""
(?P<escaped>%(delim)s{2}) | # Escape sequence of two delimiters
@@ -126,19 +143,29 @@ class Template:
raise ValueError('Invalid placeholder in string: line %d, col %d' %
(lineno, colno))
- def substitute(self, mapping):
+ def substitute(self, __mapping=None, **kws):
+ if __mapping is None:
+ __mapping = kws
+ elif kws:
+ __mapping = _multimap(kws, __mapping)
+ # Helper function for .sub()
def convert(mo):
if mo.group('escaped') is not None:
return '$'
if mo.group('bogus') is not None:
self._bogus(mo)
- val = mapping[mo.group('named') or mo.group('braced')]
+ val = __mapping[mo.group('named') or mo.group('braced')]
# We use this idiom instead of str() because the latter will fail
# if val is a Unicode containing non-ASCII characters.
return '%s' % val
return self.pattern.sub(convert, self.template)
- def safe_substitute(self, mapping):
+ def safe_substitute(self, __mapping=None, **kws):
+ if __mapping is None:
+ __mapping = kws
+ elif kws:
+ __mapping = _multimap(kws, __mapping)
+ # Helper function for .sub()
def convert(mo):
if mo.group('escaped') is not None:
return '$'
@@ -149,12 +176,12 @@ class Template:
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]
+ return '%s' % __mapping[named]
except KeyError:
return '$' + named
braced = mo.group('braced')
try:
- return '%s' % mapping[braced]
+ return '%s' % __mapping[braced]
except KeyError:
return '${' + braced + '}'
return self.pattern.sub(convert, self.template)