Logo Zephyrnet

Python Enum: Cách xây dựng bảng liệt kê trong Python – KDnuggets

Ngày:

Python Enum: Cách xây dựng bảng liệt kê trong Python
Hình ảnh của Tác giả
 

Nếu bạn đã lập trình bằng ngôn ngữ như C++ hoặc Java, bạn có thể đã sử dụng enum để tạo các hằng số được đặt tên. Enum rất hữu ích khi bạn có một biến nhận một trong số giá trị cố định—thường liên quan đến các ngày trong tuần, điểm học sinh, trạng thái đơn hàng, v.v.

Tuy nhiên, Python không có kiểu dữ liệu enum rõ ràng. Nhưng bạn có thể sử dụng mô-đun enum trong thư viện chuẩn Python để tạo bảng liệt kê. Và hướng dẫn này sẽ dạy bạn cách thực hiện. 

Băt đâu nao!

Enum là viết tắt của “liệt kê” và bao gồm một tập hợp các hằng số được đặt tên được xác định trước. Các hằng số này thường có liên quan với nhau. Các ví dụ phổ biến bao gồm các tháng trong một năm, các ngày trong tuần, điểm số, trạng thái thứ tự và nhiệm vụ. 

Tóm lại: Một enum về cơ bản là một tập hợp các hằng số liên quan, trong đó mỗi hằng số có một tên có ý nghĩa gắn liền với nó.

Trong Python, bạn có thể tạo enum bằng cách sử dụng mô-đun enum (điều mà chúng tôi sẽ thực hiện ngay!).

Tại sao nên sử dụng Enum

Sử dụng enum giúp cải thiện độ rõ ràng và khả năng bảo trì của mã. Đây là cách thực hiện: 

  • Enums nâng cao độ rõ ràng của mã bằng cách thay thế các số hoặc chuỗi ma thuật bằng các nhãn có ý nghĩa. Chúng cũng làm cho mã trở nên tự ghi lại nhiều hơn vì tên của các thành viên enum truyền đạt mục đích của chúng. 
  • Enums cải thiện khả năng bảo trì mã bằng cách cung cấp một cách đơn giản để xác định và quản lý các hằng số liên quan. 
  • Bằng cách hạn chế các phép gán biến chỉ ở các giá trị enum hợp lệ, enum cũng đảm bảo an toàn cho kiểu. 
  • Enum tạo điều kiện dễ dàng lặp lại và so sánh các hằng số liên quan.

Bây giờ hãy tạo bảng liệt kê đầu tiên bằng Python.

Chúng ta sẽ tạo một TaskStatus enum có bốn tên và giá trị sau:

 

Python Enum: Cách xây dựng bảng liệt kê trong Python
Hình ảnh của Tác giả
 

Đầu tiên, chúng tôi nhập Enum class từ mô-đun enum để tạo enum. 

Sau đó chúng ta định nghĩa một lớp mới TaskStatus kế thừa từ Enum để tạo một bảng liệt kê. Mỗi thành viên được xác định bằng một tên duy nhất và một giá trị tùy chọn như sau:

from enum import Enum
	 
class TaskStatus(Enum):
    TODO = 0
    IN_PROGRESS = 1
    DONE = 2
    ABANDONED = -1

 

Tất cả các thành viên enum mà chúng ta tạo đều là phiên bản của lớp Enum. Bạn có thể xác minh nó bằng cách gọi isinstance() chức năng như được hiển thị:

print(isinstance(TaskStatus.TODO,Enum))

 

Output >>> True

 

Hãy in ra tất cả các thành viên trong TaskStatus enum bằng cách đưa nó vào danh sách:

print(list(TaskStatus))

 

Bạn sẽ thấy kết quả sau:

Output >>>

[<TaskStatus.TODO: 0>, <TaskStatus.IN_PROGRESS: 1>, <TaskStatus.DONE: 2>, <TaskStatus.ABANDONED: -1>]

 

Tất cả các thành viên enum đều có têngiá trị. Có nghĩa là bạn có thể truy cập các thành viên enum bằng tên của họ, như TaskStatus.TODO. Hoặc bạn truy cập chúng theo giá trị, như TaskStatus(0).

Bây giờ chúng ta đã tạo một cách đơn giản TaskStatus enum, hãy cùng tìm hiểu cách thực hiện các tác vụ đơn giản như lặp qua các thành viên enum.

Lặp lại Enums

Trong Python, bạn có thể làm việc với enum khá giống với cách bạn làm việc với bất kỳ iterable nào. Ví dụ: bạn có thể sử dụng len() chức năng đếm số lượng thành viên enum:

num_statuses = len(TaskStatus)
print(num_statuses)

 

Output >>> 4

 

Bạn cũng có thể lặp lại các enum giống như cách bạn làm với Python, chẳng hạn như list. Trong vòng lặp for sau đây, chúng ta truy cập cả tên và giá trị của từng thành viên enum và in chúng ra:

for status in TaskStatus:
    print(status.name, status.value)

 

Đây là đầu ra:

Output >>> 

TODO 0
IN_PROGRESS 1
DONE 2
ABANDONED -1

Đặt hàng trong Enums

Trong ví dụ, trạng thái và giá trị số tương ứng như sau:

  • VIỆC CẦN LÀM: 0
  • IN_TIẾN HÀNH: 1
  • HOÀN THÀNH: 2
  • BỎ CUỘC: -1

Nhưng bạn cũng có thể sử dụng thứ tự mặc định bằng cách sử dụng auto() chức năng trợ giúp. Khi bạn làm như vậy, nếu bạn có 'n' thành viên trong enum thì các giá trị được gán là từ 1 đến n. Nhưng bạn có thể chuyển vào giá trị bắt đầu, chẳng hạn như k, auto(k) để việc liệt kê bắt đầu từ k và tăng lên k + n.

