[Python-ideas] constant/enum type in stdlib

Tim Delaney timothy.c.delaney at gmail.com
Tue Feb 12 09:06:38 CET 2013


I'm evil. I just had a very bad thought, and I think I kinda like it.

Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17) [MSC v.1600 64
bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from enum import Enum, _
>>>
>>> class Color(Enum):
...     RED
...     GREEN = _(None, 'green')
...     BLUE = _(None, 'blue', hex='0000FF')
...     def __init__(self):
...         print('__init__', repr(self), self.args, self.kwargs)
...     def dump(self):
...         print(self, self.args, self.kwargs)
...
__init__ <EnumValue 'Color.RED': 0> () {}
__init__ <EnumValue 'Color.GREEN': 1> ('green',) {}
__init__ <EnumValue 'Color.BLUE': 2> ('blue',) {'hex': '0000FF'}

>>> print(repr(Color))
<enum __main__.Color {<EnumValue 'RED': 0>, <EnumValue 'GREEN': 1>,
<EnumValue 'BLUE': 2>}>
>>>
>>> for e in Color:
...     e.dump()
...     Color(e).dump()
...
Color.RED () {}
Color.RED () {}
Color.GREEN ('green',) {}
Color.GREEN ('green',) {}
Color.BLUE ('blue',) {'hex': '0000FF'}
Color.BLUE ('blue',) {'hex': '0000FF'}

When you request an attribute on the EnumValue that doesn't exist, it gets
it from the owning Enum class. If the attribute is an instance method (or
static method - they have the same type) then it gets turned into an
instance method of the EnumValue.

Also, when the EnumValue becomes owned by Enum, Enum.__init__ is called as
an EnumValue instance method (with no parameters).

This actually makes a kind of perverse sense. Conceptually the actual
EnumValues are the instances of the Enum (and in fact, I've made them
pretend to actually be so). I think it also entirely does away with the
need for subclasses of EnumValue and EnumMeta - you can do everything by
specifying attributes and behaviour in the Enum instance methods.

I've pushed this to https://bitbucket.org/magao/enum - have a play and see
how evil you think this is.

Tim Delaney
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20130212/347be251/attachment.html>


More information about the Python-ideas mailing list