Given the following enum:
class MyEnum(IntEnum): A = 0 B = 1 C = 2
How can I specify a default value. I want to be able to do:
my_val = MyEnum()
and havemy_val
be <MyEnum.A: 0>
Is this possible? I’ve tried customizing __new__
, __init__
, __call__
but I can’t get it to work.
Advertisement
Answer
MyEnum(..)
is handled by EnumMeta.__call__
. You need to override that method:
from enum import EnumMeta, IntEnum class DefaultEnumMeta(EnumMeta): default = object() def __call__(cls, value=default, *args, **kwargs): if value is DefaultEnumMeta.default: # Assume the first enum is default return next(iter(cls)) return super().__call__(value, *args, **kwargs) # return super(DefaultEnumMeta, cls).__call__(value, *args, **kwargs) # PY2 class MyEnum(IntEnum, metaclass=DefaultEnumMeta): # __metaclass__ = DefaultEnumMeta # PY2 with enum34 A = 0 B = 1 C = 2 assert MyEnum() is MyEnum.A assert MyEnum(0) is MyEnum.A assert MyEnum(1) is not MyEnum.A