2014-09-02 2 views
-3

선호되는 디자인 패턴은 무엇입니까? 사전 D에서 사전 키 실행을위한 올바른 디자인 패턴 선택

그 수도 있고 '갑'라는 키 ...

패턴

if d.get('foo'): 
    func(d.get('foo')) 

패턴 B

foo = d.get('foo') 
if foo: 
    func(foo) 

I이 없을 수도 패턴 A의 2 라인 접근 방식을 선호한다고 생각합니다. 두 번째 조회는 Patte의 추가 할당보다 비용이 더 많이 듭니까 rn B?

답변

2

당신이 쓰고있는 두 가지는 완전히 다른 일을합니다.

첫 번째 문자는 '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 
+0

내가 잘못에 입력. 원래 의도대로 업데이트했습니다. – bholben

+0

예.DRY가 중요한 이유 중 좋은 예입니다. 'in' 연산자를 사용한 패턴 A는 훨씬 더 좋은 것으로 들립니다. – bholben