파이썬에서 키 오류가 발생합니다.


191

내 파이썬 프로그램 에서이 오류가 발생합니다.

KeyError: 'variablename'

이 코드에서 :

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

왜 이런 일이 일어나고 있는지 설명해 주시겠습니까?


11
Key error일반적으로 key존재하지 않는 것을 의미 합니다. 그래서 '경로'가 존재합니까?
RanRag

3
내용을 인쇄하고 meta_entry원하는 키가 있는지 확인하십시오.
Makoto

답변:


262

A는 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

흠 ... 어떻게 할까? (멍청한 놈) 죄송합니다. 앱이 Google 앱 엔진에서 호스팅되며 앱에서 생성 한 파일에 액세스 할 수 없습니다.
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
관련성이 높은 .get () 주석의 경우 +1 나는 파이썬이 덜하다고 생각하는 LBYL (Look Before You Leap) 대신 Python EAFP (권한보다 용서를 구하는 것이 더 쉽다)의 좋은 응용 프로그램처럼 보입니다.
Niels Bom

32

dict의 경우, 그냥 사용하십시오

if key in dict

키 목록에서 검색을 사용하지 마십시오

if key in dict.keys()

후자는 더 많은 시간이 소요됩니다.


5

예, 비 일관적인 키 때문일 수 있습니다.

내 프로그램에서 효율성을 위해 setdefault를 사용 하여이 오류를 음소거했습니다. 이 라인이 얼마나 효율적인지에 따라

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

나는 파이썬도 처음이다. 사실 나는 오늘 그것을 배웠다. 따라서 효율성의 무지에 대해 용서하십시오.

Python 3에서는이 함수를 사용할 수도 있습니다.

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

키 에러는 발생하지 않는다고합니다.


get 메소드는 고대이므로 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 코드를 작성하지 마십시오 : 그것은 배열이 아니며 사전입니다 (해시라고 부를 수 있지만 배열은 옳습니다). 그리고 dicts에는 이미 "keyCheck"기능이 있습니다. "keyCheck ( 'key1', myarray, '#default')"대신 "mydict.get ( 'key1', '#default')"
Jürgen A Erhard

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.