On Feb 27, 4:23 pm, Tim Chase <[EMAIL PROTECTED]> wrote: > Is there an easy way to make string-formatting smart enough to > gracefully handle iterators/generators? E.g. > > transform = lambda s: s.upper() > pair = ('hello', 'world') > print "%s, %s" % pair # works > print "%s, %s" % map(transform, pair) # fails > > with a """ > TypeError: not enough arguments for format string > """ > > I can force it by wrapping the results of my generator in a call > to tuple() or list()
(Are you using python 3.0 ? For python < 3, map returns a list) list() wouldn't work as % expects a tuple (otherwise it considers that only one argument is needed). The problem would arise with any non- tuple iterable, not just generators. See http://docs.python.org/lib/typesseq-strings.html > > print "%s, %s" % tuple(map(transform, pair)) > > but it feels a bit hackish to me. I think it is the way to do it though. > I find I hit it mostly with calls to map() where I want to apply > some transform (as above) to all the items in a list of > parameters such as > > "%s=%s&%s=%s" % map(urllib.quote, params) > > Any suggestions? (even if it's just "get over your hangup with > wrapping the results in list()/tuple()" :) get over your hangup with wrapping the results in tuple()! (not list() though, as explained above). Or you could always define def tmap(*args): return tuple(map(*args)) -- Arnaud -- http://mail.python.org/mailman/listinfo/python-list