0

Khắc phục lỗi KeyError trong Python: Hướng dẫn từ A - Z

Khi làm việc với từ điển trong Python, bạn sẽ thường xuyên gặp phải ngoại lệ KeyError. Từ điển là cấu trúc dữ liệu tích hợp sẵn của các cặp khóa-giá trị. Bạn có thể tra cứu một giá trị - trong thời gian không đổi - bằng cách sử dụng khóa tương ứng như sau: dict[key] trả về value. Nhưng điều gì sẽ xảy ra nếu khóa không tồn tại trong từ điển? Đó là lúc bạn gặp lỗi KeyError trong Python.

Có một số cách khác nhau để bạn có thể xử lý các ngoại lệ KeyError như vậy. Bạn có thể xử lý chúng một cách rõ ràng hoặc sử dụng các phương thức từ điển nhất định để đặt giá trị mặc định cho các khóa bị thiếu. Trong hướng dẫn này, chúng ta sẽ xem xét các phương pháp sau bằng cách viết mã một ví dụ đơn giản:

  • Sử dụng khối try-except
  • Sử dụng phương thức get() của từ điển
  • Sử dụng defaultdict từ module collections

Hãy cùng bắt đầu nhé!

KeyError xuất hiện khi nào và cách xử lý bằng try-except

Trong Python, ngoại lệ KeyError xảy ra khi bạn cố gắng truy cập giá trị tương ứng với một khóa không tồn tại. Hãy xem xét từ điển books sau:

books = {
    "1984": "George Orwell",
    "To Kill a Mockingbird": "Harper Lee",
    "The Great Gatsby": "F. Scott Fitzgerald"
}

Trong từ điển books, các khóa là tiêu đề của sách và các giá trị là tên của tác giả. Vì vậy, bạn có thể tra cứu tác giả của một cuốn sách bằng cách sử dụng tiêu đề làm khóa.

Bây giờ, hãy thử tra cứu tác giả của một cuốn sách không tồn tại trong từ điển:

print(books["Brave New World"])

Bạn sẽ gặp phải ngoại lệ KeyError sau:

Traceback (most recent call last):
  File "/home/balapriya/keyerror/main.py", line 7, in <module>
    print(books["Brave New World"])
          ~~~~~^^^^^^^^^^^^^^^^^^^
KeyError: 'Brave New World'

Bạn có thể xử lý rõ ràng các ngoại lệ KeyError như vậy bằng cách sử dụng các khối try-except như sau:

try:
    value = dictionary[key]
except KeyError:
    value = default_value

Ở đây:

  • Chúng ta bao bọc khối mã có thể gây ra ngoại lệ trong khối thử. Trong trường hợp này, chúng ta cố gắng truy cập giá trị được liên kết với khóa.
  • Nếu KeyError được đưa ra, chúng ta xử lý nó trong khối except bằng cách gán một giá trị mặc định.

Đối với ví dụ từ điển books, chúng ta có:

books = {
    "1984": "George Orwell",
    "To Kill a Mockingbird": "Harper Lee",
    "The Great Gatsby": "F. Scott Fitzgerald"
}

try:
    # Try to access the key "Brave New World"
    author = books["Brave New World"]  
    # Catch the KeyError if the key does not exist
except KeyError:  
    author = "Book not found"  

print(author)

Chúng ta thử tra cứu lại tác giả của “Brave New World”. Nhưng lần này KeyError kích hoạt khối except và chúng ta nhận được “Book not found”.

Output >>> Book not found

Xử lý KeyError tinh tế với phương thức get()

Một cách khác để xử lý các khóa bị thiếu mà không gây ra ngoại lệ là sử dụng phương thức get() của từ điển.

Bạn có thể sử dụng phương thức get() trên bất kỳ đối tượng từ điển hợp lệ nào. Phương thức get() trả về giá trị cho một khóa nhất định nếu nó tồn tại - ngược lại, nó trả về một giá trị mặc định được chỉ định. Bạn có thể sử dụng nó như sau:

value = dictionary.get(key, default_value)

Về bản chất, phương thức get() cố gắng lấy giá trị cho khóa được chỉ định:

  • Nếu khóa tồn tại, nó trả về giá trị tương ứng.
  • Nếu khóa không tồn tại, nó trả về default_value.

Bây giờ, hãy sử dụng phương thức get() trên từ điển sách. Chúng tôi chuyển "Book not found" làm giá trị mặc định trong lệnh gọi phương thức.

books = {
    "1984": "George Orwell",
    "To Kill a Mockingbird": "Harper Lee",
    "The Great Gatsby": "F. Scott Fitzgerald"
}

# Try to get the value for "Brave New World"
author = books.get("Brave New World", "Book not found")  
print(author)

Như mong đợi, bạn sẽ nhận được kết quả sau:

Output >>> Book not found

Lưu ý: Phương thức get() không sửa đổi từ điển ban đầu. Nếu bạn cũng muốn thêm khóa bị thiếu với giá trị mặc định, bạn có thể sử dụng phương thức setdefault() thay thế với cú pháp dictionary.setdefault(key,default_value).

Sử Dụng defaultdict từ Module collections

Một cách (gọn gàng hơn nhiều) để xử lý KeyError là sử dụng defaultdict từ module collections của Python. Defaultdict mở rộng khả năng của từ điển tích hợp sẵn của Python bằng cách cho phép bạn cung cấp giá trị mặc định cho các khóa chưa được đặt rõ ràng.

Trình tạo defaultdict nhận một hàm tạo mặc định làm đối số. Hàm tạo này được gọi không có đối số để cung cấp giá trị mặc định cho một khóa không tồn tại.

Cú pháp để tạo defaultdict như sau:

from collections import defaultdict

# Syntax
defaultdict(default_factory)

Hãy tạo một defaultdict từ từ điển books như được hiển thị:

from collections import defaultdict

books = {
    "1984": "George Orwell",
    "To Kill a Mockingbird": "Harper Lee",
    "The Great Gatsby": "F. Scott Fitzgerald"
}

books_default = defaultdict(lambda: "Book not found",books)  
# Access the key "Brave New World"
author = books_default["Brave New World"]  
print(author)

Đối với hàm tạo mặc định, chúng ta sử dụng một hàm lambda đơn giản trả về chuỗi "Book not found". Hàm này được gọi bất cứ khi nào bạn cố gắng truy cập một khóa không có trong từ điển.

Chạy đoạn mã trên cũng sẽ cung cấp cho bạn:

Output >>> Book not found

Sử dụng defaultdict có thể đặc biệt hữu ích khi bạn cần truy cập động nhiều khóa.

Kết luận

Và đó là tất cả những gì mà bạn cần! Tôi hy vọng bạn đã học được cách xử lý các ngoại lệ KeyError trong Python. Hãy cùng xem lại những gì chúng ta đã học nhé:

  • Để xử lý rõ ràng KeyError, bạn có thể bao bọc mã truy cập từ điển bằng khối try và bắt KeyError trong khối except.
  • Sử dụng phương thức get() để truy cập giá trị của một khóa, với tùy chọn trả về giá trị mặc định nếu khóa không tồn tại.
  • Bạn có thể khởi tạo defaultdict từ module collections với một hàm tạo trả về giá trị mặc định.

Cảm ơn các bạn đã theo dõi.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí