मुख्य सामग्री पर जाएँ

Python में KeyError अपवाद और उन्हें कैसे ठीक करें

Python में KeyError अपवाद को प्रभावी ढंग से संभालने के लिए अपवाद प्रबंधन और त्रुटि-निवारण जैसी प्रमुख तकनीकों को सीखें।
· 6 मि॰ पढ़ें

AI के साथ खोजें

सबसे अनुभवी प्रोग्रामर भी कोडिंग में गलतियाँ करते हैं। Python प्रोग्रामरों के लिए, ये गलतियाँ दो श्रेणियों में आती हैं: एरर या अपवाद (exceptions)।

एरर मुख्यतः सिंटैक्स से संबंधित होते हैं। प्रोग्राम चलाने के लिए उन्हें ठीक करना अनिवार्य है। दूसरी ओर, अपवाद तब होते हैं जब कोड सिंटैक्स की दृष्टि से सही होता है, लेकिन रनटाइम के दौरान कोई चीज़ प्रोग्राम को बाधित कर देती है। 

इस ट्यूटोरियल में, हम नए और अनुभवी दोनों प्रकार के प्रोग्रामरों द्वारा सबसे अधिक देखे जाने वाले अपवादों में से एक: KeyError अपवाद पर नज़र डालेंगे। हम Python के KeyError का विस्तार से वर्णन करेंगे, उदाहरण देंगे और इस तरह के अपवाद को संभालने की अलग-अलग तकनीकों को कवर करेंगे। यदि आप Python में गलतियों की पहचान और उन्हें ठीक करना सीखना चाहते हैं, तो हमारा Exception & Error Handling in Python ट्यूटोरियल भी देखें। 

KeyError अपवाद क्या है?

Python में, KeyError अपवाद बिल्ट-इन अपवादों में से एक है, जिसे सामान्य त्रुटि स्थितियों की एक विस्तृत श्रृंखला को संभालने के लिए बनाया गया है। KeyError को, IndexError के साथ, अधिक सामान्य LookupError अपवाद का एक सबक्लास समझा जा सकता है, और ये सभी Exception क्लास की ऑब्जेक्ट्स हैं।

विशेष रूप से, KeyError तब उठता है जब कोई प्रोग्रामर किसी ऐसे कुंजी (key) तक पहुँचने की कोशिश करता है जो डिक्शनरी में मौजूद नहीं है। संदर्भ के लिए, डिक्शनरी एक डाटा संरचना है जो डाटा को key-value युग्मों में संग्रहीत करती है, और डिक्शनरी में value तक उसकी key के माध्यम से पहुँचा जाता है — इसी से नाम पड़ा है, KeyError। 

Python KeyError के सामान्य कारण और उदाहरण

आइए देशों और उनकी राजधानियों की एक डिक्शनरी का उदाहरण देखें:

dictionary_capitals = {'Madrid': 'Spain',
 'Lisboa': 'Portugal', 'London': 'United Kingdom'}

अपनी डिक्शनरी में जानकारी खोजने के लिए, हमें ब्रैकेट में key निर्दिष्ट करनी होती है और Python उससे जुड़ी value लौटाता है।

dictionary_capitals['Madrid']
'Spain'

यदि हम ऐसी key तक पहुँचने की कोशिश करते हैं जो डिक्शनरी में नहीं है, तो Python हमें KeyError अपवाद का एरर संदेश देगा। 

dictionary_capitals['Rome']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Rome'

हम KeyError अपवाद का सामना तब भी कर सकते हैं जब हम अन्य Python mapping ऑब्जेक्ट्स में, जो डिक्शनरी के रूप में होते हैं, मौजूद न रहने वाली keys तक पहुँचने की कोशिश करते हैं। उदाहरण के लिए, os.environ ऑब्जेक्ट एक डिक्शनरी लौटाता है जो उपयोगकर्ता के पर्यावरण वेरिएबल्स को keys के रूप में तथा उनसे जुड़ी values के साथ संग्रहीत करता है।

निम्नलिखित कोड में, हम os.environ डिक्शनरी में USERS key से जुड़ी value तक पहुँचने का प्रयास करते हैं। क्योंकि USERS os.environ डिक्शनरी में नहीं था, हमारा कोड KeyError देता है।

#Calling a non-existent environmental variable
os.environ['USERS']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/os.py", line 679, in __getitem__
    raise KeyError(key) from None
KeyError: 'USERS'

