[Tutor] What/Why this Cookbook recipe?

Luke Paireepinart rabidpoobear at gmail.com
Tue Mar 6 22:41:18 CET 2007


Andrei wrote:
> 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? 
>>     
> <snip>
>
> 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}')
>   
This accomplishes nearly the same thing:
 >>> d = {'username':'bob','userage':23}
 >>> print "Name: %(username)s, Age: %(userage)s" % d
Name: bob, Age: 23

The only difference is that the items have to be keys in the dictionary, 
instead of just variables,
but that's not necessarily a disadvantage.
But I understand they're trying to emulate it exactly as it operates in 
other languages.

>
> 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.
>   
This is a disadvantage in the dictionary method too, it seems.
> - 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.
>   
I don't see what you mean here.  The string in the example,

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


could be translated too.

> - format strings give you more control, so you can e.g. specify how many 
> digits a float should have when formatted.
The dictionary method would allow you this control.

HTH,
-Luke


More information about the Tutor mailing list