call to function by text variable

Cameron Laird claird at lairds.us
Mon Mar 26 11:33:44 EDT 2007


In article <mailman.5612.1174891359.32031.python-list at python.org>,
Steve Holden  <steve at holdenweb.com> wrote:
>Cameron Laird wrote:
>> In article <mailman.5604.1174863631.32031.python-list at python.org>,
>> Jan Schilleman <jan.schilleman at xs4all.nl> wrote:
>>> Hi,
>>>
>>> try this:
>>> func = getattr(operations, ["Replace", "ChangeCase", "Move"][n])
>>>
>>> HTH,
>>> Jan
>>>
>>> "ianaré" <ianare at gmail.com> schreef in bericht 
>>> news:1174862186.134912.117270 at p15g2000hsd.googlegroups.com...
>>>> yeah the subject doesn't really make sense does it?
>>>>
>>>> anyway want I want to do is this:
>>>> if n == 1:
>>>>
>>>>    self.operations.insert(pos, operations.Replace.Panel(self, main))
>> 			.
>> 			.
>> 			.
>> I think you meant "...[n - 1]" rather than "...[n]".
>> 
>> I'm a tiny bit surprised no one has organized this in terms
>> of a dictionary.  I don't know, of course, how robust is the
>> characterization of n as a small integer.  Maybe
>> 
>>   lookup_table = {
>>       0: "Replace",
>>       1: "ChangeCase",
>>       2: "Move"}
>> 
>> captures the sentiment; maybe something else does it better.
>> 
>Surely for this requirement the *only* advantage of a dictionary over a 
>list is its ability to index with arbitrary values and thereby avoid the 
>need to use [n-1]. Wouldn't it therefore be less perverse to use
>
>     lookup_table = {
>       1: "Replace",
>       2: "ChangeCase",
>       3: "Move"}
>
>Of course the dictionary would be a big win if the integer choice values 
>weren't a linear sequence. Otherwise using a list with a fixed offset is 
>likely to be quicker.
			.
			.
			.
Ugh.  Yes.

Maybe your question, "Wouldn't it therefore be less perverse ...?",
was rhetorical.  I feel obliged to answer in public, though, rather
than sending the private e-mail I originally wrote, because I want
to leave no doubt in the minds of readers of this thread:  what I
wrote was wrong.  Yes, Steve's lookup_table binding (or assignment)
was what I had in mind all along, and entirely superior to what I
mistakenly wrote; my thanks to him.  He also elaborated the correct
detail:  "if the integer choice values weren't a linear sequence",
or if they weren't even integers, or ..., then the dictionary
suddenly becomes much more compelling.

Incidentally, a fair amount of Python code that looks like

    if n == 1:
	...
    elif n == 2:
	...

turns out, in my experience, to have been inherited from some other
language in such a way that it turns out n is not even the most 
natural or expressive determinant.  A fully idiomatic rewriting will
have a table where the keys are more-humanly-readable strings, rather
than small integers.



More information about the Python-list mailing list