annotate Lib/string.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 4feb10457c13
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
41480
99027c2b3fd2 Remove functions in string module that are also string methods. Also remove:
Neal Norwitz <nnorwitz@gmail.com>
parents: 41226
diff changeset
1 """A collection of string constants.
6964
33be7d5d498b Added doc string, provided by Charles Waldman (with some reformatting
Guido van Rossum <guido@python.org>
parents: 6821
diff changeset
2
33be7d5d498b Added doc string, provided by Charles Waldman (with some reformatting
Guido van Rossum <guido@python.org>
parents: 6821
diff changeset
3 Public module variables:
33be7d5d498b Added doc string, provided by Charles Waldman (with some reformatting
Guido van Rossum <guido@python.org>
parents: 6821
diff changeset
4
49804
8f0a175f04be #4361: fix string.py docstring, clarify that only ASCII characters are in its constants.
Georg Brandl <georg@python.org>
parents: 49734
diff changeset
5 whitespace -- a string containing all ASCII whitespace
8f0a175f04be #4361: fix string.py docstring, clarify that only ASCII characters are in its constants.
Georg Brandl <georg@python.org>
parents: 49734
diff changeset
6 ascii_lowercase -- a string containing all ASCII lowercase letters
8f0a175f04be #4361: fix string.py docstring, clarify that only ASCII characters are in its constants.
Georg Brandl <georg@python.org>
parents: 49734
diff changeset
7 ascii_uppercase -- a string containing all ASCII uppercase letters
8f0a175f04be #4361: fix string.py docstring, clarify that only ASCII characters are in its constants.
Georg Brandl <georg@python.org>
parents: 49734
diff changeset
8 ascii_letters -- a string containing all ASCII letters
8f0a175f04be #4361: fix string.py docstring, clarify that only ASCII characters are in its constants.
Georg Brandl <georg@python.org>
parents: 49734
diff changeset
9 digits -- a string containing all ASCII decimal digits
8f0a175f04be #4361: fix string.py docstring, clarify that only ASCII characters are in its constants.
Georg Brandl <georg@python.org>
parents: 49734
diff changeset
10 hexdigits -- a string containing all ASCII hexadecimal digits
8f0a175f04be #4361: fix string.py docstring, clarify that only ASCII characters are in its constants.
Georg Brandl <georg@python.org>
parents: 49734
diff changeset
11 octdigits -- a string containing all ASCII octal digits
8f0a175f04be #4361: fix string.py docstring, clarify that only ASCII characters are in its constants.
Georg Brandl <georg@python.org>
parents: 49734
diff changeset
12 punctuation -- a string containing all ASCII punctuation characters
8f0a175f04be #4361: fix string.py docstring, clarify that only ASCII characters are in its constants.
Georg Brandl <georg@python.org>
parents: 49734
diff changeset
13 printable -- a string containing all ASCII characters considered printable
6964
33be7d5d498b Added doc string, provided by Charles Waldman (with some reformatting
Guido van Rossum <guido@python.org>
parents: 6821
diff changeset
14
33be7d5d498b Added doc string, provided by Charles Waldman (with some reformatting
Guido van Rossum <guido@python.org>
parents: 6821
diff changeset
15 """
33be7d5d498b Added doc string, provided by Charles Waldman (with some reformatting
Guido van Rossum <guido@python.org>
parents: 6821
diff changeset
16
65291
fd044cda97d8 #9418: first step of moving private string methods to _string module.
Georg Brandl <georg@python.org>
parents: 64818
diff changeset
17 import _string
fd044cda97d8 #9418: first step of moving private string methods to _string module.
Georg Brandl <georg@python.org>
parents: 64818
diff changeset
18
5
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 # Some strings for ctype-style character classification
1331
07900834cc97 * pdb.py: set 'privileged' property when evaluating expressions
Guido van Rossum <guido@python.org>
parents: 1291
diff changeset
20 whitespace = ' \t\n\r\v\f'
42585
b623777f22b0 Remove string.{letters,lowercase,uppercase}.
Martin v. Löwis <martin@v.loewis.de>
parents: 42142
diff changeset
21 ascii_lowercase = 'abcdefghijklmnopqrstuvwxyz'
b623777f22b0 Remove string.{letters,lowercase,uppercase}.
Martin v. Löwis <martin@v.loewis.de>
parents: 42142
diff changeset
22 ascii_uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
18776
22b2f4b436af Added the constants ascii_letters, ascii_lowercase, and ascii_uppercase
Fred Drake <fdrake@acm.org>
parents: 16657
diff changeset
23 ascii_letters = ascii_lowercase + ascii_uppercase
5
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 digits = '0123456789'
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 hexdigits = digits + 'abcdef' + 'ABCDEF'
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 octdigits = '01234567'
15872
3685ef2a55a4 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15610
diff changeset
27 punctuation = """!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"""
42585
b623777f22b0 Remove string.{letters,lowercase,uppercase}.
Martin v. Löwis <martin@v.loewis.de>
parents: 42142
diff changeset
28 printable = digits + ascii_letters + punctuation + whitespace
5
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
29
33257
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
30 # Functions which aren't available as string methods.
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
31
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
32 # Capitalize the words in a string, e.g. " aBc dEf " -> "Abc Def".
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
33 def capwords(s, sep=None):
56233
f3c595214abc Merged revisions 75074 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53909
diff changeset
34 """capwords(s [,sep]) -> string
33257
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
35
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
36 Split the argument into words using split, capitalize each
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
37 word using capitalize, and join the capitalized words using
56233
f3c595214abc Merged revisions 75074 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53909
diff changeset
38 join. If the optional second argument sep is absent or None,
f3c595214abc Merged revisions 75074 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53909
diff changeset
39 runs of whitespace characters are replaced by a single space
f3c595214abc Merged revisions 75074 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53909
diff changeset
40 and leading and trailing whitespace are removed, otherwise
f3c595214abc Merged revisions 75074 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53909
diff changeset
41 sep is used to split and join the words.
33257
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
42
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
43 """
56233
f3c595214abc Merged revisions 75074 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53909
diff changeset
44 return (sep or ' ').join(x.capitalize() for x in s.split(sep))
33257
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
45
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
46
33278
2b136441035c Minor improvements to the template code.
Raymond Hettinger <python@rcn.com>
parents: 33257
diff changeset
47 ####################################################################
33257
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
48 import re as _re
68164
73c5abb41296 Issue #11297: Add collections.ChainMap()
Raymond Hettinger <python@rcn.com>
parents: 68092
diff changeset
49 from collections import ChainMap
33471
41dbee5ed295 Accepted Raymond's patch to combine mapping and keyword arguments, with slight
Barry Warsaw <barry@python.org>
parents: 33450
diff changeset
50
33439
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
51 class _TemplateMetaclass(type):
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
52 pattern = r"""
33588
68d11e439a0b Make the regex pattern easier to read, understand, and modify
Raymond Hettinger <python@rcn.com>
parents: 33505
diff changeset
53 %(delim)s(?:
68d11e439a0b Make the regex pattern easier to read, understand, and modify
Raymond Hettinger <python@rcn.com>
parents: 33505
diff changeset
54 (?P<escaped>%(delim)s) | # Escape sequence of two delimiters
68d11e439a0b Make the regex pattern easier to read, understand, and modify
Raymond Hettinger <python@rcn.com>
parents: 33505
diff changeset
55 (?P<named>%(id)s) | # delimiter and a Python identifier
68d11e439a0b Make the regex pattern easier to read, understand, and modify
Raymond Hettinger <python@rcn.com>
parents: 33505
diff changeset
56 {(?P<braced>%(id)s)} | # delimiter and a braced identifier
68d11e439a0b Make the regex pattern easier to read, understand, and modify
Raymond Hettinger <python@rcn.com>
parents: 33505
diff changeset
57 (?P<invalid>) # Other ill-formed delimiter exprs
68d11e439a0b Make the regex pattern easier to read, understand, and modify
Raymond Hettinger <python@rcn.com>
parents: 33505
diff changeset
58 )
33439
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
59 """
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
60
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
61 def __init__(cls, name, bases, dct):
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
62 super(_TemplateMetaclass, cls).__init__(name, bases, dct)
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
63 if 'pattern' in dct:
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
64 pattern = cls.pattern
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
65 else:
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
66 pattern = _TemplateMetaclass.pattern % {
33505
cc0ae03743b8 At the cost of a modest (but useful in its own right) change in the semantics
Barry Warsaw <barry@python.org>
parents: 33497
diff changeset
67 'delim' : _re.escape(cls.delimiter),
33439
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
68 'id' : cls.idpattern,
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
69 }
63295
91cbb55e20be #6630: allow customizing flags for compiling string.Template.idpattern.
Georg Brandl <georg@python.org>
parents: 56232
diff changeset
70 cls.pattern = _re.compile(pattern, cls.flags | _re.VERBOSE)
33439
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
71
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
72
41226
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
73 class Template(metaclass=_TemplateMetaclass):
33257
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
74 """A string class for supporting $-substitutions."""
33439
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
75
33505
cc0ae03743b8 At the cost of a modest (but useful in its own right) change in the semantics
Barry Warsaw <barry@python.org>
parents: 33497
diff changeset
76 delimiter = '$'
33439
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
77 idpattern = r'[_a-z][_a-z0-9]*'
63295
91cbb55e20be #6630: allow customizing flags for compiling string.Template.idpattern.
Georg Brandl <georg@python.org>
parents: 56232
diff changeset
78 flags = _re.IGNORECASE
33439
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
79
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
80 def __init__(self, template):
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
81 self.template = template
33257
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
82
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
83 # Search for $$, $identifier, ${identifier}, and any bare $'s
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
84
33479
b87eaa46c9cb Raymond's good suggestion to re-order the tests in the convert() helper so the
Barry Warsaw <barry@python.org>
parents: 33477
diff changeset
85 def _invalid(self, mo):
b87eaa46c9cb Raymond's good suggestion to re-order the tests in the convert() helper so the
Barry Warsaw <barry@python.org>
parents: 33477
diff changeset
86 i = mo.start('invalid')
72485
83f43b58c988 #13012: use splitlines(keepends=True/False) instead of splitlines(0/1).
Ezio Melotti <ezio.melotti@gmail.com>
parents: 68258
diff changeset
87 lines = self.template[:i].splitlines(keepends=True)
33439
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
88 if not lines:
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
89 colno = 1
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
90 lineno = 1
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
91 else:
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
92 colno = i - len(''.join(lines[:-1]))
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
93 lineno = len(lines)
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
94 raise ValueError('Invalid placeholder in string: line %d, col %d' %
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
95 (lineno, colno))
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
96
33477
a220073536d6 substitute(), safe_substitute(): Paul Moore provides a better hack for dealing
Barry Warsaw <barry@python.org>
parents: 33471
diff changeset
97 def substitute(self, *args, **kws):
a220073536d6 substitute(), safe_substitute(): Paul Moore provides a better hack for dealing
Barry Warsaw <barry@python.org>
parents: 33471
diff changeset
98 if len(args) > 1:
a220073536d6 substitute(), safe_substitute(): Paul Moore provides a better hack for dealing
Barry Warsaw <barry@python.org>
parents: 33471
diff changeset
99 raise TypeError('Too many positional arguments')
a220073536d6 substitute(), safe_substitute(): Paul Moore provides a better hack for dealing
Barry Warsaw <barry@python.org>
parents: 33471
diff changeset
100 if not args:
a220073536d6 substitute(), safe_substitute(): Paul Moore provides a better hack for dealing
Barry Warsaw <barry@python.org>
parents: 33471
diff changeset
101 mapping = kws
33471
41dbee5ed295 Accepted Raymond's patch to combine mapping and keyword arguments, with slight
Barry Warsaw <barry@python.org>
parents: 33450
diff changeset
102 elif kws:
68164
73c5abb41296 Issue #11297: Add collections.ChainMap()
Raymond Hettinger <python@rcn.com>
parents: 68092
diff changeset
103 mapping = ChainMap(kws, args[0])
33477
a220073536d6 substitute(), safe_substitute(): Paul Moore provides a better hack for dealing
Barry Warsaw <barry@python.org>
parents: 33471
diff changeset
104 else:
a220073536d6 substitute(), safe_substitute(): Paul Moore provides a better hack for dealing
Barry Warsaw <barry@python.org>
parents: 33471
diff changeset
105 mapping = args[0]
33471
41dbee5ed295 Accepted Raymond's patch to combine mapping and keyword arguments, with slight
Barry Warsaw <barry@python.org>
parents: 33450
diff changeset
106 # Helper function for .sub()
33257
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
107 def convert(mo):
33479
b87eaa46c9cb Raymond's good suggestion to re-order the tests in the convert() helper so the
Barry Warsaw <barry@python.org>
parents: 33477
diff changeset
108 # Check the most common path first.
b87eaa46c9cb Raymond's good suggestion to re-order the tests in the convert() helper so the
Barry Warsaw <barry@python.org>
parents: 33477
diff changeset
109 named = mo.group('named') or mo.group('braced')
b87eaa46c9cb Raymond's good suggestion to re-order the tests in the convert() helper so the
Barry Warsaw <barry@python.org>
parents: 33477
diff changeset
110 if named is not None:
b87eaa46c9cb Raymond's good suggestion to re-order the tests in the convert() helper so the
Barry Warsaw <barry@python.org>
parents: 33477
diff changeset
111 val = mapping[named]
b87eaa46c9cb Raymond's good suggestion to re-order the tests in the convert() helper so the
Barry Warsaw <barry@python.org>
parents: 33477
diff changeset
112 # We use this idiom instead of str() because the latter will
b87eaa46c9cb Raymond's good suggestion to re-order the tests in the convert() helper so the
Barry Warsaw <barry@python.org>
parents: 33477
diff changeset
113 # fail if val is a Unicode containing non-ASCII characters.
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 34127
diff changeset
114 return '%s' % (val,)
33278
2b136441035c Minor improvements to the template code.
Raymond Hettinger <python@rcn.com>
parents: 33257
diff changeset
115 if mo.group('escaped') is not None:
33505
cc0ae03743b8 At the cost of a modest (but useful in its own right) change in the semantics
Barry Warsaw <barry@python.org>
parents: 33497
diff changeset
116 return self.delimiter
33479
b87eaa46c9cb Raymond's good suggestion to re-order the tests in the convert() helper so the
Barry Warsaw <barry@python.org>
parents: 33477
diff changeset
117 if mo.group('invalid') is not None:
b87eaa46c9cb Raymond's good suggestion to re-order the tests in the convert() helper so the
Barry Warsaw <barry@python.org>
parents: 33477
diff changeset
118 self._invalid(mo)
33773
ab09daac5691 Invalid patterns to substitute and safe_substitute would crash since pattern
Neal Norwitz <nnorwitz@gmail.com>
parents: 33588
diff changeset
119 raise ValueError('Unrecognized named group in pattern',
ab09daac5691 Invalid patterns to substitute and safe_substitute would crash since pattern
Neal Norwitz <nnorwitz@gmail.com>
parents: 33588
diff changeset
120 self.pattern)
33439
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
121 return self.pattern.sub(convert, self.template)
33257
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
122
33477
a220073536d6 substitute(), safe_substitute(): Paul Moore provides a better hack for dealing
Barry Warsaw <barry@python.org>
parents: 33471
diff changeset
123 def safe_substitute(self, *args, **kws):
a220073536d6 substitute(), safe_substitute(): Paul Moore provides a better hack for dealing
Barry Warsaw <barry@python.org>
parents: 33471
diff changeset
124 if len(args) > 1:
a220073536d6 substitute(), safe_substitute(): Paul Moore provides a better hack for dealing
Barry Warsaw <barry@python.org>
parents: 33471
diff changeset
125 raise TypeError('Too many positional arguments')
a220073536d6 substitute(), safe_substitute(): Paul Moore provides a better hack for dealing
Barry Warsaw <barry@python.org>
parents: 33471
diff changeset
126 if not args:
a220073536d6 substitute(), safe_substitute(): Paul Moore provides a better hack for dealing
Barry Warsaw <barry@python.org>
parents: 33471
diff changeset
127 mapping = kws
33471
41dbee5ed295 Accepted Raymond's patch to combine mapping and keyword arguments, with slight
Barry Warsaw <barry@python.org>
parents: 33450
diff changeset
128 elif kws:
68164
73c5abb41296 Issue #11297: Add collections.ChainMap()
Raymond Hettinger <python@rcn.com>
parents: 68092
diff changeset
129 mapping = ChainMap(kws, args[0])
33477
a220073536d6 substitute(), safe_substitute(): Paul Moore provides a better hack for dealing
Barry Warsaw <barry@python.org>
parents: 33471
diff changeset
130 else:
a220073536d6 substitute(), safe_substitute(): Paul Moore provides a better hack for dealing
Barry Warsaw <barry@python.org>
parents: 33471
diff changeset
131 mapping = args[0]
33471
41dbee5ed295 Accepted Raymond's patch to combine mapping and keyword arguments, with slight
Barry Warsaw <barry@python.org>
parents: 33450
diff changeset
132 # Helper function for .sub()
33257
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
133 def convert(mo):
64818
71b95942c3a4 Issue #1686: Fix string.Template when overriding the pattern attribute.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 64501
diff changeset
134 named = mo.group('named') or mo.group('braced')
33257
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
135 if named is not None:
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
136 try:
33439
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
137 # We use this idiom instead of str() because the latter
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
138 # will fail if val is a Unicode containing non-ASCII
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 34127
diff changeset
139 return '%s' % (mapping[named],)
33257
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
140 except KeyError:
64818
71b95942c3a4 Issue #1686: Fix string.Template when overriding the pattern attribute.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 64501
diff changeset
141 return mo.group()
33479
b87eaa46c9cb Raymond's good suggestion to re-order the tests in the convert() helper so the
Barry Warsaw <barry@python.org>
parents: 33477
diff changeset
142 if mo.group('escaped') is not None:
33505
cc0ae03743b8 At the cost of a modest (but useful in its own right) change in the semantics
Barry Warsaw <barry@python.org>
parents: 33497
diff changeset
143 return self.delimiter
33479
b87eaa46c9cb Raymond's good suggestion to re-order the tests in the convert() helper so the
Barry Warsaw <barry@python.org>
parents: 33477
diff changeset
144 if mo.group('invalid') is not None:
64818
71b95942c3a4 Issue #1686: Fix string.Template when overriding the pattern attribute.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 64501
diff changeset
145 return mo.group()
33773
ab09daac5691 Invalid patterns to substitute and safe_substitute would crash since pattern
Neal Norwitz <nnorwitz@gmail.com>
parents: 33588
diff changeset
146 raise ValueError('Unrecognized named group in pattern',
ab09daac5691 Invalid patterns to substitute and safe_substitute would crash since pattern
Neal Norwitz <nnorwitz@gmail.com>
parents: 33588
diff changeset
147 self.pattern)
33439
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
148 return self.pattern.sub(convert, self.template)
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
149
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
150
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
151
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
152 ########################################################################
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
153 # the Formatter class
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
154 # see PEP 3101 for details and purpose of this class
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
155
49734
b0fcb17f7efa Merged revisions 67154,67157-67159,67175-67176,67189,67224-67227,67234 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 43947
diff changeset
156 # The hard parts are reused from the C implementation. They're exposed as "_"
64501
Florent Xicluna <florent.xicluna@gmail.com>
parents: 63295
diff changeset
157 # prefixed methods of str.
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
158
65291
fd044cda97d8 #9418: first step of moving private string methods to _string module.
Georg Brandl <georg@python.org>
parents: 64818
diff changeset
159 # The overall parser is implemented in _string.formatter_parser.
fd044cda97d8 #9418: first step of moving private string methods to _string module.
Georg Brandl <georg@python.org>
parents: 64818
diff changeset
160 # The field name parser is implemented in _string.formatter_field_name_split
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
161
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
162 class Formatter:
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
163 def format(self, format_string, *args, **kwargs):
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
164 return self.vformat(format_string, args, kwargs)
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
165
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
166 def vformat(self, format_string, args, kwargs):
43112
90c715bc7d30 Changed signature of string.Formatter.get_field, per suggestion by
Eric Smith <eric@trueblade.com>
parents: 43020
diff changeset
167 used_args = set()
43241
e946073dee38 Changed some ValueError's to KeyError and IndexError.
Eric Smith <eric@trueblade.com>
parents: 43200
diff changeset
168 result = self._vformat(format_string, args, kwargs, used_args, 2)
e946073dee38 Changed some ValueError's to KeyError and IndexError.
Eric Smith <eric@trueblade.com>
parents: 43200
diff changeset
169 self.check_unused_args(used_args, args, kwargs)
e946073dee38 Changed some ValueError's to KeyError and IndexError.
Eric Smith <eric@trueblade.com>
parents: 43200
diff changeset
170 return result
e946073dee38 Changed some ValueError's to KeyError and IndexError.
Eric Smith <eric@trueblade.com>
parents: 43200
diff changeset
171
e946073dee38 Changed some ValueError's to KeyError and IndexError.
Eric Smith <eric@trueblade.com>
parents: 43200
diff changeset
172 def _vformat(self, format_string, args, kwargs, used_args, recursion_depth):
e946073dee38 Changed some ValueError's to KeyError and IndexError.
Eric Smith <eric@trueblade.com>
parents: 43200
diff changeset
173 if recursion_depth < 0:
e946073dee38 Changed some ValueError's to KeyError and IndexError.
Eric Smith <eric@trueblade.com>
parents: 43200
diff changeset
174 raise ValueError('Max string recursion exceeded')
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
175 result = []
42948
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
176 for literal_text, field_name, format_spec, conversion in \
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
177 self.parse(format_string):
42969
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
178
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
179 # output the literal text
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
180 if literal_text:
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
181 result.append(literal_text)
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
182
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
183 # if there's a field, output it
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
184 if field_name is not None:
42948
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
185 # this is some markup, find the object and do
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
186 # the formatting
42875
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42817
diff changeset
187
42948
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
188 # given the field_name, find the object it references
43112
90c715bc7d30 Changed signature of string.Formatter.get_field, per suggestion by
Eric Smith <eric@trueblade.com>
parents: 43020
diff changeset
189 # and the argument it came from
43200
463b341a9d63 Removed used_args param from string.Formatter.get_field. It was left in by mistake from an earlier edit.
Eric Smith <eric@trueblade.com>
parents: 43144
diff changeset
190 obj, arg_used = self.get_field(field_name, args, kwargs)
43112
90c715bc7d30 Changed signature of string.Formatter.get_field, per suggestion by
Eric Smith <eric@trueblade.com>
parents: 43020
diff changeset
191 used_args.add(arg_used)
42875
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42817
diff changeset
192
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42817
diff changeset
193 # do any conversion on the resulting object
42948
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
194 obj = self.convert_field(obj, conversion)
42875
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42817
diff changeset
195
43241
e946073dee38 Changed some ValueError's to KeyError and IndexError.
Eric Smith <eric@trueblade.com>
parents: 43200
diff changeset
196 # expand the format spec, if needed
e946073dee38 Changed some ValueError's to KeyError and IndexError.
Eric Smith <eric@trueblade.com>
parents: 43200
diff changeset
197 format_spec = self._vformat(format_spec, args, kwargs,
e946073dee38 Changed some ValueError's to KeyError and IndexError.
Eric Smith <eric@trueblade.com>
parents: 43200
diff changeset
198 used_args, recursion_depth-1)
e946073dee38 Changed some ValueError's to KeyError and IndexError.
Eric Smith <eric@trueblade.com>
parents: 43200
diff changeset
199
42875
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42817
diff changeset
200 # format the object and append to the result
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42817
diff changeset
201 result.append(self.format_field(obj, format_spec))
42969
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
202
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
203 return ''.join(result)
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
204
42948
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
205
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
206 def get_value(self, key, args, kwargs):
42875
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42817
diff changeset
207 if isinstance(key, int):
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42817
diff changeset
208 return args[key]
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42817
diff changeset
209 else:
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42817
diff changeset
210 return kwargs[key]
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
211
42948
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
212
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
213 def check_unused_args(self, used_args, args, kwargs):
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
214 pass
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
215
42948
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
216
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
217 def format_field(self, value, format_spec):
42875
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42817
diff changeset
218 return format(value, format_spec)
42948
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
219
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
220
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
221 def convert_field(self, value, conversion):
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
222 # do any conversion on the resulting object
78658
24b449a77e88 #13579: teach string.Formatter about 'a'.
R David Murray <rdmurray@bitdance.com>
parents: 68257
diff changeset
223 if conversion is None:
24b449a77e88 #13579: teach string.Formatter about 'a'.
R David Murray <rdmurray@bitdance.com>
parents: 68257
diff changeset
224 return value
42948
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
225 elif conversion == 's':
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
226 return str(value)
78658
24b449a77e88 #13579: teach string.Formatter about 'a'.
R David Murray <rdmurray@bitdance.com>
parents: 68257
diff changeset
227 elif conversion == 'r':
24b449a77e88 #13579: teach string.Formatter about 'a'.
R David Murray <rdmurray@bitdance.com>
parents: 68257
diff changeset
228 return repr(value)
24b449a77e88 #13579: teach string.Formatter about 'a'.
R David Murray <rdmurray@bitdance.com>
parents: 68257
diff changeset
229 elif conversion == 'a':
24b449a77e88 #13579: teach string.Formatter about 'a'.
R David Murray <rdmurray@bitdance.com>
parents: 68257
diff changeset
230 return ascii(value)
64501
Florent Xicluna <florent.xicluna@gmail.com>
parents: 63295
diff changeset
231 raise ValueError("Unknown conversion specifier {0!s}".format(conversion))
42948
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
232
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
233
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
234 # returns an iterable that contains tuples of the form:
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
235 # (literal_text, field_name, format_spec, conversion)
42969
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
236 # literal_text can be zero length
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
237 # field_name can be None, in which case there's no
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
238 # object to format and output
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
239 # if field_name is not None, it is looked up, formatted
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
240 # with format_spec and conversion and then used
42948
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
241 def parse(self, format_string):
65291
fd044cda97d8 #9418: first step of moving private string methods to _string module.
Georg Brandl <georg@python.org>
parents: 64818
diff changeset
242 return _string.formatter_parser(format_string)
42948
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
243
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
244
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
245 # given a field_name, find the object it references.
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
246 # field_name: the field being looked up, e.g. "0.name"
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
247 # or "lookup[3]"
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
248 # used_args: a set of which args have been used
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
249 # args, kwargs: as passed in to vformat
43200
463b341a9d63 Removed used_args param from string.Formatter.get_field. It was left in by mistake from an earlier edit.
Eric Smith <eric@trueblade.com>
parents: 43144
diff changeset
250 def get_field(self, field_name, args, kwargs):
65291
fd044cda97d8 #9418: first step of moving private string methods to _string module.
Georg Brandl <georg@python.org>
parents: 64818
diff changeset
251 first, rest = _string.formatter_field_name_split(field_name)
42948
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
252
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
253 obj = self.get_value(first, args, kwargs)
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
254
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
255 # loop through the rest of the field_name, doing
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
256 # getattr or getitem as needed
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
257 for is_attr, i in rest:
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
258 if is_attr:
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
259 obj = getattr(obj, i)
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
260 else:
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
261 obj = obj[i]
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
262
43112
90c715bc7d30 Changed signature of string.Formatter.get_field, per suggestion by
Eric Smith <eric@trueblade.com>
parents: 43020
diff changeset
263 return obj, first