ฉันได้รับข้อผิดพลาดที่สำคัญในหลาม


191

ในโปรแกรมไพ ธ อนของฉันฉันได้รับข้อผิดพลาดนี้:

KeyError: 'variablename'

จากรหัสนี้:

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

ใครช่วยอธิบายหน่อยได้ไหมว่าทำไมสิ่งนี้ถึงเกิดขึ้น


11
Key errorโดยทั่วไปหมายถึงkeyไม่มี ดังนั้นคุณแน่ใจหรือไม่ว่า 'เส้นทาง' มีอยู่จริง?
RanRag

3
พิมพ์เนื้อหาของmeta_entryและให้แน่ใจว่ากุญแจที่คุณต้องการมีอยู่
Makoto

คำตอบ:


262

KeyErrorโดยทั่วไปหมายถึงที่สำคัญไม่ได้อยู่ ดังนั้นคุณแน่ใจหรือว่ามีpathกุญแจอยู่?

จาก python docs อย่างเป็นทางการ:

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 app engine และฉันไม่สามารถเข้าถึงไฟล์ใด ๆ ที่สร้างขึ้นได้
David Liaw

ฉันสามารถเข้าถึงรหัสของฉัน แต่ไม่มีรหัสที่สร้างขึ้นหรือเอ็นจิ้นใช้
David Liaw

ดังนั้นรหัสที่คุณโพสต์path = meta_entry['path'].strip('/'),นั้นเป็นส่วนหนึ่งของรหัสหรือเอ็นจิ้นของคุณ ถ้าเป็นส่วนหนึ่งของเครื่องยนต์ฉันกลัวว่าจะไม่มีอะไรทำ
RanRag

@ lonehangman: มากกว่าทำprint meta_entryและตรวจสอบว่ามีpathหรือไม่
RanRag

ฉันค่อนข้างใหม่กับไพ ธ อนคุณช่วยอธิบายรายละเอียดให้มากขึ้นได้ไหม ขออภัยที่เป็นศัตรูพืช
David Liaw

128

ฉันเห็นด้วยอย่างเต็มที่กับความคิดเห็นข้อผิดพลาดที่สำคัญ คุณสามารถใช้วิธีการ get () ของพจนานุกรมได้เช่นกันเพื่อหลีกเลี่ยงข้อยกเว้น นอกจากนี้ยังสามารถใช้เพื่อให้เส้นทางเริ่มต้นมากกว่าNoneที่แสดงด้านล่าง

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

9
+1 สำหรับความคิดเห็น. get () ที่มีความเกี่ยวข้องมาก ดูเหมือนว่าแอพพลิเคชั่นที่ดีของ Python EAFP (ง่ายกว่าที่จะขอการให้อภัยมากกว่าการอนุญาต) แทนที่จะเป็น LBYL (Look Before You Leap) ซึ่งฉันคิดว่า Pythonic น้อยกว่า
Niels Bom

32

สำหรับ dict เพียงใช้

if key in dict

และไม่ใช้การค้นหาในรายการคีย์

if key in dict.keys()

หลังจะใช้เวลามากขึ้น


5

ใช่มันเป็นไปได้มากที่สุดที่เกิดจากกุญแจไม่อยู่

ในโปรแกรมของฉันฉันใช้ setdefault เพื่อปิดเสียงข้อผิดพลาดนี้สำหรับความกังวลด้านประสิทธิภาพ ขึ้นอยู่กับประสิทธิภาพของสายนี้

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

ฉันยังใหม่กับ Python เช่นกัน อันที่จริงฉันเพิ่งเรียนมาวันนี้ ดังนั้นยกโทษให้ฉันในความไม่รู้ของประสิทธิภาพ

ใน Python 3 คุณสามารถใช้ฟังก์ชั่นนี้

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

มันบอกว่ามันจะไม่ทำให้เกิดข้อผิดพลาดที่สำคัญ


วิธีการรับเป็นแบบโบราณฉันคิดว่าแม้แต่ 1.x dicts ก็มี แต่ฉันแน่ใจว่ามี 2.7 แล้ว
Jürgen A. Erhard

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 ใน Python: ไม่ใช่อาเรย์มันเป็นพจนานุกรม (คุณอาจเรียกว่าแฮช แต่อาเรย์นั้นหมดแล้ว) และ: 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

ให้เราทำให้ง่ายขึ้นถ้าคุณใช้ Python 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')

สำหรับค่าคีย์แบบไดนามิกคุณยังสามารถจัดการผ่านบล็อก try-exception

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'}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.