覆盖 Enum._generate_next_value_ 与 MRO 不按预期工作?

问题描述

为什么覆盖 _generate_next_value_ 仅在 LAST 继承的枚举中完成时才有效?

例如:

class AutoEnum(Enum):
    def _generate_next_value_(name,start,count,last_values):
        return 'overriding _generate_next_value'

class OtherEnum(Enum):
    def some_other_method(self):
        return

class AutoOther(AutoEnum,OtherEnum):
    TEST = auto()

class OtherAuto(OtherEnum,AutoEnum):
    TEST = auto()


print(f'{AutoOther.TEST}: mro={getmro(AutoOther)}\n'
      f'name: {AutoOther.TEST.name},value: {AutoOther.TEST.value}')

print(f'{OtherAuto.TEST}: mro={getmro(OtherAuto)}\n'
      f'name: {OtherAuto.TEST.name},value: {OtherAuto.TEST.value}')

输出

AutoOther.TEST: mro=(<enum 'AutoOther'>,<enum 'AutoEnum'>,<enum 'OtherEnum'>,<enum 'Enum'>,<class 'object'>)
name: TEST,value: 1

OtherAuto.TEST: mro=(<enum 'OtherAuto'>,value: overriding _generate_next_value

如果每次都以某种方式设置认的 _generate_next_value_,如果它没有被特别覆盖,那么在继承 Enum 时如何不会再次重置它?

我想我遗漏了一些关于如何/为什么这样工作的内容

解决方法

在实际创建类之前需要准备好诸如 _generate_next_value_ 之类的特殊方法。为了支持这一点,EnumMeta 在基 Enum 类中查找这些特殊方法 -- 而基 Enum 类是列出的最后一个。

当然感觉也应该搜索任何其他 Enum 类以查找枚举方法。

Issue created


披露:我是 Python stdlib Enumenum34 backportAdvanced Enumeration (aenum) 库的作者。