Python 3.11'de StrEnum durumu

Dec 21 2022
Python 3.11 güncellemesiyle, Enum'un davranışında ince bir değişiklikle karşılaştık.
Yılan yerine neden ayın görüntüsü olmasın?

Python 3.11 güncellemesiyle, Enum'un davranışında ince bir değişiklikle karşılaştık. Bu , PEP 663 — Enum str(), repr() ve format() davranışlarını standartlaştırma sayesinde oldu .

Python 3.11'den Önce

Python 3.11'den önce, aşağıda gösterildiği gibi bir dize sıralaması, format veya bir f-dizesi aracılığıyla kullanıldığında enumdaki bir girişin değerini döndürürdü, ancak dolaylı olarak çağrıldığında değil __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'de standart kitaplığa StrEnum eklendi. Yukarıda belirtilen numaralandırma stili yerine bunu kullanmak, daha belirgin davranış sağlar.

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