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

Terry Reedy tjreedy at udel.edu
Fri Jun 17 22:58:56 CEST 2011

On 6/17/2011 9:26 AM, Nick Coghlan wrote:

> This is why the nonlocal and global directives exist: to tell the
> compiler to change how it treats certain names. Arguments (including
> the associated default values) are given additional special treatment
> due to their placement in the function header. If we want to create a
> new namespace that is given special treatment by the compiler,

I do not really want a new namespace and for the purpose of the OP, 
named local constants (for speed or freezing the meaning of an 
expression or both), we do not need one. There is already a fourth 
'namespace' for constants, a tuple f.__code__.co_consts, whose 'names' 
are indexes, just as with the locals array. Given

def f(a, **, b=1001, len = len): return 2001 # one possible spelling

def f(a):                                    # alternate
     constant b = 1001, len = len
     return 2001

the compiler should put 1001 and len into co.consts and convert 'b' and 
'len' into the corresponding indexes, just like it does with 'a', and 
use the LOAD_CONST bytecode just as with literal constants like 2001 in 
the body. Constant names would not go into .co_names and not increment 
.co_argcount. This would make named constants as fast and def-time 
frozen as default args without the disadvantages of being included in 
the signature and over-writable on calls.

Terry Jan Reedy

More information about the Python-ideas mailing list