覆盖 Enum._generate_next_value_ 未按预期与 MRO 一起工作?

Overriding Enum._generate_next_value_ not working as expected with MRO?

为什么重写 _generate_next_value_ 只有在最后继承的枚举中才有效?

例如:

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'>, <enum 'OtherEnum'>, <enum 'AutoEnum'>, <enum 'Enum'>, <class 'object'>)
name: TEST, value: overriding _generate_next_value

如果默认值 _generate_next_value_ 每次都被设置,如果它没有被特别覆盖,那么当 Enum 被继承时它如何不被再次重置?

我想我遗漏了一些东西 how/why 这是这样工作的。

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

当然感觉就像任何其他 Enum classes 也应该搜索枚举方法。

Issue created.


披露:我是 Python stdlib Enum, the enum34 backport, and the Advanced Enumeration (aenum) 库的作者。