using generators with format strings

Hans Nowak hans at zephyrfalcon.org
Thu Jul 22 03:37:37 CEST 2004


marduk wrote:
> On Wed, 21 Jul 2004 16:38:55 -0400, brianc wrote:
> 
> 
>>List comprehension is a beautiful thing.
>>
>>x = "Hello, %s, this is a %s with %s and %s on top of %s" %
>>tuple([myvalues() for i in xrange(5)])
>>
>>You could even make the xrange argument dependent upon the
>>number of "%s" in the string. 
> 
> 
> Well, that has two problems:
> 
> a) the tuple is a list of generators of strings, not strings
> b) I was hoping I would not have to count all the "%s"s in the string

An interesting problem.  Apparently the % string interpolation operator checks 
the length of the tuple, so you cannot use an object (generator or otherwise) 
to generate/pass values "on demand".  So a different approach is in order.  The 
following code seems to work, although I wouldn't recommend it for production code:

--->8---
def integers(n):
     while 1:
         yield n
         n = n + 1

i = integers(0)

def format_with_generator(formatstr, gen):
     arguments = []
     while 1:
         try:
             s = formatstr % tuple(arguments)
         except TypeError, e:
             if e.args[0] == 'not enough arguments for format string':
                 item = gen.next()
                 arguments.append(item)
             else:
                 raise
         else:
             return s

fs = "Gimme a %s and a %s and a %s!"
print format_with_generator(fs, i)
print format_with_generator(fs, i)
--->8---

Hope this helps!

--
Hans Nowak (hans at zephyrfalcon.org)
http://zephyrfalcon.org/




More information about the Python-list mailing list