[Tutor] What/Why this Cookbook recipe?

Andrei project5 at redrival.net
Tue Mar 6 20:43:34 CET 2007

Dick Moores wrote:
> I've been trying to learn new things from the Cookbook, but here's a 
> recipe the utility of which I don't understand at all. Why interpolation 
> (whether the ruby way or not)? Maybe a better example than the couple 
> given would help me? 

Normal string formatting in Python works by including in the string a 
sort of type definition (e.g. '%s' means 'insert a string here', '%d' is 
  'insert an integer here', etc.). You have to supply the arguments 
after the format string, in a tuple. For example:

   >>> print 'Name: %s\nAge: %d' % (username, userage)
   Name: John Doe
   Age: 39

With the recipe provided, you can put the variables you want inserted 
directly in the format string - it's no longer necessary to append them 
in a tuple. So for the example above, it would become:

   >>> print interp('Name: #{username}\nAge: #{userage}')

As you see, it's slightly shorter and more ad-hoc - or it would be, if 
it were built into the language and you didn't have to call the interp 
function. It also has the advantage that you don't have to make sure you 
provide the right number (and type) of arguments in the tuple - it's 
easy to e.g. decide to no longer print the age and forget to update the 
tuple, like this:

   >>> print 'Name: %s' % (username, userage)
   Traceback <snip>
   TypeError: not all arguments converted during string formatting

That's a particularly annoying source of errors that isn't caught even 
in (most? all?) machine-code compiled languages. The opposite may also 
occur, that you e.g. decide to also print a phone number, include that 
in the format string, yet forget to include it in the tuple as well.

The recipe has some disadvantages:

- you have put your variable names in a string. This is bad practice - 
if you rename variables, it's easy to overlook them in strings.

- format strings can be used to translate an application. You just give 
the translator your 'Name: %s' string and he gives you 'Borkbork: %s' or 
whatever. The translation doesn't need to be modified if you decide to 
make a user class and get rid of the username and userage vars.

- format strings give you more control, so you can e.g. specify how many 
digits a float should have when formatted.



Mail address in header catches spam. Real contact info:
''.join([''.join(s) for s in zip(
"poet at aao.l pmfe!Pes ontuei ulcpss  edtels,s hr' one oC.",
"rjc5wndon.Sa-re laed o s npbi ot.Ira h it oteesn edt C")])

More information about the Tutor mailing list