Bengt Richter wrote: > Parse might be a big word for > > >> def tupreq(fmt): return sum(map(lambda s:list(s).count('%'), > >> fmt.split('%%'))) > .. > >> tupreq('%s this %(x)s not %% but %s') > > (if it works in general ;-)
Which it doesn't: >>> def tupreq(fmt): return sum(map(lambda s:list(s).count('%'), fmt.split('%%'))) ... >>> fmt = "%*d" >>> fmt % ((1,) * tupreq(fmt)) Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: not enough arguments for format string > Or maybe clearer and faster: > > >>> def tupreq(fmt): return sum(1 for c in fmt.replace('%%','') if > >>> c=='%') > ... > >>> tupreq('%s this %(x)s not %% but %s') > 3 Mixed formats show some "interesting" behaviour: >>> "%s %(x)s" % (1,2) Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: format requires a mapping >>> class D: ... def __getitem__(self, key): ... return "D[%s]" % key ... >>> "%s %(x)s" % D() '<__main__.D instance at 0x402aaf2c> D[x]' >>> "%s %(x)s %s" % D() Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: not enough arguments for format string >>> "%s %(x)s %(y)s" % D() '<__main__.D instance at 0x402aad8c> D[x] D[y]' That is as far as I got. So under what circumstances is '%s this %(x)s not %% but %s' a valid format string? Peter -- http://mail.python.org/mailman/listinfo/python-list