Making string-formatting smarter by handling generators?
python.list at tim.thechases.com
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