strange __call__

Rahul codedivine at gmail.com
Wed Jun 29 12:27:49 EDT 2005


Hi.
well if you do dir(a) just after defining 'a' then it does show
'__call__'.
the reason i wanted to do it is that i wanted to see if theres a
uniform way to  wrap a function and callable objects so that for
example i can get some message printed whenever a function or a
function-like-object is called. then i could simply do :

def wrapper(obj):
   g = obj.__call__
   def f(*args,**kwargs):
     for arg in args:print arg
     return g(*args,**kwargs)
   obj.__call__=f
but it seems this will not work for functions :(


Andreas Kostyrka wrote:
> Just a guess, but setting "__X__" special methods won't work in most cases
> because these are usually optimized when the class is created.
>
> It might work if a.__call__ did exist before (because class a: contained
> a __call__ definition).
>
> Andreas
>
> On Wed, Jun 29, 2005 at 09:15:45AM +0100, Michael Hoffman wrote:
> > Rahul wrote:
> > > Consider the following:
> > > def a(x):
> > >  return x+1
> > >
> > > def b(f):
> > >   def g(*args,**kwargs):
> > >     for arg in args:
> > >         print arg
> > >     return f(*args,**kwargs)
> > >   return g
> > >
> > > a.__call__ = b(a.__call__)
> > >
> > > now calling a(1) and a.__call__(1) yield 2 different results!!
> > > i.e. for functions a(1) doesnt seem to be translated to a.__call__ if
> > > you assign a new value to a.__call__?
> >
> > I don't know why this happens, but setting the __call__ attribute of a
> > is a pretty strange thing to do. Why not just set a instead? The
> > original function a(x) will still be stored as a closure in what is
> > returned from b().
> >
> > If this is of purely academic interest then the answer is I don't know. :)
> > --
> > Michael Hoffman
> > -- 
> > http://mail.python.org/mailman/listinfo/python-list




More information about the Python-list mailing list