Changing the called python so that it calls before (), the actual function, then after ()

I'm not sure if this is the best way to call the before and after functions around the f1() function.

 class ba(object): def __init__(self, call, before, after): self.call = call self.before = before self.after = after def __call__(self, *args): self.before() r = self.call(*args) self.after() return r class test1(object): def mybefore(self): print "before func call" def myafter(self): print "after func call" def meth1(a1, a2): print "meth1(a1=%d, a2=%d)" % (a1, a2) t = test1() wmeth1 = ba(meth1, t.mybefore, t.myafter) wmeth1(1, 2) 

Please inform.

+4
source share
2 answers

I would use a decorator, for example:

 from functools import wraps class withBeforeAfter(object): def __init__(self, before, after): self.before = before self.after = after def __call__(self, wrappedCall): @wraps(wrappedCall) def wrapCall(*args, **kwargs): try: self.before() r = wrappedCall(*args, **kwargs) finally: self.after() return r return wrapCall # to use it: @withBeforeAfter(myBefore, myAFter) def myFunc(...): ... # or: def myFunc(...): ... # later... myFunc = withBeforeAfter(myBefore, myAfter)(myFunc) 
+14
source

You can use the @contextmanager decorator in the contextlib module along with the with statement for something along these lines:

 from contextlib import contextmanager class test1(object): def mybefore(self): print "before func call" def myafter(self): print "after func call" @contextmanager def wrapper(cls): test = cls() test.mybefore() try: yield finally: test.myafter() def f1(a1, a2): print "f1(a1=%d, a2=%d)" % (a1, a2) with wrapper(test1): f1(1, 2) 
+3
source

All Articles