Difference between Enum and IntEnum in Python

From the python Docs:

Enum: Base class for creating enumerated constants.

and:

IntEnum: Base class for creating enumerated constants that are also subclasses of int.

it says that members of an IntEnum can be compared to integers; by extension, integer enumerations of different types can also be compared to each other.

look at the below example:

class Shape(IntEnum):
    CIRCLE = 1
    SQUARE = 2

class Color(Enum):
    RED = 1
    GREEN = 2

Shape.CIRCLE == Color.RED
>> False

Shape.CIRCLE == 1
>>True

and they will behave same as an integer:

['a', 'b', 'c'][Shape.CIRCLE]
>> 'b'

intEnum give the following advantages:

  1. It ensures the members must be integer:

    ValueError: invalid literal for int() with base 10
    

    will be raise if this is not satisfied.

  2. It allows comparison with integer:

    import enum
    
    class Shape(enum.IntEnum):
        CIRCLE = 1
        SQUARE = 2
    
    class Color(enum.Enum):
        RED = 1
        GREEN = 2
    
    print(Shape.CIRCLE == 1)
    # >> True
    
    print(Color.RED == 1)
    # >> False
    

IntEnum is used to insure that members must be integer i.e.

class State(IntEnum):
    READY = 'a'
    IN_PROGRESS = 'b'
    FINISHED = 'c'
    FAILED = 'd'

This will raise an exception:

ValueError: invalid literal for int() with base 10: 'a'