[Python-Dev] PEP 435 - requesting pronouncement (original) (raw)
Tim Delaney timothy.c.delaney at gmail.com
Sun May 5 01:27:25 CEST 2013
- Previous message: [Python-Dev] PEP 435 - requesting pronouncement
- Next message: [Python-Dev] PEP 435 - requesting pronouncement
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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:
obj_type = bases[-1].__mro__[1] # e.g. (IntEnum, int,
Enum, object)
for base in bases[-1].__mro__:
if not issubclass(base, Enum):
obj_type = base
break
else: obj_type = object # save enum items into separate mapping so they don't get baked
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>
- Previous message: [Python-Dev] PEP 435 - requesting pronouncement
- Next message: [Python-Dev] PEP 435 - requesting pronouncement
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]