【问题标题】:How can I access an enum member with an input in python如何使用 python 中的输入访问枚举成员
【发布时间】:2021-01-11 05:13:48
【问题描述】:

我正在尝试通过输入访问 enum 变量的值。

这是我的代码:

class Animals(Enum):
    Dog = 1
    Cat = 2
    Cow = 3 

Choose = input('Choose an animal')

print(Animals.Choose.value)

这给了我一个错误可能是因为Animals 不包含Choose

如何区分enum 中的成员和我的输入变量?

所以如果我输入Dog,它会给出1Dog 变量的值)?

【问题讨论】:

    标签: python class enums attributeerror


    【解决方案1】:

    枚举具有内置的字符串访问和访问结果的各种方式。有关详细信息,请参阅Enum 的文档:

    from enum import Enum
    
    class Animal(Enum):
        Dog = 1
        Cat = 2
        Cow = 3 
    
    choice = input('Choose an animal: ')
    
    print(Animal[choice])
    print(repr(Animal[choice]))
    print(Animal[choice].value)
    
    Choose an animal: Cat
    Animal.Cat
    <Animal.Cat: 2>
    2
    

    【讨论】:

      【解决方案2】:

      你可以试试getattr:

      from enum import Enum
      class Animals(Enum):
          Dog = 1
          Cat = 2
          Cow = 3 
      
      
      Choose = input('Choose an animal')
      
      print(getattr(Animals, Choose).value)
      

      输出:

      1
      

      getattr代表“get attribute”,意思是它获取类中的变量,它的名字就是第二个参数。

      Enums 已经内置了__getitem__ 方法,所以你可以直接用[] 括号来索引它,像这样:

      print(Animals[Choose].value)
      

      输出:

      1
      

      【讨论】:

      • @p-ekul 欢迎您 :-) 如果您觉得有用,请记得点赞并接受 :-)
      • @p-ekul 添加了另一种使其工作的方法
      • 像这样使用getattr 是一个糟糕的建议,例如用户可以输入任何其他属性,例如"__module__""__class__",甚至是“隐藏”属性,例如_generate_next_value_。在枚举上定义的自定义方法也是有效属性,但不是枚举成员,可能会导致更多误报。正确答案是 Mark Tolonen 使用订阅显示的答案,随后在他发布后将其编辑为此答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多