Làm thế nào để bạn khai báo một biến enum trong python?

Bài đăng này sẽ khám phá mô-đun Python enum, một công cụ mạnh mẽ để xử lý các tập dữ liệu không thay đổi

Đây không chỉ là phần không thể thiếu để phát triển phần mềm tổng quát mà còn là thứ bạn sẽ thấy thường thấy trong các trò chơi – khiến nó trở thành một kỹ năng và nền tảng quan trọng để học bất kể mục tiêu mã hóa cá nhân của bạn là gì.

Hãy đi sâu vào và khám phá chủ đề hấp dẫn này về cách sử dụng enum trong Python

Mục lục

điều kiện tiên quyết

Người đọc dự kiến ​​​​sẽ có kiến ​​​​thức làm việc về ngôn ngữ lập trình Python. Làm quen với cách viết các lớp cũng sẽ hữu ích vì các enum Python được triển khai dưới dạng các lớp Python

Nếu bạn cần tài liệu Python thân thiện với người mới bắt đầu, chúng tôi khuyên bạn nên xem các hướng dẫn Python khác của chúng tôi hoặc xem Python Mini-Degree – một giáo trình đầy đủ tính năng gồm các khóa học tập trung vào mọi thứ bạn có thể muốn để bắt đầu

Đối với các nhà giáo dục muốn đưa Python vào lớp học, chúng tôi cũng khuyên bạn nên xem Zenva Schools. Nền tảng K12 này cung cấp các khóa học trực tuyến về Python [và các chủ đề phổ biến khác] cùng với các công cụ để quản lý lớp học, báo cáo về tiến độ của học sinh, v.v.

XÂY DỰNG TRÒ CHƠI CỦA RIÊNG BẠN

Nhận hơn 250 khóa học mã hóa cho

$1

TÌM HIỂU THÊM

CHỈ CÓ SẴN TRONG THỜI GIAN GIỚI HẠN

Python Enum là gì?

Hãy thảo luận về Python enum là gì. Viết tắt của kiểu liệt kê, tính năng ngôn ngữ này xác định một tập hợp các tên được liên kết với các giá trị không đổi như số, chuỗi, v.v. Các enum Python rất hữu ích để biểu diễn dữ liệu đại diện cho một tập hợp trạng thái hữu hạn, chẳng hạn như ngày trong tuần, tháng trong năm, v.v.

Chúng đã được thêm vào Python 3. 4 qua PEP 435. Tuy nhiên, nó có sẵn tất cả các cách trở lại 2. 4 qua pypy. Như vậy, bạn có thể mong đợi chúng trở thành một yếu tố chính khi bạn khám phá lập trình Python

Ví dụ đơn giản

Chúng tôi định nghĩa một lớp enum đơn giản [i. e. một lớp bắt nguồn từ Enum] chứa các tháng trong năm. Mỗi tháng [tôi. e. thành viên enum] được gán một hằng số duy nhất

from enum import Enum, unique, Flag

class Months[Enum] :
    JANUARY=1
    FEBRUARY=2
    MARCH =  3
    APRIL=4
    MAY=5
    JUNE=6
    JULY=7
    AUGUST=8
    SEPTEMBER=9
    OCTOBER=10
    NOVEMBER=11
    DECEMBER=12

In ra các thành viên của Python enum

Có một số cách chúng ta có thể làm điều này

