For what is worth changing func_code is supported both by PyPy and Jython. What cannot be done in Jython is construct a code object out of a string of CPython bytecode, but it can be extracted from other functions.
Jython 2.2b1 on java1.5.0_07 Type "copyright", "credits" or "license" for more information. >>> def f(): ... return 1 ... >>> f() 1 >>> def g(): ... return 2 ... >>> f.func_code = g.func_code >>> f() 2 >>> Phillip J. Eby wrote: > At 12:14 PM 5/1/2007 -0700, Guido van Rossum wrote: > >> Suppose you couldn't assign to __class__ of a function (that's too >> messy to deal with in CPython) and you couldn't assign to its __code__ >> either. What proposed functionality would you lose? >> > > The ability to overload any function, without having to track down all the > places it's already been imported or otherwise saved, and change them to > point to a new function or a non-function object. > > > >> How would you >> ideally implement that functionality if you had the ability to modify >> CPython in other ways? (I'm guessing you'd want to add some >> functionality to function objects; what would that functionality have >> to do?) >> > > Hm... well, in PyPy they have a "become" feature (I don't know if it's a > mainline feature or not) that allows you to say, "replace object A with > object B, wherever A is currently referenced". Then the replacement object > (GF implementation) needn't even be a function. > > A narrower feature, however, more specific to functions, would just be > *some* way to redirect or guard the function's actual execution. For > example, if function objects had a writable __call__ attribute, that would > be invoked in place of the normal behavior. (Assuming there was a way to > save the old __call__ or make a copy of the function before it was modified.) > > I really just need a way to make calling the function do something > different from what it normally would -- and ideally this should be in such > a way that I could still invoke the function's original behavior. (So it > can be used as the default method when nothing else matches, or the > least-specific fallback method.) > > _______________________________________________ > Python-3000 mailing list > Python-3000@python.org > http://mail.python.org/mailman/listinfo/python-3000 > Unsubscribe: > http://mail.python.org/mailman/options/python-3000/pedronis%40openendsystems.com > _______________________________________________ Python-3000 mailing list Python-3000@python.org http://mail.python.org/mailman/listinfo/python-3000 Unsubscribe: http://mail.python.org/mailman/options/python-3000/archive%40mail-archive.com