Great exercise for python expert !

manatlan manatlan at gmail.com
Fri Nov 28 10:35:56 EST 2008


On 28 nov, 15:49, George Sakkis <george.sak... at gmail.com> wrote:
> 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

I just want to make a jquery wrapper, and let people use it to write
jquery call on the server side in a python way ...

o is a object, imagine a widget : like a textarea or input box
"js" is a special attribut of "o", which will let you write javascript
for this object.

o=MyObject()
o.js.toggleClass("clean").hide()

When I will render the object to a http/html output : it will generate
something like (a javascript call): $("#idOfMyObject").toggleClass
("clean").hide();

It's all what I want in the real world.
I wouldn't do something like that (with the "()" tricks at the end on
the chain, because I don't find it really readable/natural)

o=MyObject()
o.js.toggleClass("clean").hide()()

The code I gave before (the JQueryCaller) was just my try to do what I
want ... If there is another way : I take ;-)



More information about the Python-list mailing list