# by numerical index
print [Months[7]
Months.JULY

# item index
print [Months['JULY']]
Months.JULY

# by name
print [Months.JULY]
Months.JULY

# by name
print [Months.JULY.name]
JULY

# by value
print [Months.JULY.value]
JULY

Đảm bảo tính duy nhất

Thêm một trình trang trí @unique vào lớp, đảm bảo rằng các phần tử trùng lặp không tồn tại trong Python enum

from enum import Enum, unique, Flag

>> @unique
.. class Months[Enum] :
..     JANUARY=1
..     JANUARY=1
..     FEBRUARY=2
..     MARCH =  3
..     APRIL=4
..     MAY=5
..     JUNE=6
..     JULY=7
..     AUGUST=8
..     SEPTEMBER=9
..     OCTOBER=10
..     NOVEMBER=11
..     DECEMBER=12
.. 
Traceback [most recent call last]:
  File "", line 2, in 
  File "", line 4, in Months
  File "/home/raghavan/anaconda3/lib/python3.8/enum.py", line 112, in __setitem__
    raise TypeError['Attempted to reuse key: %r' % key]
TypeError: Attempted to reuse key: 'JANUARY'

TypeError xảy ra khi trình thông dịch Python cố tạo Python enum này

Cách khác để tạo Enum

Lớp Python Enum có thể gọi được và API chức năng sau có thể được gọi để tạo nó

>> quarter1= Enum['Q1', [['January', 1], ['February', 2], ['March', 3]]]
>> print [quarter1[3]]
Q1.March

# can also be written as
>> quarter1= Enum['Q1', ['January February March']]
>> print [quarter1]


# item access
>>> quarter1['January']


>>> Quarter1.March


>>> Quarter1.March.value
3

Lặp lại các phần tử

cho vòng lặp

Có thể sử dụng vòng lặp for đơn giản để in ra các phần tử.

# simple for loop
for month in [Months] :
    print [month]

Months.JANUARY
Months.FEBRUARY
Months.MARCH
Months.APRIL
Months.MAY
Months.JUNE
Months.JULY
Months.AUGUST
Months.SEPTEMBER
Months.OCTOBER
Months.NOVEMBER
Months.DECEMBER

Thuộc tính __members__ attribute

__members__ là thuộc tính cấp lớp chỉ đọc cung cấp ánh xạ từ tên đến thành viên. Nó có thể được lặp đi lặp lại để tạo ra một đầu ra tương tự như trên

# iteration over elements
for name, member in Months.__members__.items[]:
    print [name, member]

JANUARY Months.JANUARY
FEBRUARY Months.FEBRUARY
MARCH Months.MARCH
APRIL Months.APRIL
MAY Months.MAY
JUNE Months.JUNE
JULY Months.JULY
AUGUST Months.AUGUST
SEPTEMBER Months.SEPTEMBER
OCTOBER Months.OCTOBER
NOVEMBER Months.NOVEMBER
DECEMBER Months.DECEMBER

băm

Python enums có thể được sử dụng làm khóa từ điển như sau

>> months = {}
>> months[Months.JULY] = 'Many Birthdays'
>> months[Months.JANUARY] = 'First Month of the Year'

>> print [months[Months[7]]]
Many Birthdays

Giá trị tự động

Các giá trị tương ứng với tên có thể được điền tự động bằng cách sử dụng auto[] như minh họa bên dưới.

# member values using auto
from enum import auto
class Quarter[Enum]:
    Q1 = auto[]
    Q2 = auto[]
    Q3 = auto[]
    Q4 = auto[]


for qtr in Quarter:
    print [qtr.value]

# Output
1
2
3
4

Các giá trị, theo mặc định, là số. Tuy nhiên, chúng có thể được chuyển đổi thành các giá trị chuỗi bằng cách ghi đè _generate_next_value_ trong lớp

________số 8_______

Bảng liệt kê có nguồn gốc

Lá cờ

Flag khá giống với Enum ngoại trừ nó có hỗ trợ cho các hoạt động bitwise [. , &, ^, ~]. Các toán tử này có thể được sử dụng để kết hợp nhiều phần tử enum Python thành một mặt nạ

Lớp Hành tinh có nguồn gốc từ Flag và chứa 8 hành tinh hiện được Liên minh Thiên văn Quốc tế công nhận. Các giá trị của các phần tử được yêu cầu là bội số của hai trong khi các kết hợp không cần tuân theo hạn chế đó

class Planets[Flag]:
    MERCURY = 1
    VENUS   = 2
    EARTH   = 4
    MARS    = 8
    SATURN  = 10
    URANUS  = 12
    NEPTUNE = 14

my_planet = {
              Planets.MERCURY: "Red Planet",
              Planets.EARTH:   "People !!!!!",
              Planets.MARS:    "Martians !!!!"
            }

# bitwise OR mask => Mercury / Earth.
mercury_earth = Planets.MERCURY|Planets.EARTH

# we check which planets in the given dictionary are
# MARS or EARTH by doing a Bitwise AND with the mask above.

for planet_name in myplanet.keys[] :
    found = bool[planet_name & mercury_earth]
    print ["Found:" + str[planet_name] + ":" + str[found]]

# Output

Found:Planets.MERCURY:True
Found:Planets.EARTH:True
Found:Planets.MARS:False
  1. Lớp Hành tinh bắt nguồn từ Cờ . Nó chứa tên và giá trị của 8 hành tinh.
  2. Từ điển my_planet chứa tên liệt kê của Sao Thủy, Trái đất và Sao Hỏa làm khóa.
  3. Tạo mặt nạ bit bằng cách HOẶC -ing Các hành tinh. MERCURY và các hành tinh. TRÁI ĐẤT .
  4. Lặp lại các tên hành tinh trong từ điển và thực hiện Hiểu một chút VÀ giữa tên hành tinh và mặt nạ được tạo ở Bước 3. Chuyển đổi giá trị kết quả thành giá trị boolean .
  5. Thao tác bit & sẽ trả về True khi khóa phần tử khớp với Planet. THỦY NGÂN hoặc các hành tinh. TRÁI ĐẤTSai đối với bất kỳ hành tinh nào khác. Đầu ra phản ánh điều này.

IntEnum

IntEnum là một Python enum dẫn xuất cũng bắt nguồn từ int. Do đó, nó hỗ trợ các hoạt động int. Nó cung cấp các phép so sánh có thứ tự mà lớp Python Enum không cung cấp

# by numerical index
print [Months[7]
Months.JULY

# item index
print [Months['JULY']]
Months.JULY

# by name
print [Months.JULY]
Months.JULY

# by name
print [Months.JULY.name]
JULY

# by value
print [Months.JULY.value]
JULY
0
  1. Kế thừa quý từ Enum
  2. Hãy thử so sánh số “

Chủ Đề