Короткий ответ Enum даёт именованный, замкнутый набор допустимых значений с проверкой на этапе использования через идентичность/принадлежность классу, тогда как обычные строки или числа-константы не защищают от опечаток, произвольных "левых" значений и не группируют связанные значения в единый, самодокументируемый тип. Как это работает подробнее class Status(Enum): PENDING = "pending"; PAID = "paid" создаёт класс, где Status.PENDING — это единственный объект-член с заданным значением; сравнение status == Status.PENDING явное и проверяется статическими анализаторами типов, а перечисление всех возможных значений доступно через list(Status). Числовые/строковые "магические" константы (STATUS_PENDING = "pending") синтаксически остаются обычными строками — ничто не мешает присвоить переменной произвольную строку, не входящую в предполагаемый набор. Пример кода Что использовать на практике Практика. Enum улучшает читаемость (order.status = Status.PAID нагляднее, чем order.status = "paid"), позволяет IDE подсказывать