Le cas de StrEnum dans Python 3.11

Dec 21 2022
Avec la mise à jour de Python 3.11, nous avons rencontré un changement subtil dans le comportement d'Enum.
Au lieu d'un serpent, pourquoi pas une image de la lune ?

Avec la mise à jour de Python 3.11, nous avons rencontré un changement subtil dans le comportement d'Enum. C'est grâce à la PEP 663 — Standardisation des comportements Enum str(), repr() et format() .

Avant Python 3.11

Avant Python 3.11, une énumération de chaîne, comme illustré ci-dessous, renvoyait la valeur d'une entrée dans l'énumération lorsqu'elle était utilisée via format ou une chaîne f, mais pas lors d'un appel implicite __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'

Dans Python 3.11, StrEnum a été ajouté à la bibliothèque standard. L'utiliser au lieu du style d'énumération susmentionné rend le comportement plus évident.

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