enum — 枚举支持

3.4 版本加入。

源代码: Lib/enum.py


枚举

  • 是一组绑定到唯一值的符号名称(成员)

  • 可以迭代以按定义顺序返回其规范(即非别名)成员

  • 使用调用语法按值返回成员

  • 使用索引语法按名称返回成员

枚举可以通过使用 class 语法或使用函数调用语法来创建

>>> from enum import Enum

>>> # class syntax
>>> class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3

>>> # functional syntax
>>> Color = Enum('Color', [('RED', 1), ('GREEN', 2), ('BLUE', 3)])

尽管我们可以使用 class 语法来创建枚举,但枚举不是普通的 Python 类。有关更多详细信息,请参阅 枚举与普通类有何不同?

备注

命名法

  • Color 是一个枚举(或 enum

  • 属性 Color.REDColor.GREEN 等是枚举成员(或成员),并且在功能上是常量。

  • 枚举成员具有名称Color.RED 的名称是 REDColor.BLUE 的值是 3,等等)


模块内容

EnumType

type 用于 Enum 及其子类。

Enum

用于创建枚举常量的基类。

IntEnum

用于创建也是 int 子类的枚举常量的基类。( 备注 )

StrEnum

用于创建也是 str 子类的枚举常量的基类。( 备注 )

Flag

用于创建可以使用位运算组合而不会失去其 Flag 成员资格的枚举常量的基类。

IntFlag

用于创建可以使用位运算符组合而不会失去其 IntFlag 成员资格的枚举常量的基类。IntFlag 成员也是 int 的子类。( 备注 )

ReprEnum

IntEnumStrEnumIntFlag 使用,以保留混合类型的 str()

EnumCheck

具有值 CONTINUOUSNAMED_FLAGSUNIQUE 的枚举,用于 verify(),以确保给定的枚举满足各种约束。

FlagBoundary

具有值 STRICTCONFORMEJECTKEEP 的枚举,它允许更精细地控制如何在枚举中处理无效值。

EnumDict

当子类化 EnumType 时使用的 dict 子类。

auto

实例将替换为 Enum 成员的适当值。StrEnum 默认为成员名称的小写版本,而其他 Enum 默认为 1 并从那里增加。

property()

允许 Enum 成员具有属性,而不会与成员名称冲突。 valuename 属性就是以这种方式实现的。

unique()

枚举类装饰器,可确保只有一个名称绑定到任何一个值。

verify()

枚举类装饰器,用于检查枚举上的用户可选约束。

member()

使 obj 成为成员。可以用作装饰器。

nonmember()

不要使 obj 成为成员。可以用作装饰器。

global_enum()

修改枚举的 str()repr() 以将其成员显示为属于模块而不是其类,并将枚举成员导出到全局命名空间。

show_flag_values()

返回标志中包含的所有二的幂整数的列表。

3.6 版本加入: Flag, IntFlag, auto

3.11 版本加入: StrEnumEnumCheckReprEnumFlagBoundarypropertymembernonmemberglobal_enumshow_flag_values

3.13 版本加入: EnumDict


数据类型

class enum.EnumType

EnumTypeenum 枚举的 元类。 可以对 EnumType 进行子类化 - 有关详细信息,请参阅 子类化 EnumType

EnumType 负责在最终的 enum 上设置正确的 __repr__()__str__()__format__()__reduce__() 方法,以及创建枚举成员,正确处理重复项,提供对枚举类的迭代等等。

__call__(cls, value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)

此方法以两种不同的方式调用

  • 查找现有成员

    cls

    正在调用的枚举类。

    value

    要查找的值。

  • 使用 cls 枚举来创建一个新的枚举(仅当现有枚举没有任何成员时)

    cls

    正在调用的枚举类。

    value

    要创建的新枚举的名称。

    名称:

    新枚举的成员的名称/值。

    模块:

    创建新枚举的模块的名称。

    限定名:

    此枚举在模块中的实际位置。

    类型:

    新枚举的混入类型。

    起始值:

    枚举的第一个整数值(由 auto 使用)。

    边界:

    如何处理位运算中的超出范围的值(仅限 Flag)。

__contains__(cls, member)

如果成员属于 cls,则返回 True

>>> some_var = Color.RED
>>> some_var in Color
True
>>> Color.RED.value in Color
True

