>> 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 >> """ > > Note that your problem has nothing to do with map itself. String > interpolation using % requires either many individual arguments, or a > single *tuple* argument. A list is printed as itself. > > py> "%s, %s" % ['hello', 'world'] > Traceback (most recent call last): > File "<stdin>", line 1, in <module>
I hadn't ever encountered this, as I've always used tuples because that's what all the example code used. I thought it had to do with indexability/iteration, rather than tuple'ness. Apparently, my false assumption. People apparently use tuples because that's the requirement, not just because it reads well or is better/faster/smarter than list notation. :) > TypeError: not enough arguments for format string > py> "%s" % ['hello', 'world'] > "['hello', 'world']" > > So the answer is always use tuple(...) as others pointed. I'll adjust my thinking on the matter, and mentally deprecate map() as well. Thanks to all who responded. -tkc -- http://mail.python.org/mailman/listinfo/python-list