Great exercise for python expert !

manatlan manatlan at gmail.com
Fri Nov 28 11:23:09 EST 2008


On 28 nov, 17:12, Peter Otten <__pete... at web.de> wrote:
> manatlan wrote:
> > 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')"]
>
> You could preallocate slots in MyObject:
>
> from functools import partial
>
> 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)))
>             self.__callback(".".join(self._s))
>             return self
>         return _caller
>
> class MyObject(list):
>     def __init__(self):
>         list.__init__([])
>
>     @property
>     def js(self):
>         n = len(self)
>         self.append(None)
>         return JQueryCaller(partial(self._add, n))
>
>     def _add(self, i, j):
>         self[i] = 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')"]
>
> This will course fail if you try things like
>
> a = o.js.kiki
> a(1)
> a(2)
>
> Peter

great ! you've found the way !
I don't understant the trick for now, but i will study it !
But it works like expected ! great !
thanks a lot




More information about the Python-list mailing list