
On 2008-01-23, Tal Einat wrote:
Christian Heimes wrote:
Mark Summerfield wrote:
There is an enum module in PyPI [snip]
-1 on adding a specific construct for enums.
What I usually do in Python is this:
ERROR, OK, ALSO_OK = range(-1, -1 + 3)
Start and stop values, as well step sizes other than one, are easily achieved. Skipping values is done like this:
ERROR, OK, ALSO_OK, SOMEOTHER, LAST = range(-1, -1 + 3) + range(1000, 1000 + 2)
Updating the range(s) appropriately when adding/changing values is easy enough. I find this solution to be good enough since the values are not ever meant to be used explicitly, and values are not added/changed often.
This is perhaps not very pretty or concise, but it's simple and it only uses Python syntax and constructs which everyone knows and understands. Readability and simplicity are usually my top concerns, so this fits the bill.
Unfortunately, the "const-ness" of enums defined this way is merely conventional, so it is easy to change the value of one by mistake. Using namedtuples means that if you try to assign to the thing you at least get an exception raised. Not that I'm particularly in favour of using namedtuples for this purpose, but they are the only "convenient" way to have enums based on the standard library that I know of. Although I think that enums are a fundamental (as are sets, and yet it took many years for them to arrive in the standard library), at least putting enums in the standard library would allow those who want them to use them out of the box without impinging on those who are happy with not having them. As for which enum implementation, whether the one from PyPI or one from the cookbook, or another one entirely, I have no strong feelings. -- Mark Summerfield, Qtrac Ltd., www.qtrac.eu