a simple def how-to

Andreas Waldenburger usenot at geekmail.INVALID
Sun Mar 7 10:23:48 EST 2010


On Sun, 7 Mar 2010 07:05:26 -0800 (PST) vsoler
<vicente.soler at gmail.com> wrote:

> Hello,
> 
> My script starts like this:
> 
> book=readFromExcelRange('book')
> house=readFromExcelRange('house')
> table=readFromExcelRange('table')
> read=readFromExcelRange('read')
> ...
> 
> But I would like to have something equivalent, like...
> 
> ranges=['book','house','table','read']
> for i in ranges:
>     var[i]=readFromExcelRange(i)
> 
> which does not work. I assume I should be using globals() instead of
> var, but I do not know how to write my script.
> 
> Can anybody help?

One additional line, and it works (all the following code is untested,
I might have goofed it up somewhere, but you get the idea):

ranges=['book','house','table','read']
var = {}
for i in ranges:
    var[i]=readFromExcelRange(i)

Or, more succinctly:

var = dict((i, readFromExcelRange(i)) for i in ranges)

although that looks a bit crowded. Perhaps

rd = readFromExcelRange
var = dict((i, rd(i)) for i in ranges)

looks better, but not by much, IMO.

In Python 3 you can also just say

var = {i:readFromExcelRange(i) for i in ranges}

(I think. I don't have Python 3.) This looks comparatively neat,
because there are no nesting parens.


And just in case you think it's a good idea to meddle with globals and
create actual "variables": it's not. You absolutely want dictionaries
here. It's basically a bad idea to create names *implicitly* that
you're going to use *explicitly*. (That is, it is in Python anyway,
because it does not provide a clean and clear way of doing this. Other
languages might provide that sort of thing, and it might be awesome,
but in Python, no sir.)

/W

-- 
INVALID? DE!




More information about the Python-list mailing list