Cách Enums trong Python cải thiện khả năng đọc mã

Spread the love

Enum là kiểu dữ liệu phổ biến trong các ngôn ngữ lập trình như C, C++ và Java. Chúng giúp bạn viết mã an toàn và dễ đọc hơn.

Trong Python, enum không phải lúc nào cũng được hỗ trợ. Tuy nhiên, kể từ phiên bản 3.4, Python hiện đã hỗ trợ enum. Bài viết này là hướng dẫn về cách tạo enum, cách sử dụng chúng và cách chúng cải thiện khả năng đọc mã.

Enums là gì và chúng làm gì?

Một enum hoặc enumeration là một kiểu dữ liệu được xác định bởi tập hợp các giá trị mà nó có thể nhận. Tập hợp các giá trị này được gọi là tập hợp các thành viên của nó. Enums cho phép bạn xác định các giá trị mà một biến có thể có ở phạm vi hẹp hơn. Điều này giúp bạn viết mã an toàn loại. Nó cũng cải thiện khả năng đọc.

Một số điều khoản cần biết

Khi chúng ta thảo luận về enum, có những thuật ngữ tôi nên định nghĩa trước tiên vì chúng ta sẽ sử dụng chúng rất nhiều. Đây là những thành viên và giá trị.

  • Thành viên: Đây là các hằng số được đặt tên tạo thành tập hợp các giá trị thuộc về enum. Ví dụ: enum Days có thể chứa các thành viên sau: Chủ Nhật, Thứ Hai, Thứ Ba, v.v.
  • Giá trị: Đây là các giá trị được sử dụng nội bộ để thể hiện rõ ràng từng thành viên enum. Điều này sẽ làm cho nó có thể thực hiện so sánh. Ví dụ: trong bảng liệt kê Ngày, Chủ Nhật có thể có giá trị là 0, Thứ Hai có giá trị là 1, Thứ Ba có giá trị là 2, v.v.

Bây giờ, chúng ta sẽ thảo luận về cách Enums cải thiện mã của bạn.

Enums cải thiện mã của bạn như thế nào

Enums cải thiện mã của bạn và làm cho mã dễ đọc hơn và ít xảy ra lỗi hơn. Dưới đây là một số lý do tại sao bạn nên sử dụng chúng:

  • Enums cho phép bạn xác định rõ ràng những giá trị nào mà một đối số của biến hoặc hàm mong đợi. Việc làm rõ ý định của bạn bằng đối số biến hoặc hàm sẽ giúp mọi người hiểu mã của bạn một cách dễ dàng.
  • Enums cũng làm cho mã của bạn tự ghi lại. Điều này có nghĩa là bạn không phải thêm nhận xét hoặc tài liệu để chỉ định giá trị mà hàm mong đợi. Đúng hơn, enum của bạn chỉ định những giá trị nào được mong đợi.
  • Điều này cũng cho phép IDE đánh dấu các lỗi khi bạn chuyển các giá trị không chính xác và cung cấp hỗ trợ tự động hoàn thành.
  • Kết quả là mã của bạn trở nên an toàn về kiểu và ít có khả năng tạo ra lỗi thời gian chạy hơn.
  Cách đặt ngày hết hạn khi chia sẻ tệp trên Google Drive

Tiếp theo, chúng ta sẽ thảo luận về cách tạo Enums trong Python.

Cách tạo Enum trong Python

Python không có hỗ trợ riêng cho enum. Nhưng nó cung cấp mô-đun enums trong thư viện chuẩn. Chúng tôi sẽ sử dụng mô-đun đó trong hướng dẫn này. Ngoài ra còn có hai phương pháp để tạo enum trong Python: Lớp hoặc API hàm. Tôi sẽ đề cập đến cả hai trong phần này.

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

Để làm theo hướng dẫn này, bạn sẽ cần cài đặt Python 3.4. Phiên bản Python này đi kèm với mô-đun enum trong thư viện chuẩn. Nếu bạn chưa làm điều đó, đây là hướng dẫn để giúp bạn:

Để làm theo hướng dẫn, bạn sẽ cần biết một số Python. Điều này bao gồm Python cơ bản và các khái niệm lập trình hướng đối tượng nâng cao hơn như lớp và tính kế thừa.

#1. Phương pháp lớp

Phương pháp đầu tiên để tạo enum là sử dụng các lớp. Trước tiên, bạn nhập lớp enum từ mô-đun enum. Tiếp theo, bạn tạo enum bằng cách tạo một lớp. Lớp này sẽ kế thừa từ lớp Enum bạn đã nhập trước đó.

from enum import Enum

class Direction(Enum):
    NORTH = 0
    EAST = 1
    SOUTH = 2
    WEST = 3

Bạn cũng có thể gán bất kỳ giá trị nào bạn muốn cho các thành viên của enum. Đây là một ví dụ: thay vì gán 0, 1, 2 và 3 cho enum chỉ đường của chúng tôi, chúng tôi chỉ định các giá trị tiêu đề tương ứng của chúng là 0, 90, 180 và 270.

from enum import Enum

class Direction(Enum):
    NORTH = 0
    EAST = 90
    SOUTH = 180
    WEST = 270

Ngoài ra, sử dụng hàm phạm vi là cách ngắn gọn hơn để tạo ra phần trên. Đoạn mã dưới đây minh họa cách thực hiện:

from enum import Enum

class Direction(Enum):
    NORTH, EAST, SOUTH, WEST = range(0, 360, 90)

