获取枚举在字符串转换中的值

264 投票
5 回答
337735 浏览
提问于 2025-04-18 11:34

我定义了一个枚举(enum),它的作用是给一组相关的常量起个名字,方便使用。

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

print(D.x)

现在打印出来的值是

D.x

但我想要打印出枚举的值

1

那我该怎么做才能实现这个功能呢?

5 个回答

5

最简单的特殊方法是使用 __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)
7

如果你想把你的枚举成员和 Int 值进行比较,比较好的方法是扩展 IntEnum

from enum import IntEnum


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


print(D.x)

这样的话,你就可以直接把枚举的值和整数进行比较,而不需要特别调用 .value

>>> D.x == 1
True

想了解更多信息,可以查看Python文档的这一部分:枚举比较

17

如果你想用 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

如果只继承 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

所以,继承 strEnum 后,你就能同时得到完整的名字和对应的值。

30

我用以下代码实现了访问功能

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

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

现在我只需要执行

print(D.x) 就能得到 1 这个结果。

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

436

你现在是在打印一个枚举(enum)对象。如果你只是想打印它的值,可以使用 .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

撰写回答