from types import CodeType code_args = ( 'argcount', 'nlocals', 'stacksize', 'flags', 'code', 'consts', 'names', 'varnames', 'filename', 'name', 'firstlineno', 'lnotab', 'freevars', 'cellvars' ) def copy_code(code_obj, **kwargs): "Make a copy of a code object, maybe changing some attributes" for arg in code_args: if not kwargs.has_key(arg): kwargs[arg] = getattr(code_obj, 'co_%s' % arg) return CodeType(*map(kwargs.__getitem__, code_args)) def posonly(f): code = f.func_code varnames, nargs = code.co_varnames, code.co_argcount varnames = tuple(v+'@' for v in varnames[:nargs]) + varnames[nargs:] f.func_code = copy_code(code, varnames = varnames) return f