Trong trường hợp này, chúng tôi tạo ra các giá trị bằng hàm phạm vi. Chúng tôi chỉ định 0 làm giá trị bắt đầu, 360 làm giá trị cuối cùng và 90 làm giá trị tăng dần. Chúng tôi hủy cấu trúc các giá trị từ iterable, tương tự như cách chúng tôi hủy cấu trúc các bộ dữ liệu. Nếu bạn muốn đọc thêm về việc phá hủy bộ dữ liệu, đây là bài viết về bộ dữ liệu trong Python.

  Cách cài đặt Ubuntu Server 21.04 qua USB

Các lớp Enum là các lớp trừu tượng. Điều này có nghĩa là chúng không có nghĩa là được khởi tạo. Thay vào đó, các thuộc tính của chúng, đại diện cho các thành viên enum trong trường hợp này, được truy cập trực tiếp.

#2. Phương pháp hàm

Phương thức hàm là một phương pháp thay thế cho phương thức phân lớp con.

from enum import Enum

Direction = Enum("Direction", ["NORTH", "EAST", "SOUTH", "WEST"])

Trong đoạn mã trên, chúng tôi đã tạo một enum có tên là Direction. Nó có thể truy cập được bằng cách sử dụng bốn thành viên mà chúng tôi đã cung cấp làm đối số thứ hai. Theo mặc định, các thành viên này được cấp các giá trị từ 1. Vì vậy, hướng Bắc là 1, hướng Đông là 2, v.v. Đây là trường hợp chứ không phải chỉ mục dựa trên 0 như mong đợi vì 0 là sai. Vì vậy, để làm cho tất cả các giá trị là đúng, các giá trị được đánh số từ 1.

Ngoài ra, bạn có thể gán giá trị cho các thành viên của mình bằng cách chuyển các thành viên đó dưới dạng danh sách các bộ dữ liệu. Mỗi bộ dữ liệu bao gồm hai phần tử: tên của thành viên và giá trị của thành viên đó.

from enum import Enum

Direction = Enum(
    name = "Direction",
    values = [
        ("NORTH", "n"),
        ("EAST", "e"),
        ("SOUTH", "s"),
        ("WEST", "w"),
    ]
)

Bạn cũng sẽ nhận thấy rằng tôi đã sử dụng chuỗi thay vì số nguyên khi gán giá trị cho các thành phần trong ví dụ trên. Điều này chứng tỏ rằng các chuỗi có giá trị như số nguyên khi gán giá trị.

Cách sử dụng Enum

Trong phần trước, chúng ta đã đề cập đến việc tạo enum và gán giá trị cho các thành viên. Phần này sẽ đề cập đến việc sử dụng enum để truy cập và chỉ định thành viên cũng như kiểm tra sự bình đẳng.

Cách truy cập thành viên

Có nhiều phương pháp để truy cập các thành viên của enum. Chúng bao gồm cú pháp dấu chấm, dấu ngoặc đơn và cú pháp dấu ngoặc vuông. Đây là một ví dụ để chứng minh điều trên:

from enum import Enum

# Creating an enum
class Day(Enum):
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY = range(1, 8)

# Accessing enum members
# 1. Using dot syntax
print(Day.SUNDAY)

# 2. Using square brackets
print(Day["MONDAY"])

# 3. Using the parentheses
print(Day(3))

Sau khi truy cập thành viên enum, bạn có thể lưu trữ nó trong một biến. Lưu ý rằng việc truy cập một thành viên sẽ cung cấp cho bạn một tham chiếu đến đối tượng thành viên chứ không phải giá trị hoặc tên của nó. Đây là điều quan trọng cần nhớ trong một số phần tiếp theo.

  Giảm thiểu rủi ro bảo mật chuỗi cung ứng phần mềm với 6 giải pháp này

Truy cập tên và giá trị

Như đã đề cập trước đó, khi bạn truy cập một thành viên enum, bạn tạo một tham chiếu đến đối tượng thành viên đó. Nếu vì lý do nào đó, bạn muốn truy cập vào tên hoặc giá trị của đối tượng enum, bạn có thể sử dụng thuộc tính tên và giá trị trên đối tượng.

print(Day.SUNDAY.name, Day.SUNDAY.value)

Kiểm tra sự bình đẳng

Hãy nhớ lại rằng việc gán một thành viên enum cho một biến sẽ tạo ra một tham chiếu đến đối tượng thành viên enum. Do đó, để kiểm tra xem một biến có thành viên enum cụ thể hay không, chúng ta sử dụng toán tử is để kiểm tra xem thành viên enum và biến có trỏ đến cùng một đối tượng hay không.

Đây là một ví dụ để chứng minh:

today = Day.WEDNESDAY

if today is Day.MONDAY:
    print("It's a Monday, :(")

if today is Day.WEDNESDAY:
    print("Happy Wednesday")

Ngoài ra, bạn có thể sử dụng toán tử ==. Trên các siêu lớp của lớp Enum, toán tử == là một trình bao bọc cho toán tử is. Điều này được thực hiện bằng cách nạp chồng toán tử. Bạn có thể đọc thêm về nó trong bài viết này về Phương pháp kỳ diệu. Dù sao, đây là một ví dụ sử dụng == thay vì is.

today = Day.WEDNESDAY

if today == Day.MONDAY:
    print("It's a Monday, :(")

if today == Day.WEDNESDAY:
    print("Happy Wednesday")

Có nguy cơ lặp đi lặp lại, so sánh enum kiểm tra danh tính đối tượng chứ không phải giá trị.

Từ cuối cùng

Bài viết này đề cập đến enum là gì và tại sao chúng hữu ích. Chúng tôi cũng đã đề cập đến các phương pháp khác nhau để tạo enum bằng cách phân lớp con Enum và sử dụng API chức năng.

Ngoài ra, chúng tôi còn đề cập đến cách sử dụng enum, truy cập các giá trị và so sánh. Tiếp theo, bạn có thể muốn đọc bài viết của chúng tôi về enum TypeScript.

x