call to function by text variable

  • Thread starter =?iso-8859-1?B?aWFuYXLp?=
  • Start date
?

=?iso-8859-1?B?aWFuYXLp?=

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))

elif n == 2:

self.operations.insert(pos, operations.ChangeCase.Panel(self,
main))

elif n == 3:

self.operations.insert(pos, operations.Move.Panel(self, main))

As you can see all the different functions have the same variables, so
it would be easier if I could just make a list and use that.

like this:


list = ["Replace", "ChangeCase", "Move"]
textVariable = list[n]
self.operations.insert(pos, operations.[textVariable].Panel(self,
main))

Is something sort of like that possible?


TIA
 
?

=?ISO-8859-2?Q?Wojciech_Mu=B3a?=

ianaré said:
like this:


list = ["Replace", "ChangeCase", "Move"]
textVariable = list[n]
self.operations.insert(pos, operations.[textVariable].Panel(self,
main))

Is something sort of like that possible?

Yes:

self.operations.insert(
pos,
getattr(operations, textVariable).Panel(self.main)
)
 
S

Steve Holden

ianaré said:
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))

elif n == 2:

self.operations.insert(pos, operations.ChangeCase.Panel(self,
main))

elif n == 3:

self.operations.insert(pos, operations.Move.Panel(self, main))

As you can see all the different functions have the same variables, so
it would be easier if I could just make a list and use that.

like this:


list = ["Replace", "ChangeCase", "Move"]
textVariable = list[n]
self.operations.insert(pos, operations.[textVariable].Panel(self,
main))

Is something sort of like that possible?
Indeed. You don't need to use textual names (though for that you can
investigate "getattr()) - the following, naturally, is untested:

ops = [operations.Replace,
operations.ChangeCase,
operations.Move
]
self.operations.insert(pos, ops[n-1].Panel(self, main)

regards
Steve
 
S

Steve Holden

ianaré said:
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))

elif n == 2:

self.operations.insert(pos, operations.ChangeCase.Panel(self,
main))

elif n == 3:

self.operations.insert(pos, operations.Move.Panel(self, main))

As you can see all the different functions have the same variables, so
it would be easier if I could just make a list and use that.

like this:


list = ["Replace", "ChangeCase", "Move"]
textVariable = list[n]
self.operations.insert(pos, operations.[textVariable].Panel(self,
main))

Is something sort of like that possible?
Indeed. You don't need to use textual names (though for that you can
investigate "getattr()) - the following, naturally, is untested:

ops = [operations.Replace,
operations.ChangeCase,
operations.Move
]
self.operations.insert(pos, ops[n-1].Panel(self, main)

regards
Steve
 
G

Gabriel Genellina

list = ["Replace", "ChangeCase", "Move"]
textVariable = list[n]
self.operations.insert(pos, operations.[textVariable].Panel(self,
main))

Is something sort of like that possible?

Try getattr:
textVariable = "Replace"
getattr(operations, textVariable) == operations.Replace

Perhaps you could just store the result in your list; instead of
["Replace", "ChangeCase", "Move"], use [operations.Replace,
operations.ChangeCase, operations.Move] (it's not always applicable, of
course: maybe operations is reassigned, or those attributes mutate or
don't always exist...)
 
A

attn.steven.kuo

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))

elif n == 2:

self.operations.insert(pos, operations.ChangeCase.Panel(self,
main))

elif n == 3:

self.operations.insert(pos, operations.Move.Panel(self, main))

As you can see all the different functions have the same variables, so
it would be easier if I could just make a list and use that.


# Your list would contain the unbound functions:

unbound_funcs = [operations.Replace.Panel,
operations.Change.Panel,
operations.Move.Panel]


# and invocation would be:

self.operations.insert(pos, unbound_funcs[n - 1](self, main))
 
J

Jan Schilleman

Hi,

try this:
func = getattr(operations, ["Replace", "ChangeCase", "Move"][n])

HTH,
Jan
 
?

=?iso-8859-1?B?aWFuYXLp?=

Cool now I can run it through the translator.

ops = (_("Directory"), _("Replace"), _("ChangeCase"),
_("Move"), _("Swap"), _("Insert"), _("ChangeLength"))


self.operations.insert(pos, getattr(operations, ops[n]).Panel(self,
main))

Thanks guys!
 
?

=?iso-8859-1?B?aWFuYXLp?=

Cool now I can run it through the translator.

ops = (_("Directory"), _("Replace"), _("ChangeCase"),
_("Move"), _("Swap"), _("Insert"), _("ChangeLength"))

self.operations.insert(pos, getattr(operations, ops[n]).Panel(self,
main))

Thanks guys!

erm ... brainfart LOL. But now I can link it to the translated list.
 
C

Cameron Laird

Hi,

try this:
func = getattr(operations, ["Replace", "ChangeCase", "Move"][n])

HTH,
Jan

ianaré said:
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.
 
S

Steve Holden

Cameron said:
Hi,

try this:
func = getattr(operations, ["Replace", "ChangeCase", "Move"][n])

HTH,
Jan

ianaré said:
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.

regards
Steve
 
C

Cameron Laird

Cameron said:
Hi,

try this:
func = getattr(operations, ["Replace", "ChangeCase", "Move"][n])

HTH,
Jan

"ianaré" <[email protected]> schreef in bericht
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.
 
N

Nanjundi

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))

elif n == 2:

self.operations.insert(pos, operations.ChangeCase.Panel(self,
main))

elif n == 3:

self.operations.insert(pos, operations.Move.Panel(self, main))

As you can see all the different functions have the same variables, so
it would be easier if I could just make a list and use that.

like this:

list = ["Replace", "ChangeCase", "Move"]
textVariable = list[n]
self.operations.insert(pos, operations.[textVariable].Panel(self,
main))

try this one:
textVariable = list[n-1]
exec( "self.operations.insert(pos, operations.%s.Panel(self, main))" %
textVariable )

Not sure if this is an elegant/right way.
-N
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top