在 3.12 版本中更改: 在 Python 3.12 之前,如果在包含检查中使用非枚举成员,则会引发 TypeError

__dir__(cls)

返回 ['__class__', '__doc__', '__members__', '__module__'] 以及 cls 中成员的名称

>>> dir(Color)
['BLUE', 'GREEN', 'RED', '__class__', '__contains__', '__doc__', '__getitem__', '__init_subclass__', '__iter__', '__len__', '__members__', '__module__', '__name__', '__qualname__']
__getitem__(cls, name)

返回 cls 中与 name 匹配的枚举成员,否则引发 KeyError

>>> Color['BLUE']
<Color.BLUE: 3>
__iter__(cls)

按定义顺序返回 cls 中的每个成员

>>> list(Color)
[<Color.RED: 1>, <Color.GREEN: 2>, <Color.BLUE: 3>]
__len__(cls)

返回 cls 中的成员数量

>>> len(Color)
3
__members__

返回每个枚举名称与其成员的映射,包括别名

__reversed__(cls)

按相反的定义顺序返回 cls 中的每个成员

>>> list(reversed(Color))
[<Color.BLUE: 3>, <Color.GREEN: 2>, <Color.RED: 1>]
_add_alias_()

将新名称作为现有成员的别名添加。如果该名称已分配给不同的成员,则引发 NameError

_add_value_alias_()

将新值作为现有成员的别名添加。如果该值已与不同的成员链接,则引发 ValueError

在 3.11 版本中添加: 在 3.11 版本之前,EnumType 被称为 EnumMeta,它仍然可用作别名。

class enum.Enum

Enum 是所有 enum 枚举的基类。

name

用于定义 Enum 成员的名称

>>> Color.BLUE.name
'BLUE'
value

赋予 Enum 成员的值

>>> Color.RED.value
1

成员的值,可以在 __new__() 中设置。

备注

枚举成员值

成员值可以是任何内容:intstr 等。如果确切的值不重要,可以使用 auto 实例,并为您选择适当的值。有关详细信息,请参阅 auto

虽然可以使用可变/不可哈希的值,例如 dictlist 或可变的 dataclass,但与枚举中可变/不可哈希值的总数相比,它们将在创建期间对性能产生二次影响。

_name_

成员的名称。

_value_

成员的值,可以在 __new__() 中设置。

_order_

不再使用,保留以实现向后兼容性。(类属性,在类创建期间删除)。

_ignore_

_ignore_ 仅在创建期间使用,并在创建完成后从枚举中删除。

_ignore_ 是一个名称列表,这些名称不会成为成员,并且它们的名称也将从完成的枚举中删除。有关示例,请参阅 TimePeriod

__dir__(self)

返回 ['__class__', '__doc__', '__module__', 'name', 'value'] 以及在 self.__class__ 上定义的任何公共方法

>>> from datetime import date
>>> class Weekday(Enum):
...     MONDAY = 1
...     TUESDAY = 2
...     WEDNESDAY = 3
...     THURSDAY = 4
...     FRIDAY = 5
...     SATURDAY = 6
...     SUNDAY = 7
...     @classmethod
...     def today(cls):
...         print('today is %s' % cls(date.today().isoweekday()).name)
...
>>> dir(Weekday.SATURDAY)
['__class__', '__doc__', '__eq__', '__hash__', '__module__', 'name', 'today', 'value']
_generate_next_value_(name, start, count, last_values)
名称:

正在定义的成员的名称(例如,“RED”)。

起始值:

枚举的起始值;默认值为 1。

计数:

当前定义的成员数,不包括此成员。

上一个值:

先前值的列表。

一个 staticmethod,用于确定 auto 返回的下一个值

>>> from enum import auto
>>> class PowersOfThree(Enum):
...     @staticmethod
...     def _generate_next_value_(name, start, count, last_values):
...         return 3 ** (count + 1)
...     FIRST = auto()
...     SECOND = auto()
...
>>> PowersOfThree.SECOND.value
9
__init__(self, *args, **kwds)

默认情况下,不执行任何操作。如果在成员赋值中给出多个值,这些值将成为 __init__ 的单独参数;例如

>>> from enum import Enum
>>> class Weekday(Enum):
...     MONDAY = 1, 'Mon'

Weekday.__init__() 将被调用为 Weekday.__init__(self, 1, 'Mon')

