python中基于数组的enum



我正在寻找一个基于枚举的方法来返回每个枚举项目背后的数组。例如,假设我需要为每种类型的目标指定一个范围,如下所示:

from enum import Enum 
class TargetRange(Enum):
T1 = [0, 100]
T2 = [30, 60]
T3 = [50, 150]

现在,我像下面这样使用枚举:

target_range = TargetRange.T1
value = 140
# ...
# adjust the value
if(value > target_range[1]):
value = target_range[1]
elif(value < target_range[0]):
value = target_range[0]
# ...

但是,我得到以下错误:

TypeError: 'TargetRange' object is not subscriptable

如何解决?这种枚举的正确用法是什么?

我应该注意到,我发现这篇文章返回一个字符串(而不是一个数组)。因此,我正在寻找返回数组而不是字符串的相同想法。

有三种方法可以获得索引支持:

  • 使用.value属性

    TargetRange.T1.value
    
  • 继承自listEnum:

    class TargetRange(list, Enum):
    
  • 添加__getitem__方法:

    class TargetRange(Enum):
    def __getitem__(self, index):
    return self._value_[index]
    T1 = [0, 100]
    T2 = [30, 60]
    T3 = [50, 150]
    

也可以在Python枚举中添加行为,这可以简化其他地方的代码。例如:

class TargetRange(Enum):
T1 = [0, 100]
T2 = [30, 60]
T3 = [50, 150]
#
def __getitem__(self, index):
return self._value_[index]
#
def limit(self, value):
# adjust the value
if(value > self[1]):
value = self[1]
elif(value < self[0]):
value = self[0]
return value

然后在主代码中:

>>> TargetRange.T1.limit(140)
100

披露:我是Python标准库Enumenum34后端口和高级枚举(aenum)库的作者。

EnumStrEnum的区别就在这一点上。如果输出TargetRange.T1,您将发现没有返回枚举项的值。因此,解决此问题的一个简单解决方案是重写代码的第一行,如下所示:

target_range = TargtetRange.T1.value
#...

这意味着使用枚举项的.value属性,而不是直接使用枚举项。

最新更新