2012-03-21 5 views
1

I가 다음 사전 :사전 GET 방식의 동작

dic = {"a": "first", "b": "second"} 

및 괜찮아요, 난 다음 작업을 수행 할 때 :

print dic.get("a", dic.get("c").split(" ",1)[0]) 
:

print dic.get("a") 
print dic.get("a", "asd") 
print dic.get("a", dic.get("c")) 

을하지만이 같은이 방법을 사용하면

다음 오류가 발생합니다.

Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
AttributeError: 'NoneType' object has no attribute 'split' 

마지막 사례를 이해하지 못합니다. 계산 된 두 번째 인수 (dic.get ("c")는 None이어야합니다. 괜찮습니다)하지만 사전에 키 "a"가 있고 첫 번째 인수는 두 번째 인수의 계산을 실행해서는 안됩니다.

어떻게 해결할 수 있습니까? 왜 그런 일이 일어 났습니까?

TIA!

답변

2

다른 사람들이 설명했듯이 파이썬 (함수 계열 외부의 대부분의 다른 언어와 마찬가지로)은 함수를 호출하기 전에 함수의 모든 인수를 평가합니다. 따라서 키 "c"가 사전에 존재하지 않고 None.split() 메서드가없는 경우 은 None이고이 결과는 get의 성공 여부에 관계없이 발생합니다.

대신 단락 논리 연산자 또는 조건부 표현식을 사용하십시오.

# if dic.get["a"] is always truthy when it exists 
dic.get("a") or dic.get("c", "").split(" ", 1)[0] 

# if dic["a"] could be non-truthy, e.g. empty string 
dic["a"] if "a" in dic else dic.get("c", "").split(" ", 1)[0] 
+0

나는이 방법을 즐긴다! 고마워! – dizpers

3

두 번째 인수는 항상 사용 여부에 관계없이 평가됩니다.

get 대신 항목을 찾을 수없는 경우 발생하는 예외를 해결할 수 있습니다. 이 None을 반환 있도록

try: 
    result = dic['a'] 
except KeyError: 
    result = dic['c'].split(' ', 1)[0] 
print result 
+0

Thx! 그리고 계산 된 이유는 무엇입니까? 그것은 파이썬 기능입니까? 나는 그것이 쓸모 없다고 생각한다. – dizpers

+0

@dizpers : http://stackoverflow.com/questions/9761396/dict-get-default-arg-evaluated-even-upon-success를 참조하십시오. –

+1

@dizpers :'get'은 다른 어떤 것과 마찬가지로 일반적인 방법입니다.파이썬 인터프리터는 메소드 내부를 보지 않고 매개 변수의 사용법을 확인합니다. 파이썬의 모든 일반적인 메소드 호출과 마찬가지로, 메소드 호출이 수행되기 전에 모든 인수가 평가됩니다. 모든 인수가 평가되지 않는 몇 가지 상황이 있습니다 (예 : 단락을 사용하는 특별한'and'와'or' 연산자. –

2
dic.get("c") 

귀하의 사전 는 "C"를 포함하지 않습니다.

dic.get("c").split(" ",1)[0] 

우리가 dic.get("c")None 것을 알고 있기 때문에 : 당신이 오류가 발생하는 이유는 그래서

None.split(" ",1)[0] 

None, 아니 split 방법이 없습니다.

인수는 모두 메소드에 전달되기 전에 평가됩니다.

+0

이 점을 이해합니다. 문제는이 표현식이 계산되는 이유입니다. 첫 번째 인수는 ok이므로 .get() 메서드는 두 번째 인수와 함께 작동하지 않아야합니다. – dizpers

+1

@dizpers - 인터프리터는 함수를 호출하기 전에 모든 인수를 알아야합니다. 일부 언어는 [Lazy Evalutation] (http://en.wikipedia.org/wiki/Lazy_evaluation)을 사용합니다. 즉, 필요할 때만 평가하지만 Python은 그러한 언어 중 하나가 아닙니다. –

+0

좋은 답변 - thx! – dizpers

3

아마 당신은 오타가 있고 외부 dic.get이 아닌 내부 하나의 결과를 분할하기위한 것입니다

print dic.get("a", dic.get("c")).split(" ",1)[0] 

을 의미했다.

+0

아니요, "a"키에는 항상 공백없이 값이 있지만 "c"에는 항상 공백이 있습니다. – dizpers