__init_subclass__(cls, **kwds)

一个 classmethod,用于进一步配置后续的子类。默认情况下,不执行任何操作。

_missing_(cls, value)

一个 classmethod,用于查找在 cls 中找不到的值。默认情况下,它不执行任何操作,但可以被覆盖以实现自定义搜索行为

>>> from enum import StrEnum
>>> class Build(StrEnum):
...     DEBUG = auto()
...     OPTIMIZED = auto()
...     @classmethod
...     def _missing_(cls, value):
...         value = value.lower()
...         for member in cls:
...             if member.value == value:
...                 return member
...         return None
...
>>> Build.DEBUG.value
'debug'
>>> Build('deBUG')
<Build.DEBUG: 'debug'>
__new__(cls, *args, **kwds)

默认情况下,不存在。如果在枚举类定义中或在混合类(例如 int)中指定,则成员赋值中给出的所有值都将被传递;例如:

>>> from enum import Enum
>>> class MyIntEnum(int, Enum):
...     TWENTYSIX = '1a', 16

这将导致调用 int('1a', 16),并且该成员的值为 26

备注

在编写自定义 __new__ 时,不要使用 super().__new__ – 请调用适当的 __new__

__repr__(self)

返回用于 repr() 调用的字符串。默认情况下,返回 Enum 名称、成员名称和值,但可以被覆盖。

>>> class OtherStyle(Enum):
...     ALTERNATE = auto()
...     OTHER = auto()
...     SOMETHING_ELSE = auto()
...     def __repr__(self):
...         cls_name = self.__class__.__name__
...         return f'{cls_name}.{self.name}'
...
>>> OtherStyle.ALTERNATE, str(OtherStyle.ALTERNATE), f"{OtherStyle.ALTERNATE}"
(OtherStyle.ALTERNATE, 'OtherStyle.ALTERNATE', 'OtherStyle.ALTERNATE')
__str__(self)

返回用于 str() 调用的字符串。默认情况下,返回 Enum 名称和成员名称,但可以被覆盖。

>>> class OtherStyle(Enum):
...     ALTERNATE = auto()
...     OTHER = auto()
...     SOMETHING_ELSE = auto()
...     def __str__(self):
...         return f'{self.name}'
...
>>> OtherStyle.ALTERNATE, str(OtherStyle.ALTERNATE), f"{OtherStyle.ALTERNATE}"
(<OtherStyle.ALTERNATE: 1>, 'ALTERNATE', 'ALTERNATE')
__format__(self)

返回用于 format()f-string 调用的字符串。默认情况下,返回 __str__() 的返回值,但可以被覆盖。

>>> class OtherStyle(Enum):
...     ALTERNATE = auto()
...     OTHER = auto()
...     SOMETHING_ELSE = auto()
...     def __format__(self, spec):
...         return f'{self.name}'
...
>>> OtherStyle.ALTERNATE, str(OtherStyle.ALTERNATE), f"{OtherStyle.ALTERNATE}"
(<OtherStyle.ALTERNATE: 1>, 'OtherStyle.ALTERNATE', 'ALTERNATE')

备注

autoEnum 一起使用会导致整数值递增,从 1 开始。

在 3.12 版本中更改: 添加了 Dataclass 支持

class enum.IntEnum

IntEnumEnum 相同,但其成员也是整数,并且可以在任何可以使用整数的地方使用。如果对 IntEnum 成员执行任何整数运算,则结果值将失去其枚举状态。

>>> from enum import IntEnum
>>> class Number(IntEnum):
...     ONE = 1
...     TWO = 2
...     THREE = 3
...
>>> Number.THREE
<Number.THREE: 3>
>>> Number.ONE + Number.TWO
3
>>> Number.THREE + 5
8
>>> Number.THREE == 3
True

备注

autoIntEnum 一起使用会导致整数值递增,从 1 开始。

在 3.11 版本中更改: __str__() 现在是 int.__str__(),以更好地支持 _替换现有常量_ 的用例。__format__() 出于同样的原因,已经是 int.__format__()

class enum.StrEnum

StrEnumEnum 相同,但其成员也是字符串,并且可以在大多数可以使用字符串的地方使用。对 StrEnum 成员执行或使用任何字符串操作的结果不属于枚举。

备注

