On 10/22/2019 03:13 PM, Steve Jorgensen wrote:
Ethan Furman wrote:
Experimenting is good! However, you'll want to either build your own metaclass and/or prepared dict, or do some work on your __new__/__init__ methods for building enum members. Currently, you are reassigning _value_ in __init__, which leaves some internal structures not matching the Enum. --> class Food(ChoiceEnum): ... APPLE = () ... ICED_TEA = () ... --> Food['APPLE'] <Food.APPLE: 'APPLE'> --> Food.APPLE <Food.APPLE: 'APPLE'> --> Food('APPLE') Traceback (most recent call last): ... ValueError: 'APPLE' is not a valid Food
Thanks for that info.
Per the example in https://docs.python.org/3/library/enum.html#when-to-use-new-vs-init, it looks like I can properly set the `_value_` property in the `__new__` method of the `Enum` subclass without needing to subclass `EnumMeta`. Am I understanding that correctly?
Yes, you are. The fun part for you is that the value can sometimes be the name, and the name is not passed into `__new__`. The name /is/ passed into `_generate_next_value_`, but if any value is supplied then `_generate_next_value_` isn't called. I haven't had enough space cycles to either find a solution or rule any out, but I know the limitations above are baked into EnumMeta and _EnumDict, so if you rolled your own you could simply not put them in. -- ~Ethan~