Python KeyError: คู่มือสำหรับมือใหม่
Python KeyError เกิดขึ้นเมื่อคุณพยายามเข้าถึงรายการในดิกชันนารีที่ไม่มีอยู่ คุณสามารถแก้ไขข้อผิดพลาดนี้ได้โดยปรับโปรแกรมให้เลือกไอเทมจากดิกชันนารีที่มีอยู่ หรือจัดการข้อผิดพลาดโดยตรวจสอบว่าคีย์มีอยู่ก่อน
วิธีจัดการ Python KeyError
เพิ่งเจอ KeyError ไหม? อย่ากลัว! เมื่อ KeyError ถูกยกขึ้น (raised) หมายความว่าคุณกำลังพยายามเข้าถึงคีย์ภายในดิกชันนารีที่ไม่มีอยู่ การจัดการและแก้ไขข้อผิดพลาดนี้ง่ายเมื่อคุณรู้วิธี
KeyErrors สามารถจัดการได้ด้วยบล็อก try...except, ใช้คีย์เวิร์ด in, หรือตรวจสอบคีย์ล่วงหน้าด้วยการเข้าถึงดัชนี (indexing)
ในคู่มือนี้ เราจะพูดถึง Python KeyErrors คืออะไร และทำไมจึงถูกยกขึ้น เราจะเดินทางผ่านตัวอย่างข้อผิดพลาดและวิธีแก้ไข เพื่อให้คุณรู้วิธีจัดการ KeyErrors ในอนาคต
มาเริ่มกัน!
Python KeyError คืออะไร?
Python KeyError เกิดขึ้นเมื่อคุณพยายามเข้าถึงไอเทมในดิกชันนารีที่ไม่มีอยู่ โดยใช้ไวยากรณ์การเข้าถึงดัชนี (indexing syntax) ข้อผิดพลาดนี้ถูกยกขึ้นเพราะ Python ไม่สามารถคืนค่าสำหรับไอเทมที่ไม่มีอยู่ในดิกชันนารี
Python dictionary เป็นชุดของคู่คีย์-ค่า (key-value pairs) ที่จัดเก็บในวงเล็บปีกกา {}:
raspberry_pi = {
"name": "Raspberry Pi 4",
"price": 35.00,
"RAM": "4GB"
}
คีย์คือ "name", "price", และ "RAM" คีย์ปรากฏก่อนทวิภาคในดิกชันนารี
มาดูเกิดอะไรขึ้นถ้าเราพยายามดึงจำนวนพอร์ต USB ในดิกชันนารีของเรา:
print(raspberry_pi["usb_ports"])
โค้ดคืนค่า:
KeyError: 'usb_ports'
ข้อผิดพลาดนี้บอกว่าคีย์ที่เราระบุไม่มีอยู่ ในกรณีนี้ คีย์ที่หายคือ "usb_ports"
KeyError Python: วิธีแก้ไข
เพื่อจัดการ Python dictionary KeyError คุณสามารถ:
- ตรวจสอบคีย์ล่วงหน้าด้วยการเข้าถึงดัชนี (indexing)
- ใช้คีย์เวิร์ด
inตรวจสอบคีย์ - ใช้บล็อก
try...except
วิธีแก้ไข KeyError ที่เหมาะสมที่สุดสำหรับคุณจะแตกต่างกันไปตามกรณีใช้งาน (use case)
ใช้เมธอด get() ของดิกชันนารี
เมธอด get() ของ Python dictionary คืนค่าในดิกชันนารี คุณสามารถระบุค่าเริ่มต้น (default value) กับ get() ค่าเริ่มต้นนี้จะคืนค่าหากชื่อคีย์ที่คุณระบุไม่มีค่า
พิจารณาโค้ดต่อไปนี้:
raspberry_pi = {
"name": "Raspberry Pi 4",
"price": 35.00,
"RAM": "4GB"
}
get_key = input("What information would you like to retrieve (name, price, RAM)? ")
print("The {} for this computer is {}.".format(get_key, raspberry_pi.get(get_key, "not available")))
มารันโค้ดกับ Python interpreter และดูเกิดอะไร:
What information would you like to retrieve? ALU The ALU for this computer is not available.
โค้ดของเราใช้ get() ของดิกชันนารี ดึง "ALU" จากดิกชันนารี ไม่มีค่าที่สอดคล้องกับชื่อคีย์นี้ เมธอด get() คืนค่าเริ่มต้นที่เราระบุ คือ "not available"
ตรวจสอบคีย์ล่วงหน้าด้วยการเข้าถึงดัชนี (Indexing)
คุณสามารถตรวจสอบความมีอยู่ของคีย์ด้วยการเข้าถึงดัชนี เพื่อหลีกเลี่ยงการเจอ KeyError หากคีย์อยู่ในดิกชันนารี คุณสามารถใช้คีย์นั้น มิฉะนั้น คุณาสั่งโปรแกรมทำอย่างอื่นที่ไม่ขึ้นกับคีย์นั้น
มาเขียนโปรแกรมเข้าถึงคีย์ในดิกชันนารี "raspberry_pi" ใน Python มาตรวจสอบว่าคีย์ของเราอยู่ในดิกชันนารีด้วยการเข้าถึงดัชนี:
raspberry_pi = {
"name": "Raspberry Pi 4",
"price": 35.00,
"RAM": "4GB"
}
get_key = input("What information would you like to retrieve (name, price, RAM)? ")
if raspberry_pi[get_key]:
print("The {} for this computer is {}.".format(get_key, raspberry_pi[get_key]))
else:
print("This information is not available.")
เราใช้คำสั่ง if ของ Python ตรวจสอบว่าคีย์ของเรามีอยู่ raspberry_pi[get_key] จะคืนค่าเฉพาะเมื่อคีย์มีอยู่ หมายความว่าหากคีย์ของเรามีอยู่ บล็อก if จะรัน หากคีย์ไม่มีอยู่ บล็อก else จะรัน
มาลองหา RAM ของ Raspberry Pi:
What information would you like to retrieve (name, price, RAM)? RAM The RAM for this computer is 4GB.
ตอนนี้ ลองหาว่าคอมพิวเตอร์มีพอร์ต USB กี่พอร์ต:
What information would you like to retrieve (name, price, RAM)? USB This information is not available.
โค้ดของเราไม่ยก KeyError! เพราะเราตรวจสอบว่าคีย์มีอยู่ก่อนใช้งาน หากเราใช้ raspberry_pi[get_key] ภายในบล็อก else โค้ดจะคืน KeyError
ใช้บล็อก try...except
บล็อก try...except ของ Python จะลองรันบรรทัดโค้ด หากบรรทัดนั้นรันไม่ได้ โค้ดจะยกข้อผิดพลาดตามที่คุณระบุใน exceptions
เราสามารถใช้ try...except กำหนดความมีอยู่ของข้อผิดพลาด และหยุด KeyError ที่ไม่คาดคิดจากโปรแกรม Python
มากำหนดข้อผิดพลาดแบบกำหนดเองสำหรับตัวอย่างคอมพิวเตอร์ก่อนหน้า ด้วย try...except:
raspberry_pi = {
"name": "Raspberry Pi 4",
"price": 35.00,
"RAM": "4GB"
}
get_key = input("What information would you like to retrieve (name, price, RAM)? ")
try:
print("The {} for this computer is {}.".format(get_key, raspberry_pi[get_key]))
except KeyError:
print("This information is not available.")
เราใช้ try...except ลองพิมพ์ข้อมูลเฉพาะเกี่ยวกับคอมพิวเตอร์ Raspberry Pi ไปคอนโซล หากโค้ดของเรายก KeyError ใดๆ ในบล็อก try โค้ดจะรันเนื้อหาของบล็อก except
นี่หมายความว่าทุกครั้งที่ KeyError ถูกยกขึ้น "This information is not available" จะถูกพิมพ์ไปคอนโซล มาลองหาชื่อคอมพิวเตอร์:
What information would you like to retrieve (name, price, RAM)? name The name for this computer is Raspberry Pi 4.
ตอนนี้ ลองเรียนรู้เกี่ยวกับพอร์ต USB ของคอมพิวเตอร์:
What information would you like to retrieve (name, price, RAM)? USB This information is not available.
โค้ดของเรายก KeyError ภายในบล็อก try ส่งผลให้โค้ดรันบล็อก except
ตรวจสอบคีย์ล่วงหน้าด้วย in
คีย์เวิร์ด in เป็นหนึ่งใน membership operators ของ Python มันตรวจสอบว่าไอเทมอยู่ในรายการค่าหรือไม่ คุณสามารถใช้ in ตรวจสอบว่าคีย์อยู่ในดิกชันนารี
โปรแกรมนี้จะตรวจสอบว่าคีย์มีอยู่ก่อนพิมพ์ค่าของมันไปคอนโซล:
raspberry_pi = {
"name": "Raspberry Pi 4",
"price": 35.00,
"RAM": "4GB"
}
get_key = input("What information would you like to retrieve (name, price, RAM)? ")
if get_key in raspberry_pi:
print("The {} for this computer is {}.".format(get_key, raspberry_pi[get_key]))
else:
print("This information is not available.")
โค้ดนี้ตรวจสอบว่าค่า get_key เป็นคีย์ภายในดิกชันนารี raspberry_pi หรือไม่ หากคีย์มีอยู่ บล็อก if จะรัน มิฉะนั้น บล็อก else จะรัน มาลองตรวจสอบข้อมูล CPU ของคอมพิวเตอร์:
What information would you like to retrieve (name, price, RAM)? CPU This information is not available.
มาตรวจสอบชื่อคอมพิวเตอร์:
What information would you like to retrieve (name, price, RAM)? name The name for this computer is Raspberry Pi 4.
โค้ดของเราทำงาน! เมื่อค้นหาคีย์ที่ไม่มีอยู่ บล็อก else รัน นี่หมายความว่าไม่มี KeyError ที่สามารถยกขึ้นในโค้ดของเรา เพราะเราไม่พยายามเข้าถึงคีย์ในบล็อก else
โค้ดของเราทำงาน! เมื่อค้นหาคีย์ที่ไม่มีอยู่ บล็อก else รัน นี่หมายความว่าไม่มี KeyError ที่สามารถยกขึ้นในโค้ดของเรา เพราะเราไม่พยายามเข้าถึงคีย์ในบล็อก else
สรุป
KeyError ถูกยกขึ้นเมื่อคุณพยายามเข้าถึงค่าจากดิกชันนารีที่ไม่มีอยู่ เพื่อแก้ไข KeyError คุณสามารถตรวจสอบคีย์ล่วงหน้าก่อนใช้ และใช้ก็ต่อเมื่อคีย์มีอยู่ คุณสามารถใช้บล็อก try...except จัดการ KeyError
สำหรับคำแนะนำการเรียนภาษา Python ดูคู่มือ How to Learn Python ของเรา คุณจะพบลิงก์ไปแหล่งทรัพยากร หนังสือ และคอร์สชั้นนำในคู่มือนี้