Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Python KeyError: Hướng dẫn cho người mới bắt đầu

Python KeyError: Hướng dẫn cho người mới bắt đầu

Python KeyError được ném ra (raised) khi bạn cố truy cập mục trong dictionary không tồn tại. Bạn có thể sửa lỗi này bằng cách sửa chương trình chọn mục từ dictionary có tồn tại. Hoặc xử lý lỗi bằng cách kiểm tra khóa tồn tại trước.

Cách xử lý Python KeyError

Bạn vừa gặp KeyError? Đừng lo! Khi KeyError được ném ra, nghĩa là bạn đang cố truy cập khóa trong dictionary không tồn tại. Xử lý và sửa lỗi này dễ dàng khi bạn biết cách.

KeyError có thể xử lý dùng khối try...except, dùng từ khóa in, hoặc kiểm tra khóa trước dùng chỉ số (indexing).

Trong hướng dẫn này, ta nói về KeyError Python là gì và tại sao nó được ném ra. Ta đi qua ví dụ lỗi và cách sửa để bạn biết cách xử lý KeyError sau này.

Hãy bắt đầu!

Python KeyError là gì?

Python KeyError xảy ra khi bạn cố truy cập mục trong dictionary không tồn tại dùng cú pháp chỉ số (indexing). Lỗi này được ném ra vì Python không thể trả về giá trị cho mục không tồn tại trong dictionary.

Dictionary Python là tập hợp cặp khóa-giá trị (key-value pairs) lưu trong ngoặc nhọn ({}):

raspberry_pi = {
    "name": "Raspberry Pi 4",
    "price": 35.00,
    "RAM": "4GB"
}

Các khóa là "name", "price", và "RAM". Khóa xuất hiện trước dấu hai chấm trong dictionary.

Hãy xem gì xảy ra nếu ta cố lấy số cổng USB trong dictionary:

print(raspberry_pi["usb_ports"])

Mã trả về:

KeyError: 'usb_ports'

Lỗi này báo khóa chỉ định không tồn tại. Trong trường hợp này, khóa thiếu là "usb_ports".

KeyError Python: Giải pháp

Để xử lý Python dictionary KeyError bạn có thể:

  • Kiểm tra khóa trước dùng chỉ số (indexing)
  • Dùng từ khóa "in" kiểm tra khóa
  • Dùng khối try...except.

Giải pháp xử lý KeyError tốt nhất cho bạn sẽ thay đổi tùy thuộc vào trường hợp dùng.

Dùng phương thức get() của Dictionary

Phương thức get() của dictionary Python trả về giá trị trong dictionary. Bạn có thể chỉ định giá trị mặc định với get(). Giá trị mặc định này trả về nếu tên khóa bạn chỉ định không có giá trị.

Xét mã sau:

raspberry_pi = {
    "name": "Raspberry Pi 4",
    "price": 35.00,
    "RAM": "4GB"
}
get_key = input("Bạn muốn truy xuất thông tin gì (name, price, RAM)? ")
print("{} cho máy tính này là {}.".format(get_key, raspberry_pi.get(get_key, "không có sẵn")))

Chạy mã dùng trình thông dịch Python xem gì xảy ra:

Bạn muốn truy xuất thông tin gì? ALU
ALU cho máy tính này là không có sẵn.

Mã dùng get() dictionary truy xuất "ALU" từ dictionary. Không giá trị nào tương ứng khóa này. get() trả về giá trị mặc định ta chỉ định: "không có sẵn".

Kiểm tra khóa trước dùng Indexing

Bạn có thể kiểm tra sự tồn tại khóa dùng indexing tránh gặp KeyError. Nếu khóa trong dictionary, bạn dùng khóa đó. Ngược lại, bạn chỉ dẫn chương trình làm điều khác không phụ thuộc khóa đó.

Hãy viết chương trình truy cập khóa trong dictionary "raspberry_pi" Python. Hãy kiểm tra khóa trong dictionary dùng indexing:

raspberry_pi = {
    "name": "Raspberry Pi 4",
    "price": 35.00,
    "RAM": "4GB"
}
get_key = input("Bạn muốn truy xuất thông tin gì (name, price, RAM)? ")
if raspberry_pi[get_key]:
    print("{} cho máy tính này là {}.".format(get_key, raspberry_pi[get_key]))
else:
    print("Thông tin này không có sẵn.")

