enums and PEP 3132

Tim Chase python.list at tim.thechases.com
Wed Mar 12 15:13:24 EDT 2008


>> Currently I'm just putting this at the top of the file:
>>     py=1
>>     funcpre=2
>>     funcpost=3
>>     ...
> 
> That can be done more compactly with
> 
>      py, funcpre, funcpost = range(3)

I've harbored a hope that a combination of PEP 3132[1] ("Extended 
Iterable unpacking") and itertools.count()[2] would be available 
for doing something like this:

   py, funcpre, funcpost, *unexhausted_iterator = count()

which would theoretically allow me to just add new enum names to 
the LHS without having to update constant passed to range() on 
the RHS.

Unfortunately, it looks like this wasn't a desirable behavior 
because the PEP describes the "*unexhausted_iterator" notation 
unpacking as a list, not as an iterable.

My desired syntax would work well for bit-mask fields as well:

   def bit_iter(i=0):
     assert i >= 0
     while True:
       yield 1 << i
       i += 1
   read, write, execute, *_ = bit_iter()

and I'm sure there are other use-cases I've not yet considered.

Diez Roggisch hacked together a disturbingly (in the "that hurts 
my brain to sniff the stack" way) beautiful/functional 
decorator[3] that does something like this in Python2.4+ and can 
just be used something like

   @variably_unpack
   def just_enough(): return itertools.count()
   read, write, execute = just_enough()

which is a fabulous syntax, IMHO.

-tkc

[1]
http://www.python.org/dev/peps/pep-3132/

[2]
http://docs.python.org/dev/library/itertools.html#itertools.count

[3]
http://groups.google.com/group/comp.lang.python/browse_thread/thread/63dce474e196adac/d98522d9bedae946#d98522d9bedae946




More information about the Python-list mailing list