Decorator question

MRAB python at mrabarnett.plus.com
Wed Jan 26 21:40:59 EST 2011


On 27/01/2011 02:17, Chris wrote:
> I have a class (A, for instance) that possesses a boolean (A.b, for
> instance) that is liable to change over an instance's lifetime.
>
> Many of the methods of this class (A.foo, for instance) should not
> execute as long as this boolean is false, but should instead raise an
> exception.
>
> Can I use a decorator to implement this functionality?  More exactly,
> could I define a function called 'checker' that accomplishes this:
>
> def checker(f):
>      ...
>
> class A():
>
>      b = True
>
>      @checker
>      def foo(self,...):
>          print 'in foo'
>
> a = A()
> a.foo()
> a.b = False
> a.foo()
>
> would result in:
>
> 'in foo'
> Exception: ...
>
> This exact solution isn't necessary, just something that doesn't
> require me to have the clunky:
>
> def foo(self,...):
>      if self.b:
>          ...
>      else: raise Exception('b attribute must be true before executing
> this method')
>
> in every method.
>
How about this:

def checker(func):
     def wrapper(self, *args, **kwargs):
         if not self.b:
             raise Exception('b attribute must be true before executing 
this method')
         return func(self, *args, **kwargs)
     return wrapper



More information about the Python-list mailing list