जैसा कि होता है, Python में डिक्शनरी बहुत आम हैं। एक और उदाहरण कुछ अधिक अमूर्त चीज़, जिसे hashmap कहते हैं, का कार्यान्वयन है। hashmaps के बारे में अधिक जानने के लिए हमारा Guide to Python Hashmaps ट्यूटोरियल देखें।

Python KeyError अपवादों को संभालना

आइए KeyError अपवादों को संभालने के तरीके खोजें। हमारे पास दो रणनीतियाँ हैं: हम या तो KeyError को रोक सकते हैं या एरर हैंडलिंग के साथ KeyError को पकड़ सकते हैं। 

KeyError रोकना

जैसा कि हमने देखा, यदि हम किसी गैर-मौजूद key तक पहुँचने की कोशिश करते हैं तो Python KeyError फेंकता है। इसे रोकने के लिए, हम अपनी डिक्शनरी में keys तक पहुँचने के लिए .get() मेथड का उपयोग कर सकते हैं, जिससे हमारा कोड अधिक सहिष्णु हो जाता है। यदि इस मेथड का उपयोग करते समय हमें कोई गैर-मौजूद key मिलती है, तो Python KeyError की बजाय None वैल्यू लौटाएगा। यह एक अच्छा तरीका है।

print(dictionary_capitals.get('Prague'))
None

वैकल्पिक रूप से, हम पहुँचने से पहले जाँच सकते हैं कि कोई key मौजूद है या नहीं। अपवादों को रोकने का यह तरीका “Look Before You Leap,” या संक्षेप में LBYL, के नाम से जाना जाता है। इस स्थिति में, हम if स्टेटमेंट्स का उपयोग करके जाँच सकते हैं कि key मौजूद है या नहीं, और यदि नहीं है, तो हम else खंड में इसे संभाल सकते हैं।

capital = "Prague"
if capital in dictionary_capitals.keys():
    value = dictionary_capitals[capital]
else:
    print("The key {} is not present in the dictionary".format(capital)) 

अपवाद प्रबंधन के साथ KeyError पकड़ना

दूसरा तरीका “Easier to Ask Forgiveness Than Permission” के नाम से जाना जाता है। EAFP, जैसा कि इसे कहते हैं, वास्तव में Python में अपवादों को संभालने का अधिक मानक तरीका है। 

EAFP कोडिंग शैली अपनाने का मतलब है कि हम वैध keys के अस्तित्व को मान लेते हैं और यदि यह मान्यता गलत साबित होती है तो अपवादों को पकड़ते हैं। जहाँ हमारा LBYL तरीका if/else स्टेटमेंट्स पर निर्भर करता है, वहीं EAFP तरीका try/except क्लॉज़ पर निर्भर करता है। 

निम्न उदाहरण में, key के मौजूद होने की जाँच करने के बजाय, हम इच्छित key तक पहुँचने की कोशिश करते हैं। यदि किसी कारण से key मौजूद नहीं है, तो हम except क्लॉज़ में KeyError को पकड़ लेते हैं और उसे उपयुक्त रूप से संभालते हैं।

capital = "Prague"
try:
     value = dictionary_capitals[capital]
except KeyError:
     print("The key {} is not present in the dictionary".format(capital)) 

उन्नत Python KeyError प्रबंधन

स्वचालित key हैंडलिंग के लिए defaultdict का उपयोग

हम देखते हैं कि जब भी हम अपनी डिक्शनरी में मौजूद नहीं होने वाली key तक पहुँचने की कोशिश करते हैं, Python KeyError अपवाद लौटाता है। .get() मेथड, जिसकी हमने समीक्षा की, एक एरर-सहनशील तरीका था जो ठीक-ठाक काम करता है, लेकिन यह अनुकूलित नहीं था।

Collections मॉड्यूल defaultdict प्रदान करता है, जो डिक्शनरी एंट्रियों को संभालने का अधिक अनुकूलित तरीका है। मानक डिक्शनरी के विपरीत, जो गैर-मौजूद key तक पहुँचने पर KeyError फेंकती है, defaultdict हमें एक डिफ़ॉल्ट वैल्यू निर्दिष्ट करने देता है, जो तब लौटाई जाती है जब कोई key नहीं मिलती। निम्नलिखित कोड दिखाता है कि Collections से defaultdict कैसे इम्पोर्ट करें और lambda फ़ंक्शन के साथ एक डिफ़ॉल्ट वैल्यू कैसे बनाएँ। यदि आप lambda फ़ंक्शन्स को लेकर उलझन में हैं, तो अधिक जानने के लिए हमारा Python lambda Tutorial देखें।

