[Python-ideas] An easier syntax for writing decorators (& similar things)?

Guido van Rossum guido at python.org
Wed Jan 23 16:19:25 CET 2008


I'm wondering, will Aaron ever realize that no-one understands his posts?

On Jan 23, 2008 1:44 AM, Aaron Brady <castironpi at comcast.net> wrote:
> > -----Original Message-----
> > On 8 Oct 2007, at 10:57, Arnaud Delobelle wrote:
> > >
> > > On Mon, October 8, 2007 4:33 am, Adam Atlas wrote:
> > >> When writing decorators especially when it's one that needs arguments
> > >> other than the function to be wrapped, it often gets rather ugly...
> > [...]
> > > Whhy not create a (meta-)decorator to do this? Something like:
> > [...]
>
> Following up post from 10/8/07.
>
> > To follow up on my untested suggestion, here's one that is tested:
> >
> > # This metadecorator hasn't changed
> >
> > def decorator_withargs(decf):
> >      def decorator(*args, **kwargs):
> >          def decorated(f):
> >              return decf(f, *args, **kwargs)
> >          return decorated
> >      return decorator
>
> This is equivalent to:
> (1)
>       decorator_withargs= partial( partial, prepartial )
>
> , where prepartial is roughly the same as partial as you might expect:
>
> (2)
> 1     def prepartial(func, *args, **keywords):
> 2           def newfunc(*fargs, **fkeywords):
> 3               newkeywords = keywords.copy()
> 4               newkeywords.update(fkeywords)
> 5               return func(*(fargs+ args), **newkeywords)
> 6           newfunc.func = func
> 7           newfunc.args = args
> 8           newfunc.keywords = keywords
> 9           return newfunc
>
> Partial is the same outside of line 5:
>
> (3)
> 5               return func(*(args + fargs), **newkeywords)
>
> Results are the same:
>
> -> f
> 1
> f -> 2
> 2
>
> Intriguing.
>
> > # Here's how to use it to create a decorator
> >
> > @decorator_withargs
> > def mydec(f, before='entering %s', after='%s returns %%s'):
> >      before = before % f.__name__
> >      after = after % f.__name__
> >      def decorated(*args, **kwargs):
> >          print before
> >          result = f(*args, **kwargs)
> >          print after % result
> >          return result
> >      return decorated
> >
> >
> > # Now I can decorate a function with my new decorator
> >
> > @mydec(before='-> %s', after='%s -> %%s')
> > def f(x):
> >      print x
> >      return x+1
> >
> >
> > Then
> >
> >  >>> f(1)
> > -> f
> > 1
> > f -> 2
> > 2
> >
> > --
> > Arnaud
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> http://mail.python.org/mailman/listinfo/python-ideas
>



-- 
--Guido van Rossum (home page: http://www.python.org/~guido/)



More information about the Python-ideas mailing list