
On 30Jan2013 17:34, Greg Ewing <greg.ewing@canterbury.ac.nz> wrote: | Guido van Rossum wrote: | > this doesn't look so bad, and | > certainly doesn't violate DRY (though it's somewhat verbose): | > | > class color(enum): | > RED = value() | > WHITE = value() | > BLUE = value() | | The verbosity is what makes it fail the "truly elegant" | test for me. And I would say that it does violate DRY | in the sense that you have to write value() repeatedly | for no good reason. | | Sure, it's not bad enough to make it unusable, but like | all the other solutions, it leaves me feeling vaguely | annoyed that there isn't a better way. How about this: Color = enum(RED=None, WHITE=None, BLUE=None, yellow=9) where None means "pick the next natural choice. The __init__ method goes something like this: def __init__(self, style=None, **kw): self._names = {} self._taken = set() for name, value in kw.items: if name in self._names: raise ValueError("name already taken: " + name) if value is None: while seq in self._taken: seq += 1 value = seq elif value in self._taken: raise ValueError("\"%s\": value already taken: %s" % (name, value)) self._names[name] = value self._taken.add(value) Obviously this needs a little work: - you'd allocate the explicit values first and go after the Nones later so that you don't accidentally take an explicit value - you'd support (pluggable?) styles, starting with sequential, allocating 0, 1, 2, ... and bitmask allocating 1, 2, 4, ... but it lets you enumerate the names without quoting and specify explicit values and let the class pick default values. Cheers, -- Cameron Simpson <cs@zip.com.au> ERROR 155 - You can't do that. - Data General S200 Fortran error code list