[Python-ideas] constant/enum type in stdlib (original) (raw)
Cameron Simpson cs at zip.com.au
Wed Jan 30 23:19:26 CET 2013
- Previous message: [Python-ideas] constant/enum type in stdlib
- Next message: [Python-ideas] constant/enum type in stdlib
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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:
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 at zip.com.au>
ERROR 155 - You can't do that. - Data General S200 Fortran error code list
- Previous message: [Python-ideas] constant/enum type in stdlib
- Next message: [Python-ideas] constant/enum type in stdlib
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]