I defined an IntEnum for some weather codes and provided a metaclass.
from enum import IntEnum, EnumMeta
class WXCodeMeta(EnumMeta):
def __iter__(self: type[IntEnum]) -> Iterator[tuple[str, int]]:
for member in super().__iter__():
yield member.name, member.value
def names(self: type[IntEnum]):
return tuple(member.name for member in super().__iter__())
def values(self: type[IntEnum]):
return tuple(member.value for member in super().__iter__())
class WXCodes(IntEnum, metaclass=WXCodeMeta):
RA = 1
TS = 2
BR = 3
SN = 4
FG = 5
as show above it functions as expected when passed into a dict.
>>> dict(WXCodes)
{'RA': 1, 'TS': 2, 'BR': 3, 'SN': 4, 'FG': 5}
but if I change the method name of names to keys like ...
class WXCodeMeta(EnumMeta):
...
def keys(self: type[IntEnum]):
return tuple(member.name for member in super().__iter__())
I get an unexpected result
>>> dict(WXCodes)
{'RA': <WXCodes.RA: 1>,
'TS': <WXCodes.TS: 2>,
'BR': <WXCodes.BR: 3>,
'SN': <WXCodes.SN: 4>,
'FG': <WXCodes.FG: 5>}
It was my understanding that dict calls the __iter__ method under the hood to create a __new__ dict. Why does the keys method name change the behavior?