annotate Lib/string.py @ 43016:950848117397

Revert r57685 (weird merge result).
author Collin Winter <collinw@gmail.com>
date Wed, 29 Aug 2007 23:41:34 +0000
parents 88bb459fdbf5
children 907a45df1295
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
33be7d5d498b Added doc string, provided by Charles Waldman (with some reformatting
Guido van Rossum <guido@python.org>
parents: 6821
diff changeset
5 whitespace -- a string containing all characters considered whitespace
33be7d5d498b Added doc string, provided by Charles Waldman (with some reformatting
Guido van Rossum <guido@python.org>
parents: 6821
diff changeset
6 lowercase -- a string containing all characters considered lowercase letters
33be7d5d498b Added doc string, provided by Charles Waldman (with some reformatting
Guido van Rossum <guido@python.org>
parents: 6821
diff changeset
7 uppercase -- a string containing all characters considered uppercase letters
33be7d5d498b Added doc string, provided by Charles Waldman (with some reformatting
Guido van Rossum <guido@python.org>
parents: 6821
diff changeset
8 letters -- a string containing all characters considered letters
33be7d5d498b Added doc string, provided by Charles Waldman (with some reformatting
Guido van Rossum <guido@python.org>
parents: 6821
diff changeset
9 digits -- a string containing all characters considered decimal digits
33be7d5d498b Added doc string, provided by Charles Waldman (with some reformatting
Guido van Rossum <guido@python.org>
parents: 6821
diff changeset
10 hexdigits -- a string containing all characters considered hexadecimal digits
33be7d5d498b Added doc string, provided by Charles Waldman (with some reformatting
Guido van Rossum <guido@python.org>
parents: 6821
diff changeset
11 octdigits -- a string containing all characters considered octal digits
14670
8db8606d84ea Fix serious typo!
Fred Drake <fdrake@acm.org>
parents: 14665
diff changeset
12 punctuation -- a string containing all characters considered punctuation
8db8606d84ea Fix serious typo!
Fred Drake <fdrake@acm.org>
parents: 14665
diff changeset
13 printable -- a string containing all 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
5
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 # 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
18 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
19 ascii_lowercase = 'abcdefghijklmnopqrstuvwxyz'
b623777f22b0 Remove string.{letters,lowercase,uppercase}.
Martin v. Löwis <martin@v.loewis.de>
parents: 42142
diff changeset
20 ascii_uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
18776
22b2f4b436af Added the constants ascii_letters, ascii_lowercase, and ascii_uppercase
Fred Drake <fdrake@acm.org>
parents: 16657
diff changeset
21 ascii_letters = ascii_lowercase + ascii_uppercase
5
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 digits = '0123456789'
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 hexdigits = digits + 'abcdef' + 'ABCDEF'
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 octdigits = '01234567'
15872
3685ef2a55a4 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15610
diff changeset
25 punctuation = """!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"""
42585
b623777f22b0 Remove string.{letters,lowercase,uppercase}.
Martin v. Löwis <martin@v.loewis.de>
parents: 42142
diff changeset
26 printable = digits + ascii_letters + punctuation + whitespace
5
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 # Case conversion helpers
25786
af20aeaaa982 Convert empty string literal to string. Speed up creation of idmap.
Martin v. Löwis <martin@v.loewis.de>
parents: 23645
diff changeset
29 # Use str to convert Unicode literal in case of -U
42142
a53e48be6df9 Merged revisions 56125-56153 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41749
diff changeset
30 _idmap = str('').join(chr(c) for c in range(256))
5
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31
33257
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
32 # 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
33
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
34 # 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
35 def capwords(s, sep=None):
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
36 """capwords(s, [sep]) -> string
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
37
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
38 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
39 word using capitalize, and join the capitalized words using
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
40 join. Note that this replaces runs of whitespace characters by
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
41 a single space.
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 """
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
44 return (sep or ' ').join([x.capitalize() for x in s.split(sep)])
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
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
47 # Construct a translation string
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
48 _idmapL = None
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
49 def maketrans(fromstr, tostr):
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
50 """maketrans(frm, to) -> string
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
51
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
52 Return a translation table (a string of 256 bytes long)
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
53 suitable for use in string.translate. The strings frm and to
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
54 must be of the same length.
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
55
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
56 """
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
57 if len(fromstr) != len(tostr):
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
58 raise ValueError, "maketrans arguments must have same length"
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
59 global _idmapL
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
60 if not _idmapL:
42142
a53e48be6df9 Merged revisions 56125-56153 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41749
diff changeset
61 _idmapL = list(_idmap)
33257
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
62 L = _idmapL[:]
42142
a53e48be6df9 Merged revisions 56125-56153 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41749
diff changeset
63 for i, c in enumerate(fromstr):
a53e48be6df9 Merged revisions 56125-56153 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41749
diff changeset
64 L[ord(c)] = tostr[i]
33257
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
65 return ''.join(L)
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
66
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
67
34127
4dcd78f3b5d1 Remove outdated references to the regsub module.
Raymond Hettinger <python@rcn.com>
parents: 33871
diff changeset
68
33278
2b136441035c Minor improvements to the template code.
Raymond Hettinger <python@rcn.com>
parents: 33257
diff changeset
69 ####################################################################
33257
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
70 import re as _re
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
71
33471
41dbee5ed295 Accepted Raymond's patch to combine mapping and keyword arguments, with slight
Barry Warsaw <barry@python.org>
parents: 33450
diff changeset
72 class _multimap:
41dbee5ed295 Accepted Raymond's patch to combine mapping and keyword arguments, with slight
Barry Warsaw <barry@python.org>
parents: 33450
diff changeset
73 """Helper class for combining multiple mappings.
41dbee5ed295 Accepted Raymond's patch to combine mapping and keyword arguments, with slight
Barry Warsaw <barry@python.org>
parents: 33450
diff changeset
74
41dbee5ed295 Accepted Raymond's patch to combine mapping and keyword arguments, with slight
Barry Warsaw <barry@python.org>
parents: 33450
diff changeset
75 Used by .{safe_,}substitute() to combine the mapping and keyword
41dbee5ed295 Accepted Raymond's patch to combine mapping and keyword arguments, with slight
Barry Warsaw <barry@python.org>
parents: 33450
diff changeset
76 arguments.
41dbee5ed295 Accepted Raymond's patch to combine mapping and keyword arguments, with slight
Barry Warsaw <barry@python.org>
parents: 33450
diff changeset
77 """
41dbee5ed295 Accepted Raymond's patch to combine mapping and keyword arguments, with slight
Barry Warsaw <barry@python.org>
parents: 33450
diff changeset
78 def __init__(self, primary, secondary):
41dbee5ed295 Accepted Raymond's patch to combine mapping and keyword arguments, with slight
Barry Warsaw <barry@python.org>
parents: 33450
diff changeset
79 self._primary = primary
41dbee5ed295 Accepted Raymond's patch to combine mapping and keyword arguments, with slight
Barry Warsaw <barry@python.org>
parents: 33450
diff changeset
80 self._secondary = secondary
41dbee5ed295 Accepted Raymond's patch to combine mapping and keyword arguments, with slight
Barry Warsaw <barry@python.org>
parents: 33450
diff changeset
81
41dbee5ed295 Accepted Raymond's patch to combine mapping and keyword arguments, with slight
Barry Warsaw <barry@python.org>
parents: 33450
diff changeset
82 def __getitem__(self, key):
41dbee5ed295 Accepted Raymond's patch to combine mapping and keyword arguments, with slight
Barry Warsaw <barry@python.org>
parents: 33450
diff changeset
83 try:
41dbee5ed295 Accepted Raymond's patch to combine mapping and keyword arguments, with slight
Barry Warsaw <barry@python.org>
parents: 33450
diff changeset
84 return self._primary[key]
41dbee5ed295 Accepted Raymond's patch to combine mapping and keyword arguments, with slight
Barry Warsaw <barry@python.org>
parents: 33450
diff changeset
85 except KeyError:
41dbee5ed295 Accepted Raymond's patch to combine mapping and keyword arguments, with slight
Barry Warsaw <barry@python.org>
parents: 33450
diff changeset
86 return self._secondary[key]
41dbee5ed295 Accepted Raymond's patch to combine mapping and keyword arguments, with slight
Barry Warsaw <barry@python.org>
parents: 33450
diff changeset
87
41dbee5ed295 Accepted Raymond's patch to combine mapping and keyword arguments, with slight
Barry Warsaw <barry@python.org>
parents: 33450
diff changeset
88
33439
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
89 class _TemplateMetaclass(type):
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
90 pattern = r"""
33588
68d11e439a0b Make the regex pattern easier to read, understand, and modify
Raymond Hettinger <python@rcn.com>
parents: 33505
diff changeset
91 %(delim)s(?:
68d11e439a0b Make the regex pattern easier to read, understand, and modify
Raymond Hettinger <python@rcn.com>
parents: 33505
diff changeset
92 (?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
93 (?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
94 {(?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
95 (?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
96 )
33439
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
97 """
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
98
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
99 def __init__(cls, name, bases, dct):
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
100 super(_TemplateMetaclass, cls).__init__(name, bases, dct)
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
101 if 'pattern' in dct:
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
102 pattern = cls.pattern
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
103 else:
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
104 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
105 'delim' : _re.escape(cls.delimiter),
33439
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
106 'id' : cls.idpattern,
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
107 }
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
108 cls.pattern = _re.compile(pattern, _re.IGNORECASE | _re.VERBOSE)
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
109
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
110
41226
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40644
diff changeset
111 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
112 """A string class for supporting $-substitutions."""
33439
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
113
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
114 delimiter = '$'
33439
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
115 idpattern = r'[_a-z][_a-z0-9]*'
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
116
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
117 def __init__(self, template):
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
118 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
119
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
120 # 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
121
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
122 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
123 i = mo.start('invalid')
33439
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
124 lines = self.template[:i].splitlines(True)
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
125 if not lines:
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
126 colno = 1
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
127 lineno = 1
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
128 else:
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
129 colno = i - len(''.join(lines[:-1]))
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
130 lineno = len(lines)
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
131 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
132 (lineno, colno))
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
133
33477
a220073536d6 substitute(), safe_substitute(): Paul Moore provides a better hack for dealing
Barry Warsaw <barry@python.org>
parents: 33471
diff changeset
134 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
135 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
136 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
137 if not args:
a220073536d6 substitute(), safe_substitute(): Paul Moore provides a better hack for dealing
Barry Warsaw <barry@python.org>
parents: 33471
diff changeset
138 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
139 elif kws:
33477
a220073536d6 substitute(), safe_substitute(): Paul Moore provides a better hack for dealing
Barry Warsaw <barry@python.org>
parents: 33471
diff changeset
140 mapping = _multimap(kws, args[0])
a220073536d6 substitute(), safe_substitute(): Paul Moore provides a better hack for dealing
Barry Warsaw <barry@python.org>
parents: 33471
diff changeset
141 else:
a220073536d6 substitute(), safe_substitute(): Paul Moore provides a better hack for dealing
Barry Warsaw <barry@python.org>
parents: 33471
diff changeset
142 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
143 # 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
144 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
145 # 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
146 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
147 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
148 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
149 # 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
150 # 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
151 return '%s' % (val,)
33278
2b136441035c Minor improvements to the template code.
Raymond Hettinger <python@rcn.com>
parents: 33257
diff changeset
152 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
153 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
154 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
155 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
156 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
157 self.pattern)
33439
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
158 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
159
33477
a220073536d6 substitute(), safe_substitute(): Paul Moore provides a better hack for dealing
Barry Warsaw <barry@python.org>
parents: 33471
diff changeset
160 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
161 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
162 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
163 if not args:
a220073536d6 substitute(), safe_substitute(): Paul Moore provides a better hack for dealing
Barry Warsaw <barry@python.org>
parents: 33471
diff changeset
164 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
165 elif kws:
33477
a220073536d6 substitute(), safe_substitute(): Paul Moore provides a better hack for dealing
Barry Warsaw <barry@python.org>
parents: 33471
diff changeset
166 mapping = _multimap(kws, args[0])
a220073536d6 substitute(), safe_substitute(): Paul Moore provides a better hack for dealing
Barry Warsaw <barry@python.org>
parents: 33471
diff changeset
167 else:
a220073536d6 substitute(), safe_substitute(): Paul Moore provides a better hack for dealing
Barry Warsaw <barry@python.org>
parents: 33471
diff changeset
168 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
169 # 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
170 def convert(mo):
33278
2b136441035c Minor improvements to the template code.
Raymond Hettinger <python@rcn.com>
parents: 33257
diff changeset
171 named = mo.group('named')
33257
11a4fbc88a80 PEP 292 classes Template and SafeTemplate are added to the string module.
Barry Warsaw <barry@python.org>
parents: 31199
diff changeset
172 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
173 try:
33439
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
174 # 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
175 # 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
176 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
177 except KeyError:
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
178 return self.delimiter + named
33278
2b136441035c Minor improvements to the template code.
Raymond Hettinger <python@rcn.com>
parents: 33257
diff changeset
179 braced = mo.group('braced')
33482
2623668c5ff5 Fix small bugs in Template code.
Raymond Hettinger <python@rcn.com>
parents: 33479
diff changeset
180 if braced is not None:
2623668c5ff5 Fix small bugs in Template code.
Raymond Hettinger <python@rcn.com>
parents: 33479
diff changeset
181 try:
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 34127
diff changeset
182 return '%s' % (mapping[braced],)
33482
2623668c5ff5 Fix small bugs in Template code.
Raymond Hettinger <python@rcn.com>
parents: 33479
diff changeset
183 except KeyError:
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
184 return self.delimiter + '{' + braced + '}'
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
185 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
186 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
187 if mo.group('invalid') is not None:
33871
5afa5277fcd9 SF patch #1056967, changes the semantics of Template.safe_substitute() to not
Barry Warsaw <barry@python.org>
parents: 33773
diff changeset
188 return self.delimiter
33773
ab09daac5691 Invalid patterns to substitute and safe_substitute would crash since pattern
Neal Norwitz <nnorwitz@gmail.com>
parents: 33588
diff changeset
189 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
190 self.pattern)
33439
629200d880ea Many updates to PEP 292 templates. Summary:
Barry Warsaw <barry@python.org>
parents: 33278
diff changeset
191 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
192
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
193
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
194
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
195 ########################################################################
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
196 # the Formatter class
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
197 # 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
198
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
199 # The hard parts are reused from the C implementation. They're
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
200 # exposed here via the sys module. sys was chosen because it's always
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
201 # available and doesn't have to be dynamically loaded.
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
202
42896
7bf8f2339ec6 PEP 3101: Removed _formatter_xxx routines from sysmodule, and made them unicode methods instead (per GvR suggestion).
Eric Smith <eric@trueblade.com>
parents: 42875
diff changeset
203 # The overall parser is implemented in str._formatter_parser.
7bf8f2339ec6 PEP 3101: Removed _formatter_xxx routines from sysmodule, and made them unicode methods instead (per GvR suggestion).
Eric Smith <eric@trueblade.com>
parents: 42875
diff changeset
204 # The field name parser is implemented in str._formatter_field_name_split
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
205
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
206 class Formatter:
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
207 def format(self, format_string, *args, **kwargs):
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
208 return self.vformat(format_string, args, kwargs)
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
209
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
210 def vformat(self, format_string, args, kwargs):
42948
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
211 used_args = self.get_empty_used_args()
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
212 result = []
42948
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
213 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
214 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
215
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
216 # output the literal text
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
217 if literal_text:
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
218 result.append(literal_text)
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
219
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
220 # 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
221 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
222 # 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
223 # 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
224
42948
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
225 # given the 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
226 obj = self.get_field(field_name, args, kwargs, used_args)
42875
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42817
diff changeset
227
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42817
diff changeset
228 # 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
229 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
230
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42817
diff changeset
231 # 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
232 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
233
42875
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42817
diff changeset
234 self.check_unused_args(used_args, args, kwargs)
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
235 return ''.join(result)
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
236
42948
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
237
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
238 def get_empty_used_args(self):
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
239 return set()
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
240
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
241
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
242 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
243 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
244 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
245 else:
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42817
diff changeset
246 return kwargs[key]
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
247
42948
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
248
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
249 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
250 pass
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
251
42948
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
252
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42585
diff changeset
253 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
254 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
255
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
256
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
257 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
258 # do any conversion on the resulting object
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
259 if conversion == 'r':
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
260 return repr(value)
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
261 elif conversion == 's':
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
262 return str(value)
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
263 else:
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
264 assert conversion is None
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
265 return value
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
266
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
267
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
268 # 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
269 # (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
270 # 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
271 # 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
272 # 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
273 # 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
274 # 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
275 def parse(self, format_string):
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
276 return format_string._formatter_parser()
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
277
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
278
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
279 # 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
280 # 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
281 # or "lookup[3]"
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
282 # 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
283 # args, kwargs: as passed in to vformat
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
284 # also, mark it as used in 'used_args'
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
285 def get_field(self, field_name, args, kwargs, used_args):
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
286 first, rest = field_name._formatter_field_name_split()
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
287
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
288 used_args.add(first)
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
289 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
290
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
291 # 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
292 # 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
293 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
294 if is_attr:
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
295 obj = getattr(obj, i)
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
296 else:
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
297 obj = obj[i]
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
298
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42896
diff changeset
299 return obj