from collections import defaultdict 

# Defining the dict 
capitals = defaultdict(lambda: "The key doesn't exist") 
capitals['Madrid'] = 'Spain'
capitals['Lisboa'] = 'Portugal'
print(capitals['Madrid']) 
print(capitals['Lisboa']) 
print(capitals['Ankara'])
Spain
Portugal
The key doesn't exist

जानबूझकर KeyError उठाना

अंत में, हमें कहना चाहिए कि कुछ परिस्थितियों में, कुछ बाध्यताओं को लागू करने के लिए जानबूझकर KeyError उठाना उपयुक्त हो सकता है।

हम जानते हैं कि कई मामलों में, फ़ंक्शन्स अपने संचालन करने के लिए विशिष्ट डाटा की उपलब्धता पर निर्भर करते हैं। ऐसे में KeyError को मैन्युअल रूप से ट्रिगर करना यह सुनिश्चित करता है कि आवश्यक डाटा गायब होने पर फ़ंक्शन स्पष्ट और पूर्वानुमेय तरीके से असफल हो। इन मामलों में, KeyError के साथ दिया गया एरर संदेश हमें ठीक-ठीक समझने में मदद करता है कि इनपुट में क्या गलत था, जिससे डीबगिंग आसान हो जाती है।

आइए एक उदाहरण से स्पष्ट करें। यहाँ हमने एक फ़ंक्शन बनाया है जो आर्ग्युमेंट के रूप में एक डिक्शनरी लेता है। फ़ंक्शन के सही ढंग से काम करने के लिए उपयोगकर्ता को सही keys वाली डिक्शनरी प्रदान करनी होगी। हम इस मामले में फ़ंक्शन बनाते हैं क्योंकि हम यह तुरंत जानना चाहते हैं कि keys गायब हैं, बजाय इसके कि एरर कोड में आगे तक बना रहे। 

def my_function(my_dict): 
    if 'critical_key' not in my_dict: 
        raise KeyError('critical_key is missing from the dictionary. Please modify the dictionary')

निष्कर्ष

हमें उम्मीद है कि आपको यह लेख पसंद आया होगा। KeyError उन सबसे आम अपवादों में से एक है जिनका सामना एक Python डेवलपर करेगा। एरर और अपवाद प्रबंधन की कला में पारंगत होना एक सशक्त Python प्रोग्रामर बनने का महत्वपूर्ण हिस्सा है। अन्य फ़ंक्शनल प्रोग्रामिंग तकनीकों और कोडिंग की मूल बातों के बारे में अधिक जानने के लिए हमारे Python Programming और Python Fundamentals स्किल ट्रैक्स देखें। साथ ही, संबंधित अवधारणाओं के बारे में अधिक जानने के लिए हमारा Python Sets and Set Theory ट्यूटोरियल भी देखें। 

Javier Canales Luna

लेखक

Javier Canales Luna

मैं एक स्वतंत्र डेटा विश्लेषक हूँ और दुनिया भर की कंपनियों व संगठनों के साथ डेटा साइंस परियोजनाओं पर सहयोग करता/करती हूँ। मैं 2+ वर्षों के अनुभव वाला/वाली डेटा साइंस प्रशिक्षक भी हूँ। मैं नियमित रूप से अंग्रेज़ी और स्पेनिश में डेटा साइंस से संबंधित लेख लिखता/लिखती हूँ, जिनमें से कुछ DataCamp, Towards Data Science और Analytics Vidhya जैसी स्थापित वेबसाइटों पर प्रकाशित हुए हैं। राजनीतिक विज्ञान और क़ानून की पृष्ठभूमि वाले/वाली डेटा वैज्ञानिक के रूप में, मेरा लक्ष्य लोक नीति, क़ानून और प्रौद्योगिकी के संगम पर काम करना है—विचारों की शक्ति का उपयोग करके ऐसे अभिनव समाधान और कथाएँ विकसित करना जो हमें तात्कालिक चुनौतियों, विशेषकर जलवायु संकट, से निपटने में मदद कर सकें। मैं स्वयं-अध्येता, सतत सीखने वाला/वाली और बहुविषयक दृष्टिकोण का प्रबल समर्थक/समर्थक हूँ। नई चीज़ें सीखने में कभी देर नहीं होती।

विषय