2010-12-23 5 views
5

반환 된 값이 None 인 경우 KeyError 예외를 발생시키고 싶지만 오류가 발생합니다. "SyntaxError : invalid syntax"python dict : 값이 없으면 예외 발생시키기

try: 
    protocol = serverInfo_D['protocol'] or raise KeyError("protocol not present") 
except KeyError: 
    print "Improper server config" 

이 작업을 수행하는 간단한 방법은 무엇입니까?

+1

AFAIK 지정된 키가없는 경우 AFAIK 파이썬의 사전에서 이미 KeyError 예외를 throw합니다. – Simone

+1

@Simone - 키가 누락되지 않았을 때뿐만 아니라 값이 '없음'일 때 예외를 발생 시키려고합니다. – Yarin

답변

5

raise은 문이 아닌 표현 인 SyntaxError 때문에이 있어요 : 당신이 한 줄에 항상 함수를 만들 수 원하는 경우

>>> d = dict(a=1, b=2) 
>>> d.get('c') # no KeyError 
>>> d['c']  # KeyError 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 'c' 
0

나는 이것이 당신이 원하는 라인에 더 가깝다고 생각합니다. 변경할 필요가 있으면 의견을 말하십시오.

try: 
    protocol = serverInfo_D['protocol'] 
    if protocol == None: 
     raise KeyError("protocol not present") 

희망이

+0

우리는 또는을 사용하여 한 줄에 넣을 수 없습니다. coz 나는 그러한 많은 검증을하고 있습니다. – goutham

+3

'is None'이 더 좋을 것입니다. – user225312

+0

이 문제는 다른 문제를 해결한다고 생각합니다. 그는 지정된 프로토콜이 처리되지 않으면 serverInfo_D [ 'protocol']가 설정되지 않았으므로 할당하면 KeyError가 발생한다고 가정합니다. 코드가 None으로 설정되어 있다고 가정하는 것으로 보이므로 KeyError를 수동으로 throw해야합니다. –

1

tryexcept KeyError 조합이 작동해야하는 데 도움이됩니다. 당신에게 효과가없는 것은 무엇입니까?

그리고 이전 질문의 연속에서 을 결코 버리지 않는 dict.get을 사용했기 때문에 작동하지 않는 것이므로.

그러나이 질문의 코드는 다음과 같습니다. 그리고 or raise KeyError은 필요하지 않습니다. or raise KeyError 부분이되지 않도록,

def valueOrRaise(data, key): 
    value = data.get(key) 
    if value is None: 
     raise KeyError("%s not present" % key) 
    return value 

try: 
    protocol = valueOrRaise(serverInfo_D, 'protocol') 
except KeyError: 
    print "server config is not proper" 
+0

d [ 'c']에 None 값이 포함되어 있으면 어떨까요? – goutham

+0

'raise'는 표현식이 아니기 때문에 OP 코드의'또는 raise KeyError' 부분은'SyntaxError'입니다. – martineau

+0

OP가 요구 한 것은 아니지만 값이 존재하기 때문에 KeyError는 발생하지 않지만 OP는 예외 상황이 되고자하는 None 값을가집니다. – PaulMcG

5

감각적으로 만들어라. 한 가지 해결 방법은 lookwise 값이 None, 0, ''[]과 같이 참이 아닌 값인 경우에만 호출되는 다음과 같은 함수에이를 넣는 것입니다.

주의 할는 : 무엇을 효과적으로 수행하는 값 이러한 유형의 존재가 키가 기술적으로 그것이 비록 없었다 것처럼 것으로 보이게하기 때문에이 일을하는 것은 잠재적으로 혼란 있습니다 .. . built-ins 중 하나에서 특수 예외 클래스를 파생시킨 다음 [ab] 대신에 KeyErrornormally means을 사용하여 처리 할 수도 있습니다.

def raise_KeyError(msg=''): raise KeyError(msg) # Don't return anything. 

try: 
    protocol = serverInfo_D['protocol'] or raise_KeyError('protocol not present') 
except KeyError: 
    print 'Improper server config!' 
3

정말 이런 식으로 사용하는 경우 예외를 원하십니까? .get()을 사용하고 None을 확인하십시오.

protocol = serverInfo_D.get('protocol') 
if protocol is None: 
    print "server config is not proper" 
관련 문제