具有多个属性的Python枚举

问题描述 投票:0回答:2

我有他的枚举:

class MultiAttr(Enum):
    RED = (1, 10)
    GREEN = (2, 20)
    BLUE = (3, 20)
    def __init__(self, id, val):
        self.id = id
        self.val = val
assert MultiAttr((2, 20)) == MultiAttr.GREEN

断言通过。

  1. 为什么 VSCode 中的 Pylance 会抱怨
    Argument missing for parameter "val"
  2. 由于第一个属性是标识符,有没有办法实现:
    MultiAttr(2) == MultiAttr.GREEN
python enums
2个回答
3
投票

您可以使用

__new__
,因为您想自定义 Enum 成员的实际值:

from enum import Enum

class MultiAttr(bytes, Enum):
    def __new__(cls, value, otherVal):
        obj = bytes.__new__(cls, [value])
        obj._value_ = value
        obj.otherVal = otherVal
        return obj
    RED = (1, 10)
    GREEN = (2, 20)
    BLUE = (3, 20)


print(MultiAttr(2) == MultiAttr.GREEN)
print(MultiAttr(2).otherVal)

出:

True
20

0
投票

还有另一种方法可以为枚举成员存储附加值。 扩展枚举 - 有助于做到这一点

from dataclasses import dataclass
from extended_enum import BaseExtendedEnumValue, ExtendedEnum, EnumField

@dataclass(frozen=True)
class SomeExtendedEnumValue(BaseExtendedEnumValue):
    other_value: int

class MultiAttr(ExtendedEnum):
    RED = EnumField(SomeExtendedEnumValue(value=1, other_value=10))
    GREEN = EnumField(SomeExtendedEnumValue(value=2, other_value=20))
    BLUE = EnumField(SomeExtendedEnumValue(value=3, other_value=20))
>>> MultiAttr(SomeExtendedEnumValue(2, 20)) == MultiAttr.GREEN
True
>>> MultiAttr.GREEN.value
2
>>> MultiAttr.GREEN.extended_value
SomeExtendedEnumValue(value=2, other_value=20)
>>> MultiAttr.GREEN.extended_value.other_value
20
>>> MultiAttr(SomeExtendedEnumValue(2, 30)) == MultiAttr.GREEN
ValueError: SomeExtendedEnumValue(value=2, other_value=30) is not a valid MultiAttr

如果不需要比较

other_value
字段,可以使用
field(compare=False)
。 在这种情况下,比较将在第一个字段上进行。

from dataclasses import dataclass, field

@dataclass(frozen=True)
class SomeExtendedEnumValue(BaseExtendedEnumValue):
    other_value: int = field(compare=False)
>>> MultiAttr(SomeExtendedEnumValue(2, 30)) == MultiAttr.GREEN
True
© www.soinside.com 2019 - 2024. All rights reserved.