Re: mapping a string to an instancemethod

2008-08-01 Thread [EMAIL PROTECTED]
On Aug 1, 11:22 am, [EMAIL PROTECTED] wrote:
> The following bit of code will allow an instance member to
> be called by reference.  How can I map a string (e.g.
> "hello1" or "Foo.hello1" to a the instance member?
>
> class Foo:
> def hello1(self, p):
> print 'hello1', p
> def hello2(self, p):
> print 'hello2', p
> def dispatch(self, func, p):
> func(self,p)
>
> f=Foo()
> f.dispatch(Foo.hello1, 23)
> f.dispatch(Foo.hello1, 24)
>
> f.dispatch_as_string("hello1", 23)  ## this is what I want to do.
>
> Many TIA and apologies if this is a FAQ, I googled and couldn't
> find the answer.



Use getattr; add exception handling as needed.  E.g.,


class Foo(object):
def __init__(self):
self.fake = None
def hello1(self, p):
print 'hello1', p
def hello2(self, p):
print 'hello2', p
def dispatch_as_string(self, fname, p):
try:
inst_method=getattr(self, fname)
inst_method(p)
except AttributeError:
# maybe no such attribute
raise
except TypeError:
# maybe the attribute is not callable (wrong type)
raise


f = Foo()
f.dispatch_as_string('hello1', 12)

--
Hope this helps,
Steven

--
http://mail.python.org/mailman/listinfo/python-list


Re: mapping a string to an instancemethod

2008-08-01 Thread David C. Ullrich
In article <[EMAIL PROTECTED]>, [EMAIL PROTECTED] 
wrote:

> The following bit of code will allow an instance member to
> be called by reference.  How can I map a string (e.g.
> "hello1" or "Foo.hello1" to a the instance member?
> 
> class Foo:
> def hello1(self, p):
> print 'hello1', p
> def hello2(self, p):
> print 'hello2', p
> def dispatch(self, func, p):
> func(self,p)
> 
> f=Foo()
> f.dispatch(Foo.hello1, 23)
> f.dispatch(Foo.hello1, 24)
> 
> f.dispatch_as_string("hello1", 23)  ## this is what I want to do.

Do what's below. Then learn about *args to make a version that
works with variable numbers of parameters...

class Foo:
def hello1(self, p):
print 'hello1', p
def hello2(self, p):
print 'hello2', p
def dispatch(self, func, p):
func(self,p)
def dispatch_as_string(self, funcname, p):
getattr(self, funcname)(p)

f = Foo()
f.dispatch_as_string('hello1', 'world')

> Many TIA and apologies if this is a FAQ, I googled and couldn't
> find the answer.

-- 
David C. Ullrich
--
http://mail.python.org/mailman/listinfo/python-list