Tôi đang gặp lỗi Key trong python


189

Trong chương trình python của tôi, tôi nhận được lỗi này:

KeyError: 'variablename'

Từ mã này:

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

Bất cứ ai có thể giải thích tại sao điều này đang xảy ra?


10
Key errornói chung có nghĩa là keykhông tồn tại. Vì vậy, bạn có chắc chắn 'con đường' tồn tại.?
RanRag

3
In nội dung meta_entryvà đảm bảo khóa bạn muốn tồn tại.
Makoto

Câu trả lời:


258

Một KeyErrorthường có nghĩa là chìa khóa không tồn tại. Vì vậy, bạn có chắc chắn pathchìa khóa tồn tại?

Từ các tài liệu python chính thức:

ngoại lệ KeyError

Tăng lên khi không tìm thấy khóa ánh xạ (từ điển) trong bộ khóa hiện có.

Ví dụ:

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

Vì vậy, hãy thử in nội dung meta_entryvà kiểm tra xem có pathtồn tại hay không.

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

Hoặc, bạn có thể làm:

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

hmm ... tôi sẽ làm thế nào (Xin lỗi vì đã là một người mới) Ứng dụng được lưu trữ trên công cụ ứng dụng google và tôi không có quyền truy cập vào bất kỳ tệp nào mà nó tạo ra.
David Liaw

Tôi có quyền truy cập vào mã của mình nhưng không có mã nào mà nó tạo ra hoặc động cơ sử dụng
David Liaw

Vì vậy, mã bạn đã đăng path = meta_entry['path'].strip('/'),là một phần của mã của bạn hoặc công cụ. Nếu nó là một phần của động cơ, tôi sợ không có gì có thể được thực hiện.
RanRag

@lonehangman: hơn chỉ làm print meta_entryvà kiểm tra xem nó có chứa pathhay không.
RanRag

Tôi còn khá mới với python, bạn có thể vui lòng giải thích chi tiết hơn. Xin lỗi vì đã là một dịch hại
David Liaw

127

Tôi hoàn toàn đồng ý với các ý kiến ​​lỗi chính. Bạn cũng có thể sử dụng phương thức get () của từ điển để tránh các ngoại lệ. Điều này cũng có thể được sử dụng để đưa ra một đường dẫn mặc định chứ không phải Nonenhư hiển thị bên dưới.

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

9
+1 cho nhận xét .get () rất phù hợp. Trông giống như một ứng dụng tốt của EAFP Python (Dễ xin tha thứ hơn so với quyền) thay vì LBYL (Nhìn trước khi bạn nhảy) mà tôi nghĩ là ít Pythonic hơn.
Niels Bom

32

Đối với dict, chỉ cần sử dụng

if key in dict

và không sử dụng

if key in dict.keys()

Nó sẽ tốn thời gian


5

Có, rất có thể là do khóa không tồn tại.

Trong chương trình của tôi, tôi đã sử dụng setdefault để tắt tiếng lỗi này, vì lo ngại về hiệu quả. tùy thuộc vào mức độ hiệu quả của dòng này

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

Tôi cũng mới biết về Python. Trong thực tế tôi vừa học nó ngày hôm nay. Vì vậy, tha thứ cho tôi về sự thiếu hiểu biết về hiệu quả.

Trong Python 3, bạn cũng có thể sử dụng chức năng này,

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

Người ta nói rằng nó sẽ không bao giờ đưa ra một lỗi chính.


Phương thức get là cổ xưa, tôi nghĩ ngay cả những người dùng 1.x cũng có nó. Nhưng tôi chắc chắn 2.7 đã có nó.
Jürgen A. Erhard

3

Điều này có nghĩa là mảng của bạn thiếu khóa bạn đang tìm kiếm. Tôi xử lý điều này với một hàm trả về giá trị nếu nó tồn tại hoặc thay vào đó nó trả về một giá trị mặc định.

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')

Đầu ra:

1
2
#default

7
Argh ... khủng khiếp, mã unpythonic khủng khiếp. Đừng viết mã PHP bằng Python: nó không phải là một mảng, nó là một từ điển (bạn có thể gọi nó là một hàm băm, nhưng mảng thì đúng). Và: dicts đã có chức năng "keyCheck" của bạn: thay vì "keyCheck ('key1', myarray, '#default')" bạn sẽ làm "mydict.get ('key1', '#default')"
Jürgen A Erhard

2

Tôi đã nhận được lỗi này khi tôi phân tích cú pháp dictvới lồng nhau 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])

Tìm lại:

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

Bởi vì trong vòng lặp thứ hai nên cats[cat]thay vào đó cat(chỉ là một khóa)

Vì thế:

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])

Tặng

black
10
white
8

0

Ví dụ: nếu đây là một số:

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

Nó hoạt động hoàn hảo, nhưng nếu bạn sử dụng ví dụ:

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

nó không hoạt động, bởi vì chuỗi trả về đầu vào của bạn '1'. Vì vậy, bạn cần sử dụng int ()

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

0

Hãy để chúng tôi làm cho nó đơn giản nếu bạn đang sử dụng Python 3

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

Nếu bạn cần điều kiện khác

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

Đối với giá trị khóa động, bạn cũng có thể xử lý thông qua khối ngoại lệ thử

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'}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.