Ta dùng câu lệnh if Python kiểm tra khóa tồn tại. raspberry_pi[get_key] chỉ trả về giá trị nếu khóa tồn tại. Nghĩa là nếu khóa tồn tại, if thực thi. Nếu khóa không tồn tại, else thực thi.

Hãy thử tìm RAM cho Raspberry Pi:

Bạn muốn truy xuất thông tin gì (name, price, RAM)? RAM
RAM cho máy tính này là 4GB.

Bây giờ, thử tìm cổng USB:

Bạn muốn truy xuất thông tin gì (name, price, RAM)? USB
Thông tin này không có sẵn.

Mã không ném KeyError! Vì ta kiểm tra khóa tồn tại trước khi dùng. Nếu ta dùng raspberry_pi[get_key] trong else, mã trả KeyError.

Dùng khối try...except

Khối try...except Python sẽ thử chạy dòng mã. Nếu dòng đó không chạy được, mã ném lỗi tùy chỉnh theo ngoại lệ (exception) bạn chỉ định.

Ta có thể dùng try...except xác định sự tồn tại lỗi và ngăn KeyError không mong muốn làm hỏng chương trình Python.

Hãy định nghĩa lỗi tùy chỉnh cho ví dụ máy tính trước dùng try...except:

raspberry_pi = {
    "name": "Raspberry Pi 4",
    "price": 35.00,
    "RAM": "4GB"
}
get_key = input("Bạn muốn truy xuất thông tin gì (name, price, RAM)? ")
try:
    print("{} cho máy tính này là {}.".format(get_key, raspberry_pi[get_key]))
except KeyError:
    print("Thông tin này không có sẵn.")

Ta dùng try...except thử in thông tin cụ thể về Raspberry Pi ra màn hình. Nếu mã ném KeyError bất kỳ đâu trong khối try, mã thực thi nội dung khối except.

Nghĩa là mỗi khi KeyError được ném ra, "Thông tin này không có sẵn" in ra màn hình. Hãy thử tìm tên máy tính:

Bạn muốn truy xuất thông tin gì (name, price, RAM)? name
Tên cho máy tính này là Raspberry Pi 4.

Bây giờ, thử tìm cổng USB:

Bạn muốn truy xuất thông tin gì (name, price, RAM)? USB
Thông tin này không có sẵn.

Mã ném KeyError trong khối try. Điều này khiến mã thực thi khối except.

Kiểm tra khóa trước dùng in

Từ khóa in là một trong các toán tử thành viên (membership operators) của Python. Nó kiểm tra mục có trong danh sách giá trị không. Bạn có thể dùng in kiểm tra khóa có trong dictionary không.

Chương trình này kiểm tra khóa tồn tại trước khi in giá trị ra màn hình:

raspberry_pi = {
    "name": "Raspberry Pi 4",
    "price": 35.00,
    "RAM": "4GB"
}
get_key = input("Bạn muốn truy xuất thông tin gì (name, price, RAM)? ")
if get_key in raspberry_pi:
    print("{} cho máy tính này là {}.".format(get_key, raspberry_pi[get_key]))
else:
    print("Thông tin này không có sẵn.")

Mã kiểm tra giá trị get_key có phải khóa trong dictionary raspberry_pi không. Nếu khóa tồn tại, if chạy. Ngược lại, else chạy. Hãy thử kiểm tra CPU:

Bạn muốn truy xuất thông tin gì (name, price, RAM)? CPU
Thông tin này không có sẵn.

Hãy kiểm tra tên máy tính:

Bạn muốn truy xuất thông tin gì (name, price, RAM)? name
Tên cho máy tính này là Raspberry Pi 4.

Mã hoạt động! Khi tìm khóa không tồn tại, else chạy. Nghĩa là không KeyError nào được ném ra vì ta không cố truy cập khóa trong khối else.

Mã hoạt động! Khi tìm khóa không tồn tại, else chạy. Nghĩa là không KeyError nào được ném ra vì ta không cố truy cập khóa trong khối else.

Kết luận

KeyError được ném ra khi bạn cố truy cập giá trị từ dictionary không tồn tại. Để giải quyết key error, bạn có thể kiểm tra khóa trước khi dùng và chỉ dùng nếu khóa tồn tại. Bạn có thể dùng try...except xử lý key error.

Để có lời khuyên cách học ngôn ngữ Python, xem hướng dẫn toàn diện "Cách học Python" của chúng tôi. Bạn sẽ tìm thấy liên kết tài nguyên học tập hàng đầu, sách, và khóa học trong hướng dẫn này.