#!/usr/bin/env python class wrap(object): def wrap(self, func, premethod=None, postmethod=None, preargs={}, postargs={}): def x(function, *args, **kwds): if premethod: premethod(*args, **kwds) function(*args, **kwds) if postmethod: postmethod(*args, **kwds) return lambda *x,**k: x(func,*x,**k) wrap = classmethod(wrap) def pre(self, *args, **kwds): print "PRE: %s, %s" % (args, kwds) def post(self, *args, **kwds): print "PRE: %s, %s" % (args, kwds) class X(object): def Foo(self, *args, **kwds): try: print kwds['somearg'] except: print "No 'somearg' argument given" Foo = wrap.wrap(Foo, pre, post) x = X() x.Foo(42, bar=33) x.Foo(somearg="Hello there")