[Python-ideas] 'Injecting' objects as function-local constants

Steven D'Aprano steve at pearwood.info
Sat Jun 18 06:03:34 CEST 2011


Nick Coghlan wrote:
> On Fri, Jun 17, 2011 at 10:12 PM, Steven D'Aprano <steve at pearwood.info> wrote:
>> You have missed a fourth option, which I have been championing: make inject
>> an ordinary function, available from the functools module. The
>> *implementation* of inject almost certainly will require support from the
>> compiler, but that doesn't mean the interface should!
> 
> No, I didn't miss it, I left it out on purpose because I think messing
> with the runtime name lookup semantics is a terrible idea.

Isn't changing name lookup semantics at runtime precisely what JIT 
compilers do? But it doesn't really matter, because that's not what I'm 
proposing. I'm not suggesting that the lookup semantics should be 
changed when the function is called. I'm saying that a new function 
should be created, based on the original function, with the desired 
semantics.

In principle, this could be as simple as:

- make a copy of the function object
- in the copy, add cells for any injected variable
- and modify the copied code object to change the appropriate 
LOAD_GLOBAL opcodes to LOAD_DEREF (and similarly for rebindings).

although I dare say that in practice there'll be a certain amount of 
book-keeping required to make it work reliably.



-- 
Steven




More information about the Python-ideas mailing list