[Python-ideas] Specifying constants for functions

Serhiy Storchaka storchaka at gmail.com
Tue Oct 27 13:45:37 EDT 2015


There is known trick to optimize a function:

     def foo(x, y=0, len=len, pack=struct.pack, maxsize=1<<BPF):
         ...

It has a side effect: change function's signature. Would be nice to have 
a way to set function's local variables at creation time without 
affecting a signature.

Possible syntax (I'm not sure what is better):

1. Similar to "global" and "nonlocal" declarations with optional 
initializer.

     def foo(x, y=0):
         const len
         const pack=struct.pack, maxsize=1<<BPF
         ...

2. Same as 1, but using "as" instead of "=".

     def foo(x, y=0):
         uses len, struct.pack as pack
         uses 1<<BPF as maxsize
         ...

3. Declaration is moved to function header. The keyword "given" is 
inspired by PEP 3150.

     def foo(x, y=0) given len=len, pack=struct.pack, maxsize=1<<BPF:
         ...

4. Declaration is moved out of the function. The advantage is that bound 
names can be used to evaluate default values for actual parameters (it 
is useful to implement sentinel default value), and all expression are 
evaluated in natural order.

     using len, struct.pack as pack, 1<<BPF as maxsize:
         def foo(x, y=0):
             ...

5. The least wordy syntax. No new keyword needed.

     def foo(x, y=0; len=len, pack=struct.pack, maxsize=1<<BPF):
         ...

All above examples would be roughly equivalent to the following code:

     def create(len=len, pack=struct.pack, maxsize=1<<BPF):
         def foo(x, y=0):
             ...
         return foo
     tmp = create()
     def foo(x, y=0):
         pass
     update_wrapper(tmp, foo)
     foo = tmp
     del create, tmp

This feature is rather ideologically opposite to Victor's approach.



More information about the Python-ideas mailing list