당신이 쓰고있는 두 가지는 완전히 다른 일을합니다.
첫 번째 문자는 'foo'
문자열을 func
의 인수로 사용합니다.
두 번째 것은 d['foo']
에있는 값을 func
의 인수로 사용합니다.
어느 것이 옳은지는 전적으로 당신이 실제로하고 싶은 것이 무엇인지에 달려 있습니다.
편집 된 버전에서 조회를 두 번 수행하는 것은 바보입니다.
물론 더 많은 비용이 필요합니다. 'foo'
을 두 번 해시하고 해시 값을 조사한 다음 (두 번 프로브 할 수 있습니다) 한 번만 수행하면 비용이 두 배가됩니다. 그러나 실제 프로그램에서는 성능 비용이 중요하지 않습니다. (해시 값이 비싼 키가 해시 값을 캐시하는 경우 ...)
더 현실적인 잠재적 인 문제는 코드를 멀티 스레드로 만들거나 재진입을 원한다면 아무런 합당한 이유없이 경쟁 조건을 추가했습니다.
하지만 더 중요한 것은 자신을 반복하면 항상 실수를 반복 할 기회가 생기므로 정확하게 반복해야하기 때문에 특히 나중에 사본 중 하나를 편집 할 때 특히 그렇지 않은 경우 항상 명확하지는 않습니다. (처음에 잘못된 질문을한다는 사실은 꽤 좋은 논점입니다.) 그리고 같은 이유로 사람들은 코드를 잘못 읽거나 책을 읽는 것에 걸려 넘어지고 뭔가 생각해야합니다. 그것은 분명해야했습니다. 그래서 DRY (반복 할 필요가없는 한 자신을 반복하지 마십시오)는 프로그래밍의 기본 원칙입니다.
그 첫 번째 것은 if 'foo' in d:
으로 작성하는 것이 더 낫습니다. 실제로 값을 필요로하지 않으면 값을 검색하지 마십시오.
그리고 두 번째는 더 나은 대신 LBYL의 EAFP 작성 될 수 있습니다
try:
func(d['foo'])
except KeyError:
pass
또는 파이썬 3.5 :
func(d['foo']) except KeyError: None
내가 잘못에 입력. 원래 의도대로 업데이트했습니다. – bholben
예.DRY가 중요한 이유 중 좋은 예입니다. 'in' 연산자를 사용한 패턴 A는 훨씬 더 좋은 것으로 들립니다. – bholben