Greetings!

There was a recent thread on Python-Ideas about adding an enumeration package
to the stdlib.  One idea that seemed to be fairly popular (at least I like it a 
lot ;)
was the use of a metaclass to automatically assign values when a name lookup 
failed.

It was also fairly unpopular and so probably won't make it in (although another 
good one
seems poised to be accepted -- flufl.enum, I believe).

At any rate, I finished putting my prototype together, and it is available on 
github here:

https://bitbucket.org/stoneleaf/enum


And here is some sample code so you can see if you would like to take a closer 
look
(comments and critiques welcome):


8<----------------------------------------------------------------------------------
#!/usr/bin/python3

from enum import Enum, BitMaskEnum, UniqueEnum, enum

class Color(Enum):
    "basic red/green/blue"
    black
    red
    green
    blue

print(Color)
print(Color.green)
print(Color(2))
print(Color('green'))
print(repr(Color.green))

class MoreColor(Color):
    "and some cyan/magenta/yellow"
    cyan
    magenta
    yellow

print(MoreColor)
print(MoreColor.red)
print(MoreColor(1))
print(MoreColor('red'))
print(repr(MoreColor.red))

class Errors(Enum):
    missing
    closed
    corrupted
    modified

print(Errors)
print(Errors.closed)
print(Errors(1))
print(Errors('closed'))
print(repr(Errors.closed))

print(Color.red in Color)
print(MoreColor.magenta in MoreColor)
print(Color.red in MoreColor)
print(Color.red == MoreColor.red)

print(not (Errors.closed in MoreColor))
print(not (Errors.closed in Color))
print(not (Errors.closed == Color.red))
print(not (Errors.closed == MoreColor.red))

class Status(BitMaskEnum):
    has_memo
    binary
    increment
    unicoded

print(Status)
for e in Status:
    print(repr(e))
print(Status.binary | Status.increment)
print(Status(5))
print(Status('binary|increment'))
print(repr(Status(5)))

class Position(UniqueEnum):
    LEFT
    RIGHT
    TOP
    BOTTOM

print(Position)
print(Position.TOP)
print(Position('top'))
print(Position('TOP'))
print(repr(Position.TOP))

#return class discarded
print(Enum.create('IceCream', 'chocolate vanilla strawberry'))

#class stuffed into globals
Enum.create('IceCream', 'chocolate vanilla strawberry', namespace=globals())
print(IceCream)

# can even subclass this way
import sys
Enum.create(
        'MoreIceCream',
        'cherry rockyroad coconut',
        bases=(IceCream,),
        namespace=sys.modules)
from MoreIceCream import *         # and import from it
print(cherry)
print()

# and if you don't like the magic, don't use it  :)
class Color(BitMaskEnum):
    black  = enum('midnight', '#000', value=0)
    red    = enum('sunset',   '#001')
    green  = enum('emerald',  '#010')
    blue   = enum('sky',      '#100')

    def __init__(yo, desc, code):
        "value is automatically saved"
        yo.desc = desc
        yo.code = code

    def describe(yo, noun):
        return "%s %s" % (yo.desc, noun)

print(Color)
print(Color.green)
print(repr(Color.green))
print(Color.green.describe('glow'))

8<----------------------------------------------------------------------------------
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to