मुझे अजगर में मुख्य त्रुटि मिल रही है


190

मेरे अजगर कार्यक्रम में मुझे यह त्रुटि मिल रही है:

KeyError: 'variablename'

इस कोड से:

path = meta_entry['path'].strip('/'),

क्या कोई कृपया बता सकता है कि ऐसा क्यों हो रहा है?


10
Key errorआमतौर पर इसका मतलब keyयह नहीं है। तो, क्या आप सुनिश्चित हैं कि 'पथ' मौजूद है।
रणराग

3
की सामग्री प्रिंट करें meta_entryऔर यह सुनिश्चित करें कि आप जो कुंजी चाहते हैं वह मौजूद है।
मकोतो

जवाबों:


258

एक KeyErrorआम तौर पर कुंजी मौजूद नहीं है का मतलब है। तो, क्या आप सुनिश्चित हैं कि pathकुंजी मौजूद है?

आधिकारिक अजगर डॉक्स से:

अपवाद KeyError

मौजूदा कुंजियों के सेट में मैपिंग (शब्दकोश) कुंजी नहीं मिलने पर उठाया।

उदाहरण के लिए:

>>> mydict = {'a':'1','b':'2'}
>>> mydict['a']
'1'
>>> mydict['c']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'c'
>>>

तो, की सामग्री को मुद्रित करने meta_entryऔर यह देखने की कोशिश करें कि क्या pathमौजूद है या नहीं।

>>> mydict = {'a':'1','b':'2'}
>>> print mydict
{'a': '1', 'b': '2'}

या, आप कर सकते हैं:

>>> 'a' in mydict
True
>>> 'c' in mydict
False

हम्म ... मैं ऐसा कैसे करूंगा? (एक noob होने के लिए क्षमा करें) ऐप को Google ऐप इंजन पर होस्ट किया गया है और मेरे पास इसे बनाने वाली किसी भी फ़ाइल तक पहुंच नहीं है।
डेविड लियाव

मेरे पास मेरे कोड तक पहुंच है लेकिन कोई भी कोड जो इसे बनाता है या इंजन का उपयोग नहीं करता है
डेविड लिआव

तो, आपके द्वारा पोस्ट किया गया कोड path = meta_entry['path'].strip('/'),आपके कोड या इंजन का हिस्सा है। अगर यह इंजन का हिस्सा है तो मुझे डर है कि कुछ नहीं किया जा सकता है।
रणराग

@ लोनहांगमैन: क्या करना है या नहीं, print meta_entryइसकी जांच करें path
रणराग ४

मैं अजगर के लिए काफी नया हूं, क्या आप अधिक विस्तार से बता सकते हैं। कीट होने के लिए क्षमा करें
डेविड लियाव

127

मैं मुख्य त्रुटि टिप्पणियों से पूरी तरह सहमत हूं। अपवादों से बचने के लिए आप डिक्शनरी के गेट () विधि का भी उपयोग कर सकते हैं । इसका उपयोग Noneनीचे दिखाए गए के बजाय डिफ़ॉल्ट पथ देने के लिए भी किया जा सकता है ।

>>> d = {"a":1, "b":2}
>>> x = d.get("A",None)
>>> print x
None

9
+1 बहुत प्रासंगिक .get () टिप्पणी के लिए। LBYL (लुक बिफोर यू लीप) के बजाय पाइथन ईएएफपी (ईज़ी टू फॉरगिनेस फ़ॉर परमिशन) का एक अच्छा अनुप्रयोग लगता है जो मुझे लगता है कि कम पायथोनिक है।
नील्स बॉम

32

तानाशाही के लिए, बस उपयोग करें

if key in dict

और उपयोग नहीं

if key in dict.keys()

यह समय लेने वाला होगा


5

हां, यह गैर-मौजूदा कुंजी के कारण सबसे अधिक संभावना है।

मेरे कार्यक्रम में, मैंने दक्षता की चिंता के लिए, इस त्रुटि को म्यूट करने के लिए सेटडेफॉल्ट का उपयोग किया। यह लाइन कितनी कारगर है, इस पर निर्भर करता है

>>>'a' in mydict.keys()  

