import inspect def hiddendec(func): assert inspect.isfunction(func) argnames, args, kwdargs, defaults = inspect.getargspec(func) doc = func.__doc__ name = func.__name__ argspec = ", ".join(argnames) wrapper = "def %s(%s):\n %s.real(%s)\n" % (name, argspec, name, argspec) print wrapper def real_dec(*args): print "hi" return func(*args) hidden_co = compile(wrapper, 'hiddendec', 'exec') namespace = {} exec hidden_co in namespace hidden = namespace[name] hidden.__doc__ = doc hidden.real = real_dec return hidden @hiddendec def foo(one, two): """this is the foo doc""" print "one:", one, "two:", two