重写 Enum._generate_next_value_ 无法按 MRO 的预期工作?

2023-12-19

为什么会覆盖_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}')

Output:

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 时如何不会再次重置它?

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


特殊方法如_generate_next_value_需要在实际创建类之前就位。为了支持这一点,EnumMeta在基础中寻找这些特殊方法Enum类——和基础Enum类是列出的最后一个。

感觉确实和其他的一样Enum不过,还应该在类中搜索枚举方法。

已创建问题 https://bugs.python.org/issue42678.


披露:我是该书的作者Python 标准库Enum https://docs.python.org/3/library/enum.html, the enum34向后移植 https://pypi.python.org/pypi/enum34,以及高级枚举(aenum) https://pypi.python.org/pypi/aenum图书馆。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重写 Enum._generate_next_value_ 无法按 MRO 的预期工作? 的相关文章

随机推荐