how to get name of function from within function?

Steven Bethard steven.bethard at gmail.com
Sat Jun 4 03:16:02 EDT 2005


Christopher J. Bottaro wrote:
> I haven't tried it yet, but this is what I would do with __call():
> 
> function __call($name, $args)  {
>   $name .= 'IMPL';
>   try { $this->$name($args); }
>   except { # error handling; }
> }
> 
> function funcA()  {
>   # do something
> }
> 
> function funcBIMPL($a, $b)  {
>   # do something
> }
> 
> So I imagine it would work like this:
> 
> $obj = new MyClass();
> $obj->funcA();  # actually calls funcA because the function
>                 # exists in the class
> $obj->funcB($a, $b);  # funcB doesn't exist, so __call() gets called with
>                       # args 'funcB', array($a, $b)
> # so inside __call(), we append 'IMPL' to $name, then invoke
> # $this->funcBIMPL($a, $b)
> 
> Using this setup, when I want to add a new function called mySuperFunc(), I
> merely have to define mySuperFuncIMPL() and magically the wrapper is "made
> for me"...=)

Something like this might work:

py> class C(object):
...     def func_a(self):
...         print "func_a"
...     def func_b_impl(self):
...         print "func_b"
...         raise Exception
...     def __getattr__(self, name):
...         func = getattr(self, '%s_impl' % name)
...         wrapped_func = self._impl_wrapper(func)
...         setattr(self, name, wrapped_func)
...         return wrapped_func
...     def _impl_wrapper(self, func):
...         def wrapper(*args, **kwargs):
...             try:
...                 return func(*args, **kwargs)
...             except:
...                 print "entered except"
...                 raise
...         return wrapper
...
py> c = C()
py> c.func_a()
func_a
py> c.func_b()
func_b
entered except
Traceback (most recent call last):
   File "<interactive input>", line 1, in ?
   File "<interactive input>", line 15, in wrapper
   File "<interactive input>", line 6, in func_b_impl
Exception

The idea here is that __getattr__ is called whenever the class doesn't 
have a particular function.  The __getattr__ method then tries to find a 
corresponding _impl function, wraps it with appropriate try/except code, 
and returns the wrapped function.

HTH,

STeVe



More information about the Python-list mailing list