在字符串转换时获取枚举值

问题描述 投票:0回答:5

我定义了以下枚举:

from enum import Enum
class D(Enum):
    x = 1
    y = 2

print(D.x)

现在打印的值为

D.x

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

1

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

python python-3.x enums python-3.4
5个回答
430
投票

您正在打印枚举对象。如果您只想打印该内容,请使用

.value
属性:

print(D.x.value)

请参阅 以编程方式访问枚举成员及其属性部分

如果您有枚举成员并需要其名称或值:

>>>
>>> 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

29
投票

我使用以下方法实现了访问

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

    def __str__(self):
        return '%s' % self.value

现在我可以做

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

如果您想打印

self.name
而不是
x
,也可以使用
1


17
投票

如果您要使用 f 字符串打印值,那么您可以从

Enum
str
继承枚举。这样您就可以获得对象的值和名称。例如:

from enum import Enum


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

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

输出:

D.x
1

仅从

Enum
继承将始终给出完整的限定名称。

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

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

输出

D.x
D.x

这与如果您不继承任何您将获得值而不是名称的东西相反:

class D:
    x = 1
    y = 2


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

输出

1
1

这就是为什么从

str
Enum
继承,您将获得完整的限定名称和值。


7
投票

如果您想将枚举成员与

Int
值进行比较,更好的方法是扩展
IntEnum
:

from enum import IntEnum


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


print(D.x)

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

.value
:

>>> D.x == 1
True

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


4
投票

最简单的 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,所以我认为实现此目的的更好方法是添加 __str__ 方法。

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

  def __str__(self):
      return str(self.value)

  def __repr__(self):
      return str(self)
© www.soinside.com 2019 - 2024. All rights reserved.