Trường hợp của StrEnum trong Python 3.11

Dec 21 2022
Với bản cập nhật lên Python 3.11, chúng tôi đã nhận thấy một sự thay đổi nhỏ trong cách hoạt động của Enum.
Thay vì một con rắn, tại sao không phải là một hình ảnh của mặt trăng?

Với bản cập nhật lên Python 3.11, chúng tôi đã nhận thấy một sự thay đổi nhỏ trong cách hoạt động của Enum. Điều này là nhờ PEP 663 — Chuẩn hóa các hành vi Enum str(), repr() và format() .

Trước Python 3.11

Trước Python 3.11, một chuỗi enum như được hiển thị bên dưới sẽ trả về giá trị của một mục nhập trong enum khi được sử dụng thông qua định dạng hoặc chuỗi f chứ không phải khi gọi ngầm định __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'

Trong Python 3.11, StrEnum đã được thêm vào thư viện chuẩn. Sử dụng điều đó thay vì kiểu enums đã nói ở trên sẽ tạo ra hành vi rõ ràng hơn.

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