【问题标题】:Getting value of enum on string conversionenum - 获取字符串转换的枚举值
【发布时间】:2014-08-20 15:56:13
【问题描述】:

我定义了以下枚举

from enum import Enum


class D(Enum):
    x = 1
    y = 2


print(D.x)

现在打印出来的值是

D.x

相反,我希望打印枚举的值

1

可以做些什么来实现这个功能?

【问题讨论】:

  • 我应该澄清访问参数,我知道 D.x.value 的东西,我想要的是 D.x 字符串转换以返回值,对不起,如果问题没有明确条件。

标签: python python-3.x enums python-3.4


【解决方案1】:

如果您要使用 f-string 打印值,那么您可以从 Enumstr 继承您的枚举。例如:

from enum import Enum


class D(str, Enum):
    x = 1
    y = 2


print(D.x)
print(f"{D.x}")

输出:

D.x
1

【讨论】:

    【解决方案2】:

    如果您想将枚举成员与Int 值进行比较,更好的方法是扩展IntEnum

    from enum import IntEnum
    
    
    class D(IntEnum):
        x = 1
        y = 2
    
    
    print(D.x)
    

    通过这种方式,您可以将枚举值与整数进行比较,而无需显式调用.value

    >>> D.x == 1
    True
    

    有关更多信息,您可以查看 Python 文档的这一部分:Enum comparisons

    【讨论】:

      【解决方案3】:

      使用最直接的 dunder 方法是 _repr_ 而不是 _str_,因为它还允许您在列表中以这种方式打印它。

      class D(Enum):
        x = 1
        y = 2
      
        def __repr__(self):
            return self.value
      
      print([D.x,D.y])
      >>> [1, 2]
      

      【讨论】:

      • 如果你使用print(D.x),它仍然会打印D.x
      【解决方案4】:

      我使用以下实现了访问

      class D(Enum):
          x = 1
          y = 2
      
          def __str__(self):
              return '%s' % self.value
      

      现在我可以做到了

      print(D.x) 得到1 作为结果。

      如果您想打印x 而不是1,也可以使用self.name

      【讨论】:

      • 为什么是字符串格式和self._value_return str(self.value) 更直接。
      • 我只是查看了源代码,这就是它的实现方式,但是您是对的,self.value 更干净。
      • 单下划线属性在生成的枚举类内部;最好坚持记录在案的属性(它恰好是一个特殊的描述符,因此您仍然可以使用 value 作为枚举类型的名称)。
      • @MartijnPieters 同意
      【解决方案5】:

      您正在打印枚举对象。如果您只想打印它,请使用 .value 属性:

      print(D.x.value)
      

      Programmatic access to enumeration members and their attributes section

      如果您有一个枚举成员并且需要它的名称或值:

      >>>
      >>> member = Color.red
      >>> member.name
      'red'
      >>> member.value
      1
      

      如果您只想提供自定义字符串表示,则可以向枚举添加 __str__ 方法:

      class D(Enum):
          def __str__(self):
              return str(self.value)
      
          x = 1
          y = 2
      

      演示:

      >>> from enum import Enum
      >>> class D(Enum):
      ...     def __str__(self):
      ...         return str(self.value)
      ...     x = 1
      ...     y = 2
      ... 
      >>> D.x
      <D.x: 1>
      >>> print(D.x)
      1
      

      【讨论】:

      • 当我将它与一个整数值进行比较时,它作为对象返回。例如:if D.x == 10: ...。我应该对整数采取什么方法?
      • @alper:完全一样; D.x 是枚举对象,D.x.value 是一个整数值。如果您必须让枚举值像整数一样,请使用IntEnum type,其中每个元素都是int 的子类,因此IntEnumD.x == 10 可以工作。
      • 我已经添加了 def __eq__(self, other): return int(self.value) == otherdef __int__(self): return int(self.value) 但我仍然认为我必须在不使用比较的情况下使用 .value
      • @alper:当other 是另一个枚举值时,__eq__ 实现不起作用; D.x == D.y,其中D.x.value == D.y.value 为真,例如会失败。听起来你想在那里使用IntEnum 而不是Enum
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 2018-11-25
      • 1970-01-01
      相关资源
      最近更新 更多