EnumMeta implements its own __getitem__ function which doesn't respect
__class_getitem__. Now that __class_getitem__ exists, this behavior feels
unintuitive. For instance

```
class Directions(enum.Enum):
  LEFT = "LEFT"
  RIGHT = "RIGHT"

  def __class_getitem__(cls, name):
    return super().__class_getitem__(name.upper())

# fails with KeyError -- __class_getitem__ never called
assert Directions["left"] == Directions["LEFT"] == Directions.LEFT
```

doesn't work, and the only way to implement this behavior is something like

```
class MyEnumMeta(enum.EnumMeta):
  def __getitem__(cls, name):
    return cls.__class_getitem__(name)

class MyEnum(enum.Enum, metaclass=MyEnumMeta):
  def __class_getitem__(cls, name):
    return cls._member_map_[name]

class Directions(MyEnum): ...
```

there might be some compatibility issues with code written between 3.4 and
3.11, but not supporting __class_getitem__ feels like it violates the
principle of least surprise with the more recent data models.
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/4VURZ4ZXPZRQ726KZH5DAOI47XXUKBI2/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to