[Python-ideas] constant/enum type in stdlib (original) (raw)

Cameron Simpson cs at zip.com.au
Wed Jan 30 23:19:26 CET 2013


On 30Jan2013 17:34, Greg Ewing <greg.ewing at 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:

but it lets you enumerate the names without quoting and specify explicit values and let the class pick default values.

Cheers,

Cameron Simpson <cs at zip.com.au>

ERROR 155 - You can't do that. - Data General S200 Fortran error code list



More information about the Python-ideas mailing list