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