<div dir="ltr">Typo line 171: <Colro.blue: 3><div><br></div><div>One thing I'd like to be clear in the PEP about is whether enum_type and _EnumDict._enum_names should be documented, or whether they're considered implementation details.</div>
<div><br></div><div>I'd like to make a subclass of Enum that accepts ... for auto-valued enums but that requires subclassing the metaclass and access to classdict._enum_names. I can get to enum_type via type(Enum), but _EnumDict._enum_names requires knowing the attribute. It would sufficient for my purposes if it was just documented that the passed classdict had a _enum_names attribute.<br>
<div><br></div><div style>In testing the below, I've also discovered a bug in the reference implementation - currently it will not handle an __mro__ like:</div><div style><br></div><div style>(<Enum 'AutoIntEnum'>, <Enum 'IntEnum'>, <class 'int'>, <Enum 'Enum'>, <class 'object'>)<br>
</div><div style><br></div><div style>Apply the following patch to make that work:</div><div style><br></div><div style><div>diff -r 758d43b9f732 ref435.py</div><div>--- a/ref435.py<span class="" style="white-space:pre">    </span>Fri May 03 18:59:32 2013 -0700</div>
<div>+++ b/ref435.py<span class="" style="white-space:pre">     </span>Sun May 05 09:23:25 2013 +1000</div><div>@@ -116,7 +116,11 @@</div><div>             if bases[-1] is Enum:</div><div>                 obj_type = bases[0]</div>
<div>             else:</div><div>-                obj_type = bases[-1].__mro__[1] # e.g. (IntEnum, int, Enum, object)</div><div>+                for base in bases[-1].__mro__:</div><div>+                    if not issubclass(base, Enum):</div>
<div>+                        obj_type = base</div><div>+                        break</div><div>+</div><div>         else:</div><div>             obj_type = object</div><div>         # save enum items into separate mapping so they don't get baked into</div>
<div><br></div><div style>My auto-enum implementation (using the above patch - without it you can get the essentially the same results with class AutoIntEnum(int, Enum, metaclass=auto_enum).</div></div><div><br></div><div>
<div>class auto_enum(type(Enum)):</div><div>    def __new__(metacls, cls, bases, classdict):</div><div>        temp = type(classdict)()</div><div>        names = set(classdict._enum_names)</div><div>        i = 0</div><div>
<br></div><div>        for k in classdict._enum_names:</div><div>            v = classdict[k]</div><div><br></div><div>            if v is Ellipsis:</div><div>                v = i</div><div>            else:</div><div>                i = v</div>
<div><br></div><div>            i += 1</div><div>            temp[k] = v</div><div><br></div><div>        for k, v in classdict.items():</div><div>            if k not in names:</div><div>                temp[k] = v</div>
<div><br></div><div>        return super(auto_enum, metacls).__new__(metacls, cls, bases, temp)</div><div><br></div><div>class AutoNumberedEnum(Enum, metaclass=auto_enum):</div><div>    pass</div><div><br></div><div>class AutoIntEnum(IntEnum, metaclass=auto_enum):</div>
<div>    pass</div><div><br></div><div>class TestAutoNumber(AutoNumberedEnum):</div><div>    a = ...</div><div>    b = 3</div><div>    c = ...</div><div><br></div><div>class TestAutoInt(AutoIntEnum):</div><div>    a = ...</div>
<div>    b = 3</div><div>    c = ...</div><div><br></div><div>print(TestAutoNumber, list(TestAutoNumber))</div><div>print(TestAutoInt, list(TestAutoInt))</div></div></div><div><br></div><div><div>---------- Run ----------</div>
<div><Enum 'TestAutoNumber'> [<TestAutoNumber.a: 0>, <TestAutoNumber.b: 3>, <TestAutoNumber.c: 4>]</div><div><Enum 'TestAutoInt'> [<TestAutoInt.a: 0>, <TestAutoInt.b: 3>, <TestAutoInt.c: 4>]</div>
<div><br></div></div><div style>Tim Delaney</div></div>