Yes, this is essentially the same idea. You compile the codestring to bytecode, whereas I just evalue the codestring to a lambda function. We are essentially implementing a runtime macro by hand. I wonder if there is any alternative approach to get the same result, without manipulation of the source code. BTW, I have fixed another small bug in my original code. 'decorator' should read
import inspect def decorate(func, caller): args, varargs, varkw, defaults = inspect.getargspec(func) argdefs = defaults or () argcount = func.func_code.co_argcount varnames = args + (varargs or []) + (varkw or []) signature = ", ".join(_signature_gen(varnames, len(argdefs), argcount)) variables = ", ".join(_signature_gen(varnames, len(argdefs), argcount, rm_defaults=True)) lambda_src = "lambda %s: call(func, %s)" % (signature, variables) print func.__name__, "->", lambda_src dec_func = eval(lambda_src, dict(func=func, call=caller, arg=argdefs)) dec_func.__name__ = func.__name__ dec_func.__doc__ = func.__doc__ dec_func.__dict__ = func.__dict__.copy() return dec_func -- http://mail.python.org/mailman/listinfo/python-list