Mercurial > cpython-lru_cache-weakref
diff Lib/string.py @ 33471:41dbee5ed295 legacy-trunk
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.
| author | Barry Warsaw <barry@python.org> |
|---|---|
| date | Mon, 13 Sep 2004 14:35:04 +0000 |
| parents | 81618a7d490e |
| children | a220073536d6 |
line wrap: on
line diff
--- a/Lib/string.py Mon Sep 13 08:53:15 2004 +0000 +++ b/Lib/string.py Mon Sep 13 14:35:04 2004 +0000 @@ -82,6 +82,23 @@ #################################################################### 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 @@ 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 @@ 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)
