Eko palypse wrote: > I'm fairly new when it comes to metaclass programming and therefore the > question whether the following makes sense or not. > > The goal is to have two additional class properties which return a > dictionary name:class_attribute and value:class_attribute for an IntEnum > class and after reading about it I came to the conclusion that the > following code might do what I want, and it does do the job BUT does it > make sense also? > > Meaning, my ultimate goal would be to be able to decide myself > if this is a good or bad idea doing this, so what do I need to > read/understand in order to achieve such a goal.
My objections have nothing to do with metaclass technicalities, but > from enum import EnumMeta, IntEnum > > class EnhancedIntEnum(EnumMeta): > @property > def names(cls): > return {k: v for k, v in cls.__members__.items()} this is basically a writeable copy of __members__. Using Ordinal.__members__ directly should be better in most cases, and if you really need a copy Ordinal.__members__.copy() or dict(Ordinal.__members__) is pretty clear and concise enough. If you want to convert a str use Ordinal["WEST"] rather than Ordinal.names["WEST"]. > @property > def values(cls): > return {v.value: v for k, v in cls.__members__.items()} Again, I don't see the use case; if you want to convert an int to your `Ordinal`, just use the constructor Ordinal(some_int) > class Ordinal(IntEnum, metaclass=EnhancedIntEnum): > NORTH = 0 > SOUTH = 1 > EAST = 2 > WEST = 3 > > print(Ordinal.names) > print(Ordinal.values) > > Thank you > Eren -- https://mail.python.org/mailman/listinfo/python-list