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