在Python中通过枚举名称在字符串中查找枚举值

10

我在Python枚举方面遇到了困难。我创建了一个包含各种字段的枚举类:

class Animal(Enum):
   DOG = "doggy"
   CAT = "cute cat"

我知道我可以通过传递Animal("doggy")来访问这个枚举值,即我会得到Animal.DOG。但是我想以相反的方式实现同样的效果,比如我有一个"DOG",我想用它来找到"doggy"
例如:
str_to_animal_enum("DOG") = Animal.DOG

我认为我可以重写Enum类的init函数,以检查我们作为参数输入的字符串名称是否在Enum名称中有代表,如果是,则匹配成功。
类似这样:
def __init__(cls, name):
   for enum in all_enums:
      if enum.name == name:
         return enum

但这种解决方案的计算量非常大。假设我有100个名称要查找,并且对于每个名称,我们在枚举类中最坏情况下需要进行N次迭代,其中N是枚举数目。
我认为应该有更好的方法,但我不知道是什么。您有任何想法如何实现吗?谢谢 :)

2
这并不是你应该使用枚举的方式。枚举只是更实用命名的常量;你似乎想要将它们像(常量)字典一样使用,进行反向查找。 - 9769953
是的,你说得完全正确,我没有注意到。谢谢你的帮助! - JustPawel
这个问题确实是一个有效的用例。例如,假设你正在将一个环境变量的值转换为枚举类型。这是一个常见的用例,Java通过为所有枚举类型提供valueOf(String name)方法来支持它。此外,这并不是一个重复的问题。 - undefined
1个回答

15
根据手册所述:
>>> Animal.DOG.value
'doggy'
>>> Animal.DOG.name
'DOG'
>>> # For more programmatic access, with just the enum member name as a string:
>>> Animal['DOG'].value
'doggy'

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