[Python-Dev] PEP 435 - requesting pronouncement (original) (raw)

Tim Delaney timothy.c.delaney at gmail.com
Sun May 5 01:27:25 CEST 2013


Typo line 171: <Colro.blue: 3>

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.

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.

In testing the below, I've also discovered a bug in the reference implementation - currently it will not handle an mro like:

(<Enum 'AutoIntEnum'>, <Enum 'IntEnum'>, <class 'int'>, <Enum 'Enum'>, <class 'object'>)

Apply the following patch to make that work:

diff -r 758d43b9f732 ref435.py --- a/ref435.py Fri May 03 18:59:32 2013 -0700 +++ b/ref435.py Sun May 05 09:23:25 2013 +1000 @@ -116,7 +116,11 @@ if bases[-1] is Enum: obj_type = bases[0] else:

Enum, object)

into

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

class auto_enum(type(Enum)): def new(metacls, cls, bases, classdict): temp = type(classdict)() names = set(classdict._enum_names) i = 0

    for k in classdict._enum_names:
        v = classdict[k]

        if v is Ellipsis:
            v = i
        else:
            i = v

        i += 1
        temp[k] = v

    for k, v in classdict.items():
        if k not in names:
            temp[k] = v

    return super(auto_enum, metacls).__new__(metacls, cls, bases, temp)

class AutoNumberedEnum(Enum, metaclass=auto_enum): pass

class AutoIntEnum(IntEnum, metaclass=auto_enum): pass

class TestAutoNumber(AutoNumberedEnum): a = ... b = 3 c = ...

class TestAutoInt(AutoIntEnum): a = ... b = 3 c = ...

print(TestAutoNumber, list(TestAutoNumber)) print(TestAutoInt, list(TestAutoInt))

---------- Run ---------- <Enum 'TestAutoNumber'> [<TestAutoNumber.a: 0>, <TestAutoNumber.b: 3>, <TestAutoNumber.c: 4>] <Enum 'TestAutoInt'> [<TestAutoInt.a: 0>, <TestAutoInt.b: 3>, <TestAutoInt.c: 4>]

Tim Delaney -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.python.org/pipermail/python-dev/attachments/20130505/ebc64679/attachment.html>



More information about the Python-Dev mailing list