O caso de StrEnum em Python 3.11

Dec 21 2022
Com a atualização para o Python 3.11, encontramos uma mudança sutil em como o Enum se comporta.
Em vez de uma cobra, por que não uma imagem da lua?

Com a atualização para o Python 3.11, encontramos uma mudança sutil em como o Enum se comporta. Isso se deve ao PEP 663 — padronização dos comportamentos Enum str(), repr() e format() .

Antes do Python 3.11

Antes do Python 3.11, uma string enum conforme mostrado abaixo retornaria o valor de uma entrada na enum quando usada por meio de formato ou uma string f, mas não ao chamar implicitamente __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'

No Python 3.11, StrEnum foi adicionado à biblioteca padrão. Usar isso em vez do estilo de enums mencionado anteriormente torna o comportamento mais óbvio.

# 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'