使用枚举类型索引Python字典中的字符串键

3

有没有一种方法可以使用枚举来对字典进行索引?

例如,我有以下枚举和字典:

class STATUS(Enum):
    ACTIVE = "active"

d = { "active": 1 }

我希望在STATUS类中添加适当的逻辑,以便获得以下结果:

d[STATUS.ACTIVE]
# returns 1

我知道STATUS.ACTIVE不是字符串类型,但是否有其他方法可以绕过这个问题,而不是使用STATUS.ACTIVE来声明字典?此外,还在寻找其他解决方案,而不是添加类属性或.value。

会执行 d[STATUS.ACTIVE.value] 吗? - Nelala_
1
从技术上讲是可以的,但我的意思是:不要在“-”后添加额外的点项,例如不是一个属性函数(实际上已经实现了,并且正在尝试看看是否可以不用它)。编辑文本以添加这种细微差别。 - alps
你也可以让 STATUS 枚举从 str 派生。"class STATUS(str, Enum):" - Nelala_
@Nelala_: 请把你的评论变成答案。 - Ethan Furman
2个回答

4
@ElmovanKielmo的解决方案是可行的,但您也可以通过使STATUS枚举从str派生来实现所需的结果。
from enum import Enum


class STATUS(str, Enum):
    ACTIVE = "active"


d = {"active": 1}

print(d[STATUS.ACTIVE])
# prints 1

请记住,当从 str 或任何其他类型继承时,得到的枚举成员也是该类型。

太好了,问题解决了!谢谢@Nelala_。这个问题可能适合另一个帖子(如果大家觉得合适,我很乐意创建一个新的),但我也有一个枚举类的情况:class STATUS(Enum): ACTIVE = "active", 1(所以它是一个元组)...实际上是同样的问题,我想要print(d[STATUS.ACTIVE])打印出相同的d为1。 - alps
与此处相同的解决方案,但是从元组中导出而不是从字符串中 | “class STATUS(tuple, Enum):” :) - Nelala_
好的,这会导致字典索引出错,因为在这种新情况下它期望一个字符串而不是元组... 有什么解决方法吗? - alps
啊,我误解了你的评论。所以你默认只想返回元组中的第一个项目?一些巧妙的解决方案,比如自定义字典可能会起作用,但我认为如果你将其作为一个新问题发布,你会有更好的机会得到答案。 - Nelala_
1
@alps:这个解决方案应该适用于你的次要问题。 - Ethan Furman

0
你可以使用自定义的字典类:
from collections import UserDict
from enum import Enum

class MyDict(UserDict):
    def __getitem__(self, key):
        if isinstance(key, Enum):
            key = key.value
        return super().__getitem__(key)

class STATUS(Enum):
    ACTIVE = "active"

d = MyDict({ "active": 1 })
d[STATUS.ACTIVE]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接