...On Wed, 20 Apr 2005 11:01:28 +0200, Peter Otten <[EMAIL PROTECTED]> wrote:
"%s %(x)s %(y)s" % D()
My experiments suggest that you can have a maximum of one unnamed argument in a mapping template - this unnamed value evaluates to the map itself
...
So under what circumstances is '%s this %(x)s not %% but %s' a valid format string?
Based on the above experiments, never.
I have wrapped up my current understanding in the following class:
>>> s = StringFormatInfo('%s %*.*d %*s') >>> s POSITIONAL Template: %s %*.*d %*s Arguments: ('s', 'width', 'precision', 'd', 'width', 's')
>>> s = StringFormatInfo('%(arg1)s %% %(arg2).*f %()s %s') >>> s MAPPING Template: %(arg1)s %% %(arg2).*f %()s %s Arguments: {'': 's', 'arg1': 's', 'arg2': 'f', None: 's'} >>>
class StringFormatInfo(object): parse_format = re.compile(r''' \% # placeholder (?:\((?P<name>[\w]*)\))? # 0 or 1 named groups (?P<conversion>[\#0\-\+]?) # 0 or 1 conversion flags (?P<width>[\d]* | \*) # optional minimum conversion width (?:.(?P<precision>[\d]+ | \*))? # optional precision (?P<lengthmodifier>[hlL]?) # optional length modifier (?P<type>[diouxXeEfFgGcrs]{1}) # conversion type - note %% omitted ''', re.VERBOSE )
"""Wraps a template string and provides information about the number and kinds of arguments that must be supplied. Call with % to apply the template to data"""
def __init__(self, template):
self.template = template
self.formats = formats = [m.groupdict() for m in self.parse_format.finditer(template)]
for format in formats: if format['name']: self.format_type = "MAPPING" self.format_names = dict((format['name'], format['type']) for format in formats) break else: self.format_type = "POSITIONAL" format_names = [] for format in formats: if format['width'] == '*': format_names.append('width') if format['precision'] == '*': format_names.append('precision') format_names.append(format['type']) self.format_names = tuple(format_names)
def __mod__(self, values): return self.template % values
def __repr__(self): return "%s Template: %s\nArguments: %s" % \ (self.format_type, self.template, self.format_names)
Michael
-- http://mail.python.org/mailman/listinfo/python-list