IntEnum子类没有正确比较

2024-04-27 19:31:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将IntEnum子类化,以从某个值开始成员的值,然后自动为后续成员设置值。这是我的课:

class Abc(IntEnum):
  def __init__(self, n=100):
    super().__init__()
    self._value_ = n + len(self.__class__.__members__)

  A = () # 100
  B = () # 101

Abc.A == Abc.B # expects False, but gets True

如上所示,成员之间的比较是不正确的。当打印出Abc.dict时,我注意到它的值member_map_也不正确。在

^{pr2}$

请注意,''u value2member_map_u'的键是0,而不是预期的值100和101。我一定是在init函数中遗漏了一些东西,但我无法确定如何正确地执行我的意图。感谢任何帮助。 非常感谢。在


Tags: selffalsemapleninitvaluedef成员
1条回答
网友
1楼 · 发布于 2024-04-27 19:31:57

首先,有一种更惯用、更简单的方法来做你想做的事情:

class Abc(IntEnum):
    A = 100
    B = auto()

或者,考虑到您将100和101作为注释放入,实时代码总是比注释好:

^{pr2}$

事实上,你没有做这两件事中的任何一件,都是在向读者发出一个信号:你可能在做一些更复杂的事情。不过,据我所知,你不是,所以这是误导。在

另外,您组合了两个具有直接相反含义的模式:例如,the docs例如,使用()习惯用法“向用户表示这些值不重要”,但是使用IntEnum显然意味着这些枚举常量的数值不仅重要,而且是它们的全部要点。在

不仅如此,用户还必须通读你的方法代码,以找出那些重要的数值是什么,而不是直接读取它们。在


不管怎样,如果您想让它正常工作,问题是在初始化之后替换_value_并没有被记录为有任何好处,事实上也没有

您要重写的是__new__,而不是{},如the auto-numbering example in the docs。在

但是这里有两个区别(两者都与使用IntEnum而不是{}有关):

  • 不能调用object.__new__,因为IntEnumint,并且{}不能用于int这样的内置类型的实例。您可以通过查看cls的mro动态地找出正确的基类,或者您可以在这里对int进行硬编码。在
  • 你不需要在这里做中级作业。(当然,如果要创建多个自动编号的IntEnums,您可能仍然需要一个。)

所以:

^{3}$

相关问题 更多 >