मैं पायथन के लिए भी नया हूं। वास्तव में मैंने इसे आज ही सीखा है। अतः दक्षता की अज्ञानता पर मुझे क्षमा करें।

पायथन 3 में, आप इस फ़ंक्शन का उपयोग कर सकते हैं,

get(key[, default]) [function doc][1]

ऐसा कहा जाता है कि यह एक महत्वपूर्ण त्रुटि कभी नहीं बढ़ाएगा।


प्राप्त विधि प्राचीन है, मुझे लगता है कि यहां तक ​​कि 1.x dicts के पास भी था। लेकिन मुझे यकीन है कि 2.7 पहले से ही था।
जुरगेन ए। इरहार्ड

3

इसका मतलब है कि आपका सरणी वह कुंजी खो रहा है जिसकी आपको तलाश है। मैं इसे एक फ़ंक्शन के साथ संभालता हूं जो या तो मौजूद है या इसके बजाय एक डिफ़ॉल्ट मान लौटाता है।

def keyCheck(key, arr, default):
    if key in arr.keys():
        return arr[key]
    else:
        return default


myarray = {'key1':1, 'key2':2}

print keyCheck('key1', myarray, '#default')
print keyCheck('key2', myarray, '#default')
print keyCheck('key3', myarray, '#default')

आउटपुट:

1
2
#default

7
अर्घ ... भयानक, भयानक अस्वाभाविक कोड। पायथन में PHP कोड न लिखें: यह एक सरणी नहीं है, यह एक शब्दकोश है (आप इसे हैश कह सकते हैं, लेकिन सरणी सही है)। और: dicts में पहले से ही आपका "keyCheck" फ़ंक्शन है: "keyCheck ('key1', myarray, '#default') के बजाय" आप "mydict.get ('key1', '#default')"
Jürgen A ; इरेड

2

मुझे यह त्रुटि तब मिली जब मैं dictनेस्टेड के साथ पार्स कर रहा था for:

cats = {'Tom': {'color': 'white', 'weight': 8}, 'Klakier': {'color': 'black', 'weight': 10}}
cat_attr = {}
for cat in cats:
    for attr in cat:
        print(cats[cat][attr])

वापस ट्रेस करें:

Traceback (most recent call last):
      File "<input>", line 3, in <module>
    KeyError: 'K'

क्योंकि दूसरे लूप में cats[cat]सिर्फ इसके बजाय होना चाहिए cat(क्या सिर्फ एक कुंजी है)

इसलिए:

cats = {'Tom': {'color': 'white', 'weight': 8}, 'Klakier': {'color': 'black', 'weight': 10}}
cat_attr = {}
for cat in cats:
    for attr in cats[cat]:
        print(cats[cat][attr])

देता है

black
10
white
8

0

उदाहरण के लिए, यदि यह एक संख्या है:

ouloulou={
    1:US,
    2:BR,
    3:FR
    }
ouloulou[1]()

यह पूरी तरह से काम है, लेकिन अगर आप उदाहरण के लिए उपयोग करते हैं:

ouloulou[input("select 1 2 or 3"]()

यह काम नहीं करता है, क्योंकि आपका इनपुट वापसी स्ट्रिंग '1' है। इसलिए आपको int () का उपयोग करने की आवश्यकता है

ouloulou[int(input("select 1 2 or 3"))]()

0

यदि आप पायथन 3 का उपयोग कर रहे हैं, तो हमें इसे सरल बनाने दें

mydict = {'a':'apple','b':'boy','c':'cat'}
check = 'c' in mydict
if check:
    print('c key is present')

अगर आपको कोई और शर्त चाहिए

mydict = {'a':'apple','b':'boy','c':'cat'}
if 'c' in mydict:
    print('key present')
else:
    print('key not found')

डायनेमिक कुंजी मान के लिए, आप प्रयास-अपवाद ब्लॉक के माध्यम से भी संभाल सकते हैं

mydict = {'a':'apple','b':'boy','c':'cat'}
try:
    print(mydict['c'])
except KeyError:
    print('key value not found')mydict = {'a':'apple','b':'boy','c':'cat'}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.