El caso de StrEnum en Python 3.11

Dec 21 2022
Con la actualización a Python 3.11, nos encontramos con un cambio sutil en el comportamiento de Enum.
En lugar de una serpiente, ¿por qué no una imagen de la luna?

Con la actualización a Python 3.11, nos encontramos con un cambio sutil en el comportamiento de Enum. Esto es gracias a PEP 663 — Estandarizar los comportamientos de Enum str(), repr() y format() .

Antes de Python 3.11

Antes de Python 3.11, una enumeración de cadena como se muestra a continuación devolvería el valor de una entrada en la enumeración cuando se usa a través de formato o una cadena f, pero no cuando se llama implícitamente a __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'

En Python 3.11, StrEnum se agregó a la biblioteca estándar. Usar eso en lugar del estilo de enumeraciones antes mencionado hace que el comportamiento sea más obvio.

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