Kasus untuk StrEnum di Python 3.11

Dec 21 2022
Dengan pembaruan ke Python 3.11, kami mengalami perubahan halus dalam perilaku Enum.
Alih-alih ular, mengapa bukan gambar bulan?

Dengan pembaruan ke Python 3.11, kami mengalami perubahan halus dalam perilaku Enum. Ini berkat PEP 663 — Menstandarkan perilaku Enum str(), repr(), dan format() .

Sebelum Python 3.11

Sebelum Python 3.11, string enum seperti yang ditunjukkan di bawah ini akan mengembalikan nilai entri di enum saat digunakan melalui format atau f-string tetapi tidak saat memanggil secara implisit __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'

Di Python 3.11, StrEnum ditambahkan ke pustaka standar. Menggunakan itu alih-alih gaya enum yang disebutkan di atas membuat perilaku lebih jelas.

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