Making string-formatting smarter by handling generators?

Tim Chase python.list at
Wed Feb 27 21:41:32 CET 2008

>> 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.


More information about the Python-list mailing list