How do I implement two decorators in Python both of which would eventually want to call the calling function

Tim Chase python.list at tim.thechases.com
Sat Aug 6 08:19:27 EDT 2011


On 08/06/2011 02:49 AM, Chris Rebert wrote:
> On Fri, Aug 5, 2011 at 10:49 PM, Devraj<devraj at gmail.com>  wrote:
>> My question, how do I chain decorators that end up executing the
>> calling method, but ensure that it's only called once.
>
> That's how it works normally; decorators stack (and order is therefore
> important). With normal wrapping decorators, only the first decorator
> gets access to the original function and is able to call it.

I'd clarify "first decorator" here as the one closest to the 
decorated function which is actually the *last* one in the list 
of decorators, but first-to-decorate.  In Chris's example below, 
decorator_A is the only one that calls myfunc().

> Subsequent decorators only get access to the already-wrapped function.
>
> Example:
>
> def decorator_A(func):
>      def decorated(*args, **kwds):
>          print "In decorator A"
>          return func(*args, **kwds)
>      return decorated
>
> def decorator_B(func):
>      def decorated(*args, **kwds):
>          print "In decorator B"
>          return func(*args, **kwds)
>      return decorated
>
> @decorator_B
> @decorator_A
> def myfunc(arg):
>      print "hello", arg
>
>>>> myfunc('bob')
> In decorator B
> In decorator A
> hello bob
>
>
> Notice that myfunc() only got executed once.

-tkc






More information about the Python-list mailing list