stdlib 中有些地方会检查是否为确切的 str,而不是 str 的子类(即 type(unknown) == str 而不是 isinstance(unknown, str)),在这些位置,您需要使用 str(StrEnum.member)

备注

autoStrEnum 一起使用会导致成员名称的小写形式作为值。

备注

__str__()str.__str__(),以更好地支持 _替换现有常量_ 的用例。__format__() 出于同样的原因,同样是 str.__format__()

在 3.11 版本中添加。

class enum.Flag

FlagEnum 相同,但其成员支持按位运算符 & (AND), | (OR), ^ (XOR), 和 ~ (INVERT);这些运算的结果是枚举的(别名)成员。

__contains__(self, value)

如果 value 在 self 中,则返回 True

>>> from enum import Flag, auto
>>> class Color(Flag):
...     RED = auto()
...     GREEN = auto()
...     BLUE = auto()
...
>>> purple = Color.RED | Color.BLUE
>>> white = Color.RED | Color.GREEN | Color.BLUE
>>> Color.GREEN in purple
False
>>> Color.GREEN in white
True
>>> purple in white
True
>>> white in purple
False
__iter__(self)

返回所有包含的非别名成员

>>> list(Color.RED)
[<Color.RED: 1>]
>>> list(purple)
[<Color.RED: 1>, <Color.BLUE: 4>]

在 3.11 版本中添加。

__len__(self)

返回标志中的成员数量

>>> len(Color.GREEN)
1
>>> len(white)
3

在 3.11 版本中添加。

__bool__(self)

如果标志中存在任何成员,则返回 True,否则返回 False

>>> bool(Color.GREEN)
True
>>> bool(white)
True
>>> black = Color(0)
>>> bool(black)
False
__or__(self, other)

返回当前标志与 other 进行二进制或运算的结果

>>> Color.RED | Color.GREEN
<Color.RED|GREEN: 3>
__and__(self, other)

返回当前标志与 other 进行二进制与运算的结果

>>> purple & white
<Color.RED|BLUE: 5>
>>> purple & Color.GREEN
<Color: 0>
__xor__(self, other)

返回当前标志与 other 进行二进制异或运算的结果

>>> purple ^ white
<Color.GREEN: 2>
>>> purple ^ Color.GREEN
<Color.RED|GREEN|BLUE: 7>
__invert__(self)

返回 type(self) 中但不在 self 中的所有标志

>>> ~white
<Color: 0>
>>> ~purple
<Color.GREEN: 2>
>>> ~Color.RED
<Color.GREEN|BLUE: 6>
_numeric_repr_()

用于格式化任何剩余的未命名数值的函数。默认为值的 repr;常见的选择是 hex()oct()

备注

autoFlag 一起使用会导致整数值为 2 的幂,从 1 开始。

在 3.11 版本中更改: 零值标志的 repr() 已更改。现在是:

>>> Color(0) 
<Color: 0>
class enum.IntFlag

IntFlagFlag 相同,但其成员也是整数,并且可以在任何可以使用整数的地方使用。

>>> from enum import IntFlag, auto
>>> class Color(IntFlag):
...     RED = auto()
...     GREEN = auto()
...     BLUE = auto()
...
>>> Color.RED & 2
<Color: 0>
>>> Color.RED | 2
<Color.RED|GREEN: 3>

如果对 IntFlag 成员执行任何整数运算,结果将不是 IntFlag

>>> Color.RED + 2
3

如果对 IntFlag 成员执行 Flag 操作,且

  • 结果是有效的 IntFlag:则返回一个 IntFlag

  • 结果不是有效的 IntFlag:结果取决于 FlagBoundary 的设置。

未命名的零值标志的 repr() 已更改。现在是

>>> Color(0)
<Color: 0>

备注

IntFlag 中使用 auto 会生成从 1 开始的 2 的幂的整数。

在 3.11 版本中更改: __str__() 现在是 int.__str__(),以更好地支持 _替换现有常量_ 的用例。__format__() 出于同样的原因,已经是 int.__format__()

IntFlag 取反现在返回一个正值,该值是给定标志中未包含的所有标志的并集,而不是负值。这与现有的 Flag 行为一致。

class enum.ReprEnum

ReprEnum 使用 repr() of Enum,但使用混合数据类型的 str()

继承自 ReprEnum 以保留混合数据类型的 str() / format(),而不是使用 Enum 的默认 str()

