Случай с StrEnum в Python 3.11

Dec 21 2022
С обновлением до Python 3.11 мы столкнулись с тонким изменением поведения Enum.
Вместо змеи почему бы не изображение луны?

С обновлением до Python 3.11 мы столкнулись с тонким изменением поведения Enum. Это благодаря PEP 663 — Стандартизация поведения Enum str(), repr() и format() .

До Python 3.11

До Python 3.11 строковое перечисление, как показано ниже, возвращало значение записи в перечислении при использовании через формат или f-строку, но не при неявном вызове __str__().

# Python 3.10

from enum import Enum

class Foo(str, Enum):
    BAR = "bar"

x = Foo.BAR

x               # Outputs <Foo.BAR: 'bar'>
f"{x}"          # Outputs 'bar'
"{}".format(x)  # Outputs 'bar'
str(x)          # Outputs 'Foo.BAR'
x.value         # Outputs 'bar'Python 3.11

# Python 3.11

from enum import Enum

class Foo(str, Enum):
    BAR = "bar"

x = Foo.BAR

x               # Outputs <Foo.BAR: 'bar'>
f"{x}"          # Outputs 'Foo.BAR'
"{}".format(x)  # Outputs 'Foo.BAR'
str(x)          # Outputs 'Foo.BAR'
x.value         # Outputs 'bar'

В Python 3.11 StrEnum был добавлен в стандартную библиотеку. Использование этого вместо вышеупомянутого стиля перечислений делает поведение более очевидным.

# Python 3.11

from enum import StrEnum, auto

class Foo(StrEnum):
    BAR = auto()

x = Foo.BAR

x               # Outputs <Foo.BAR: 'bar'>
f"{x}"          # Outputs 'bar'
"{}".format(x)  # Outputs 'bar'
str(x)          # Outputs 'bar'
x.value         # Outputs 'bar'