2012-01-31 2 views
2
str='test' 
example={'test':'value',} 
return str in example and example[str] or None 

example에 키 str의 여분의 여분의 테스트가있는 이유는 무엇입니까?이 (중복?) 파이썬 표현의 의미는 무엇입니까?

+1

을 얻을 것이다 존재하지 않는 경우에 당신은 예를 반환'쓴다 [STR] 예 STR 다른 None' –

+0

@JochenRitzel 경우 -이 내 대답에서 내가 지적했던 점을 다시 놓치고있다. 그의 예를 기반으로 진리 테스트를하는 가치를 잡을 필요가있다. False – jdi

+0

@jdi : 대부분의 시간에 '또는'이 두 값 중 하나를 반환하는 데 사용된다면, 의도는 0을 방지하는 것이 아니다. '' [] 등이 리턴되는 것을 막기 위해, 그것은''if'' 블록/표현식 전체를 입력해야한다면 사람들이 키보드가 마모 될까봐 사람들이 염려하기 때문에 기본값으로 사용하는 '영리한'한 줄기 일뿐입니다. 개인적으로 나는 그것이 약간의 반 패턴이라고 생각한다; 이 경우에는 키 아래에 저장된 "거짓"값을 저장되지 않은 키와 구별 할 수 없다는 사실이 원하는 동작보다는 고려되지 않은 구석 (즉, 버그)이 될 가능성이 높습니다. – Ben

답변

6

이 예제에서는 'test'가 예제 dict에서 실제로 유효한 키인지 확인해야합니다. 그렇지 않으면 KeyError 예외가 발생합니다. 그런 논리는 그것을 키를 확인하거나 반환 진행, 또는이 예제는 단순히 한 경우 없음 예제의 값은 [STR] 거짓

에 evals 그것은 훨씬 쉽게 할 수 없을 것입니다 경우 :

str='test' 
example={'test':'value',} 
return example.get(str, None) or None 

여분의 PARAM이 (얻을 수 있기 때문에),

도 간단 업데이트 필요하지 않습니다 :

return example.get(str) or None 

업데이트 2 다음 OP에서 진실 시험 및 부울 연산을 부셔

example = { 
    'test' : 'value', 
    'test2': 0, 
    'test3': [], 
} 
test = lambda k: k in example and example[k] or None 
print test('test') 
# value 
print test('test2') 
# None 
print test('test3') 
# None 
+0

방금'return example.get (str, None)'을 실행하면 훨씬 더 쉬울 것입니다. – juliomalegria

+1

@ julio.alegria - 틀 렸습니다. 단순히 반환하면 빈 문자열 또는 int 0 또는 null 유형이 반환됩니다. OPs 예제는 값이 False로 평가되면 None을 반환한다는 것을 보여줍니다. – jdi

+0

'get()'메소드에 대해 [더 많은 것을 읽으시려면] (http://docs.python.org/library/stdtypes.html#dict.get) 제안하십시오. 패스 한 키가 발견되지 않으면'None' (False가 아님) 또는 기본값 (두 번째 매개 변수)이 반환됩니다. 그래서 실제로 ** ** 더 쉽게 (같은 결과로) return example.get (str)을 수행합니다. – juliomalegria

3

처음에는 존재하지 않는 키를 찾는 경우 동작이 다릅니다 (추가 테스트를 수행하면 KeyError 예외가 발생하지 않습니다). 은 불리언 문맥에서 거짓이 될 수 있기 때문에 그 이상이됩니다. 예를 들어 빈 문자열 일 수 있습니다.

>>> str='test' 
>>> example={'test':[],} 
>>> str in example and example[str] or None 
>>> str in example or None 
True 

그래서 매우 중복되지는 않습니다. str in example은 키의 존재를 확인하는 반면 and example[str]은 값의 진실성을 검사합니다.

+0

물론, 이것이 실제로 정확한 코드라면 문제는 복사/붙여 넣기 작업 일 가능성이 큽니다. – NotMe

0

str in examplestrexample의 키인지 example[str] 연관된 실제 값을 산출하면서, 표시하는 부울 시험이다 (코멘트 기준) 그 열쇠로.

2

파이썬은 부울을 느리게 평가하므로 간단한 테스트에서 괄호를 생략 할 수 있습니다. 이것은 쉽게 읽을 수 있도록 수 있습니다

(str in example and example[str]) or None 

를 일반 영어로 :

"사전 example 키도 아닌 거짓 값을 가지고있는 키 str을 가지고 있는지 확인합니다 그래서를 반환합니다. 값 example[str]입니다. 그렇지 않으면 None "

0

오류가 발생합니다. 키가 존재하지 않으면 런타임에 조회 'example [str]'이 실패합니다. 실수를하고 앱을 종료하고 추적을받습니다. 먼저 키를 확인하여 대신 None 값을 얻으면 응용 프로그램이 즐겁게 진행됩니다.

다른 일반적인 접근 방법은 예외를 catch하고 그 결과로 없음을 반환하는 것입니다.

def testfun(): 
    str='test2' 
    example={'test':'value',} 
    try: 
     return example[str] 
    except KeyError: 
     return None 
+0

이것은 기존 값이 평가되지 않음을 확인하는 것과 동일한 보호를 제공하지 않습니다. – jdi

+0

당신은 어떻게 의미합니까? 어떤 상황에서 출력이 다를 것인가? – Janne

+1

'example [ 'test'] == 0'이면 0을 반환하고 None은 반환하지 않게됩니다. OPs 예제는 값이 False로 평가되는지 여부도 확인합니다. 너는 그렇지 않아. – jdi

0

키가 영어와 최근 파이썬에서 KeyError exception

#!/usr/bin/python 

str='test' 
example={'test':'value',} 

if str in example and example[str]: 
    print example[str] 
else: 
    print False 
관련 문제