Great exercise for python expert !

George Sakkis george.sakkis at gmail.com
Fri Nov 28 15:49:34 CET 2008


On Nov 28, 9:19 am, manatlan <manat... at gmail.com> wrote:

> On 28 nov, 14:58, George Sakkis <george.sak... at gmail.com> wrote:
>
>
>
> > On Nov 28, 5:36 am, manatlan <manat... at gmail.com> wrote:
>
> > > I'd like to make a "jquery python wrapper" ...
>
> > > here is my code :
> > > ===================================================================
> > > #!/usr/bin/env python
> > > # -*- coding: utf-8 -*-
>
> > > class JQueryCaller(object):
> > >     def __init__(self,callback):
> > >         self.__callback=callback
> > >         self._s=[]
>
> > >     def __getattr__(self,name):
> > >         def _caller(*args):
> > >             sargs=["'%s'"%i for i in args]
> > >             self._s.append("%s(%s)"%(name,",".join(sargs)))
> > >             return self
> > >         return _caller
>
> > >     def __call__(self):
> > >         return self.__callback(".".join(self._s))
>
> > > class MyObject(object):
> > >     def __init__(self):
> > >         self.js = JQueryCaller(self.__add)
>
> > >     def __add(self,j):
> > >         print "Add:"+j
>
> > > if __name__ == "__main__":
> > >     o=MyObject()
>
> > >     o.js.kiki(12).kuku()()
> > > ===================================================================
> > > If i run the script : it will display :
>
> > > Add:kiki('12').kuku()
>
> > > Because the JQueryCaller caller is called, by the "()" trick at the
> > > end of the last line
>
> > > I'd like to display the same thing, but without the need to put the
> > > "()" at then end !
> > > (by calling simply : "o.js.kiki(12).kuku()" not "o.js.kiki(12).kuku()
> > > ()")
> > > (or how to call the MyObject._add (callback) without using the caller
> > > on my JQueryCaller)
>
> > Why don't you rename __call__ to __str__ and have MyObject.__add
> > return a string instead of printing it directly?
>
> > class MyObject(object):
> >     def __add(self,j):
> >         return "Add:"+j
>
> > if __name__ == "__main__":
> >     o = MyObject()
> >     s = o.js.kiki(12).kuku()
> >     print s
>
> > HTH,
> > George
>
> sure, it works like you said ... but it's not what I want.
> by doing that, you create an action ... when you will call "print" it
> will call the __str__ (__repr__ is better in that case), which will
> call the callback of myobject.
> In my preceding post, the action was called by the "()" trick at the
> end of line

... which you apparently don't like, and rightly so. __getattr__ and
__call__ do totally different things in your example, why do you want
to conflate them ?

> In fact, MyObject will handle a list of all "js call"
> If i do :
>   o.js.toto()
>   o.js.toto().titi(12,13)
>
> I'd like my MyObject contains a list like that ["toto()","toto().titi
> (12,23)"]

Of course this still happens when you rename __call__ to __str__.

> another idea ?

Yes, put a little more thought on your design and give a more
realistic example of what you're really trying to do; so far it seems
more like a pointless hack.

George



More information about the Python-list mailing list