Hãy sửa đổi TaskStatus enum như được hiển thị:

from enum import Enum, auto

class TaskStatus(Enum):
    TODO = auto()
    IN_PROGRESS = auto()
    DONE = auto()
    ABANDONED = auto()

 

Bây giờ hãy in ra các thành viên:

print(list(TaskStatus))

 

Chúng tôi thấy rằng các giá trị từ 1 đến 4 như mong đợi:

Output >>>

[<TaskStatus.TODO: 1>, <TaskStatus.IN_PROGRESS: 2>, <TaskStatus.DONE: 3>, <TaskStatus.ABANDONED: 4>]

Bây giờ chúng ta hãy xây dựng trên TaskStatus enum mà chúng tôi có. Tạo một tệp task.py trong thư mục làm việc của bạn với phiên bản enum sau:

# task.py

from enum import Enum

class TaskState(Enum):
    TODO = 0
    IN_PROGRESS = 1
    DONE = 2
    ABANDONED = -1

 

Giả sử chúng ta có một nhiệm vụ có tên và trạng thái hiện tại. Và sự chuyển đổi hợp lệ giữa các trạng thái được hiển thị:

 

Python Enum: Cách xây dựng bảng liệt kê trong Python
Hình ảnh của Tác giả
 

Hãy tạo ra một Task lớp học:

class Task:
    def __init__(self, name, state):
        self.name = name
        self.state = state
    
    def update_state(self, new_state):
        # Define valid state transitions based on the current state
        valid_transitions = {
        	TaskState.TODO: [TaskState.IN_PROGRESS, TaskState.ABANDONED],
        	TaskState.IN_PROGRESS: [TaskState.DONE, TaskState.ABANDONED],
        	TaskState.DONE: [],
        	TaskState.ABANDONED: []
    	}
   	 
        # Check if the new state is a valid transition from the current state
        if new_state in valid_transitions[self.state]:
            self.state = new_state
        else:
            raise ValueError(f"Invalid state transition from {self.state.name} to {new_state.name}")

 

Chúng ta có một update_status() phương thức kiểm tra xem việc chuyển đổi sang trạng thái mới có hợp lệ với trạng thái hiện tại hay không. Đối với các chuyển đổi không hợp lệ, ngoại lệ ValueError sẽ xuất hiện.

Đây là một trường hợp của Task class: tác vụ “Viết báo cáo” với trạng thái TODO:

# Create a new task with the initial state "To Do"
task = Task("Write Report", TaskState.TODO)

# Print the task details
print(f"Task Name: {task.name}")
print(f"Current State: {task.state.name}")

 

Output >>>
Task Name: Write Report
Current State: TODO

 

Việc cập nhật trạng thái của tác vụ thành IN_PROGRESS sẽ hoạt động vì đây là chuyển đổi trạng thái hợp lệ:

# Update the task state to "In Progress"
task.update_state(TaskState.IN_PROGRESS)
print(f"Updated State: {task.state.name}")

 

Output >>> Updated State: IN_PROGRESS

 

Và khi nhiệm vụ hoàn thành, chúng ta có thể cập nhật trạng thái của nó thành XONG:

# Update the task state to "DONE"
task.update_state(TaskState.DONE)
print(f"Updated State: {task.state.name}")

 

Output >>> Updated State: DONE

 

Nhưng nếu bạn cố cập nhật trạng thái thành trạng thái không hợp lệ, chẳng hạn như cố gắng cập nhật DONE thành TODO, bạn sẽ gặp phải ngoại lệ ValueError:

# Attempt to update the task state to an invalid state
task.update_state(TaskState.TODO)

 

Đây là dấu vết của ValueError được nêu ra do chuyển đổi trạng thái không hợp lệ từ DONE sang TODO:

Traceback (most recent call last):
  File "/home/balapriya/enums/task.py", line 46, in 
	task.update_state(TaskState.TODO)
  File "/home/balapriya/enums/task.py", line 30, in update_state
	raise ValueError(f"Invalid state transition from {self.state.name} to {new_state.name}")
ValueError: Invalid state transition from DONE to TODO

Trong hướng dẫn này, chúng ta đã học cách xây dựng các bảng liệt kê trong Python bằng cách mã hóa một enum TaskStatus đơn giản. Chúng tôi đã học cách truy cập các thành viên enum và lặp lại chúng. 

Ngoài ra, chúng tôi đã tìm hiểu cách hoạt động của thứ tự mặc định nếu bạn chọn sử dụng auto() hàm trợ giúp để đặt giá trị cho các thành viên enum. Sau đó, chúng tôi đã thử sử dụng enum TaskStatus trong một ví dụ hữu ích hơn. 

Bạn có thể tìm thấy ví dụ mã trên GitHub. Tôi sẽ sớm gặp lại các bạn trong một hướng dẫn Python khác. Cho đến lúc đó, chúc bạn viết mã vui vẻ!
 
 

Bala Priya C là một nhà phát triển và nhà văn kỹ thuật đến từ Ấn Độ. Cô ấy thích làm việc ở nơi giao thoa giữa toán học, lập trình, khoa học dữ liệu và sáng tạo nội dung. Các lĩnh vực chuyên môn và sở thích của cô bao gồm DevOps, khoa học dữ liệu và xử lý ngôn ngữ tự nhiên. Cô ấy thích đọc, viết, mã hóa và cà phê! Hiện tại, cô ấy đang nỗ lực học hỏi và chia sẻ kiến ​​thức của mình với cộng đồng nhà phát triển bằng cách viết các hướng dẫn, hướng dẫn cách thực hiện, các ý kiến, v.v.

tại chỗ_img

Tin tức mới nhất

tại chỗ_img