在 3.11 版本中添加。

class enum.EnumCheck

EnumCheck 包含 verify() 装饰器使用的选项,以确保各种约束;失败的约束将导致 ValueError

UNIQUE

确保每个值只有一个名称

>>> from enum import Enum, verify, UNIQUE
>>> @verify(UNIQUE)
... class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3
...     CRIMSON = 1
Traceback (most recent call last):
...
ValueError: aliases found in <enum 'Color'>: CRIMSON -> RED
CONTINUOUS

确保最低值成员和最高值成员之间没有缺失的值

>>> from enum import Enum, verify, CONTINUOUS
>>> @verify(CONTINUOUS)
... class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 5
Traceback (most recent call last):
...
ValueError: invalid enum 'Color': missing values 3, 4
NAMED_FLAGS

确保任何标志组/掩码仅包含命名标志 – 当值被指定而不是由 auto() 生成时非常有用

>>> from enum import Flag, verify, NAMED_FLAGS
>>> @verify(NAMED_FLAGS)
... class Color(Flag):
...     RED = 1
...     GREEN = 2
...     BLUE = 4
...     WHITE = 15
...     NEON = 31
Traceback (most recent call last):
...
ValueError: invalid Flag 'Color': aliases WHITE and NEON are missing combined values of 0x18 [use enum.show_flag_values(value) for details]

备注

CONTINUOUS 和 NAMED_FLAGS 旨在与整数值成员一起使用。

在 3.11 版本中添加。

class enum.FlagBoundary

FlagBoundary 控制 Flag 及其子类中如何处理超出范围的值。

STRICT

超出范围的值会导致引发 ValueError。这是 Flag 的默认设置

>>> from enum import Flag, STRICT, auto
>>> class StrictFlag(Flag, boundary=STRICT):
...     RED = auto()
...     GREEN = auto()
...     BLUE = auto()
...
>>> StrictFlag(2**2 + 2**4)
Traceback (most recent call last):
...
ValueError: <flag 'StrictFlag'> invalid value 20
    given 0b0 10100
  allowed 0b0 00111
CONFORM

超出范围的值会删除无效值,留下有效的 Flag

>>> from enum import Flag, CONFORM, auto
>>> class ConformFlag(Flag, boundary=CONFORM):
...     RED = auto()
...     GREEN = auto()
...     BLUE = auto()
...
>>> ConformFlag(2**2 + 2**4)
<ConformFlag.BLUE: 4>
EJECT

超出范围的值会失去其 Flag 成员资格,并恢复为 int

>>> from enum import Flag, EJECT, auto
>>> class EjectFlag(Flag, boundary=EJECT):
...     RED = auto()
...     GREEN = auto()
...     BLUE = auto()
...
>>> EjectFlag(2**2 + 2**4)
20
KEEP

保留超出范围的值,并保留 Flag 成员资格。这是 IntFlag 的默认设置

>>> from enum import Flag, KEEP, auto
>>> class KeepFlag(Flag, boundary=KEEP):
...     RED = auto()
...     GREEN = auto()
...     BLUE = auto()
...
>>> KeepFlag(2**2 + 2**4)
<KeepFlag.BLUE|16: 20>

在 3.11 版本中添加。

class enum.EnumDict

EnumDictdict 的子类,用作定义枚举类的命名空间(请参见准备类命名空间)。它被公开以允许具有高级行为的 EnumType 的子类,例如每个成员具有多个值。它应该使用正在创建的枚举类的名称调用,否则将无法正确处理私有名称和内部类。

请注意,只有 MutableMapping 接口 (__setitem__()update()) 被重写。可能会使用其他 dict 操作(如 |=)绕过检查。

member_names

成员名称列表。

3.13 版本中新增。


支持的 __dunder__ 名称

__members__member_namemember 项的只读有序映射。它仅在类上可用。

如果指定了 __new__(),则必须创建并返回枚举成员;设置成员的 _value_ 也是一个非常好的主意。一旦所有成员都被创建,它就不再被使用。

