Great exercise for python expert !

manatlan manatlan at gmail.com
Fri Nov 28 15:35:31 CET 2008


On 28 nov, 15:19, 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
>
> 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)"]
>
> another idea ?

To explain better, here is another code
======================================================================================
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(list):
    def __init__(self):
        list.__init__([])

    js=property(lambda self:JQueryCaller(self.__add))

    def __add(self,j):
        self.append(j)


if __name__ == "__main__":
    o=MyObject()

    o.js.kiki(12).kuku()()
    o.js.kiki(12).kuku().roro("gfde")()

    assert o==["kiki('12').kuku()", "kiki('12').kuku().roro('gfde')"]
======================================================================================

here, it uses the __call__ of JQueryCaller by adding the "()" trick at
the end ...

I'd really like to have the same result, without the "()" trick, like
this:

    o=MyObject()

    o.js.kiki(12).kuku()
    o.js.kiki(12).kuku().roro("gfde")

    assert o==["kiki('12').kuku()", "kiki('12').kuku().roro('gfde')"]



More information about the Python-list mailing list