<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>