Rationale for read-only property of co_code

Arnaud Delobelle arnodel at googlemail.com
Thu Apr 3 10:00:32 EDT 2008


On Apr 3, 11:10 am, João Neves <seve... at gmail.com> wrote:
> On Apr 3, 4:43 am, Scott David Daniels <Scott.Dani... at Acm.Org> wrote:
>
> > Nope:  If you change the code in-place, the whole stack's references
> > to where they were running would need to get updated to corresponding
> > locations in the new code.  _That_ is a lot of work.
>
> Ah, there it is. Now I get it, it makes perfect sense.
> Looks like I'll have to stick to the usual mechanisms!
> Thanks everyone!
>
> ---
> João Neves

FWIW, when I need to 'modify' a code object / function object I use
the following functions:

from new import code, function

code_args = (
    'argcount', 'nlocals', 'stacksize', 'flags', 'code',
    'consts', 'names', 'varnames', 'filename', 'name',
    'firstlineno', 'lnotab', 'freevars', 'cellvars'
    )

function_args = ('code', 'globals', 'name', 'defaults', 'closure')

def copy_code(code_obj, **kwargs):
    "Return 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 code(*map(kwargs.__getitem__, code_args))

def copy_function(func_obj, **kwargs):
    "Return a copy of a function object, maybe changing some
attributes)"
    for arg in function_args:
        if not kwargs.has_key(arg):
            kwargs[arg] = getattr(func_obj, 'func_%s' % arg)
    return function(*map(kwargs.__getitem__, function_args))

# E.g. to change the code object of a function:

f = copy_function(f, code=new_code_object)




More information about the Python-list mailing list