支持的 _sunder_ 名称

  • _add_alias_() – 添加一个新名称作为现有成员的别名。

  • _add_value_alias_() – 将新值作为现有成员的别名添加。

  • _name_ – 成员的名称

  • _value_ – 成员的值;可以在 __new__ 中设置

  • _missing_() – 当找不到值时使用的查找函数;可以被重写

  • _ignore_ – 一个名称列表,可以是 liststr,这些名称不会被转换为成员,并且会从最终的类中移除

  • _order_ – 不再使用,为了向后兼容而保留(类属性,在类创建期间移除)

  • _generate_next_value_() – 用于获取枚举成员的适当值;可以被重写

    备注

    对于标准的 Enum 类,选择的下一个值是所见到的最大值加一。

    对于 Flag 类,选择的下一个值将是下一个最大的 2 的幂。

  • 虽然 _sunder_ 名称通常保留用于 Enum 类的进一步开发,并且不能使用,但有些是明确允许的

3.6 版本新增: _missing_, _order_, _generate_next_value_

3.7 版本新增: _ignore_

3.13 版本新增: _add_alias_, _add_value_alias_, _repr_*


实用工具和装饰器

class enum.auto

auto 可以用来代替值。如果使用,Enum 机制将调用 Enum_generate_next_value_() 来获取适当的值。对于 EnumIntEnum,该适当的值将是最后一个值加一;对于 FlagIntFlag,它将是大于最大值的第一个 2 的幂;对于 StrEnum,它将是成员名称的小写版本。如果将 auto() 与手动指定的值混合使用,则必须小心。

只有在赋值的顶层时,才会解析 auto 实例

  • FIRST = auto() 将起作用 (auto() 被替换为 1);

  • SECOND = auto(), -2 将起作用 (auto 被替换为 2,因此 2, -2 用于创建 SECOND 枚举成员;

  • THREE = [auto(), -3]起作用(<auto instance>, -3 用于创建 THREE 枚举成员)

在 3.11.1 版本中变更: 在之前的版本中,auto() 必须是赋值行中唯一的内容才能正常工作。

可以重写 _generate_next_value_ 以自定义 auto 使用的值。

备注

在 3.13 中,默认的 _generate_next_value_ 将始终返回最大的成员值加 1,并且如果任何成员是不兼容的类型,则会失败。

@enum.property

一个类似于内置 property 的装饰器,但专门用于枚举。它允许成员属性具有与成员本身相同的名称。

备注

property 和成员必须在单独的类中定义;例如,valuename 属性在 Enum 类中定义,而 Enum 子类可以使用名称 valuename 定义成员。

在 3.11 版本中添加。

@enum.unique

一个专门用于枚举的 class 装饰器。它搜索枚举的 __members__,收集它找到的任何别名;如果找到任何别名,则会引发包含详细信息的 ValueError

>>> from enum import Enum, unique
>>> @unique
... class Mistake(Enum):
...     ONE = 1
...     TWO = 2
...     THREE = 3
...     FOUR = 3
...
Traceback (most recent call last):
...
ValueError: duplicate values found in <enum 'Mistake'>: FOUR -> THREE
@enum.verify

一个专门用于枚举的 class 装饰器。来自 EnumCheck 的成员用于指定应该在装饰的枚举上检查哪些约束。

在 3.11 版本中添加。

@enum.member

一个在枚举中使用的装饰器:它的目标将成为一个成员。

在 3.11 版本中添加。

@enum.nonmember

一个在枚举中使用的装饰器:它的目标将不会成为一个成员。

在 3.11 版本中添加。

@enum.global_enum

一个用于更改枚举的 str()repr() 的装饰器,以显示其成员属于模块而不是其类。只有在枚举成员导出到模块全局命名空间时才应使用(例如,请参阅 re.RegexFlag)。

在 3.11 版本中添加。

enum.show_flag_values(value)

返回包含在标志 value 中的所有 2 的幂整数的列表。

在 3.11 版本中添加。


说明

IntEnumStrEnumIntFlag

这三种枚举类型被设计为现有基于整数和字符串的值的直接替代品;因此,它们具有额外的限制

  • __str__ 使用枚举成员的值而不是名称

  • __format__,因为它使用 __str__,也将使用枚举成员的值而不是其名称

如果您不需要/不想要这些限制,您可以通过自己混入 intstr 类型来创建自己的基类

>>> from enum import Enum
>>> class MyIntEnum(int, Enum):
...     pass

或者你可以在你的枚举中重新分配相应的 str() 等。

>>> from enum import Enum, IntEnum
>>> class MyIntEnum(IntEnum):
...     __str__ = Enum.__str__