2010-01-11 3 views
2

을 위해 무엇인가파이썬 웨이 (자체 설명해야한다,하지 않을 경우, 단지 질문) 나는이 코드 조각이 쓰기 매칭 알고리즘

for tr in completed_taskrevs: 
    found = False 
    for nr in completion_noterevs: 
     if tr.description in nr.body: 
      completion_noterevs.remove(nr) 
      found = True 
      break 
    assert found 

가 어떻게 더 파이썬 할 수 있습니까?

+3

"알 고"는 무엇을 의미합니까? –

+0

@ S.Lott 알고리즘. –

+0

@ 행크 게이 : 정말요? 그건 무슨 언어 니? –

답변

6

여기 아마 잘못, 내가 말할 것입니다. "debugging assertions"은 코드가 정상적인 지 확인하는 데 유용합니다. 유효하지 않은 데이터를 얻을 때 오류를 발생시키는 방법으로는 유용하지 않습니다. 그 이유 중 가장 흥미로운 것은 어설 션이 실행되지 않을 수도 있습니다. 코드가 최적화 설정으로 컴파일 된 경우 되지 않을 것이다. 그리고 비록 이것이 디버깅 일지라도, 나는 여전히 raise를 사용합니다. 그것은 더 읽기 쉽고, 데이터가 언제 또는 왜 잘못되었는지에 관계없이 항상 발생합니다.

그래서 "파이썬 (pythonic)"으로 만들려면 어설트를 제거하고 더 멋진 것으로 바꾸십시오. 그런 일이 발생하면 더 좋은 것은 존재하며 그것은 raise 문장입니다. 또한, 나는 루프가 다 써 버렸을 때 실행되는 else clause of loops (또는 while 루프의 경우 조건이 거짓이 될 때)으로 설정된 clumsy 값 set/check를 대체합니다. 그래서 깨면 else 절은 실행되지 않습니다.

for tr in completed_taskrevs: 
    for nr in completion_noterevs: 
     if tr.description in nr.body: 
      completion_noterevs.remove(nr) 
      break 
    else: 
     raise ValueError("description not found"); # or whatever exception would be appropriate 

이외에는 아무 것도 바꿀 수 없습니다.

+0

'그 밖의'것은 매우 좋았습니다. 나는 그것에 대해 몰랐습니다. 어설 션과 관련하여 - 코드 해설 도구에서 코드를 추출 했으므로 프로덕션 코드가 아닙니다. 따라서 저와 고객은 어설 션을 사용할 수 있습니다. –

8

이 시도 :

for tr in compleded_taskrevs: 
    try: 
     nrs = (nr for nr in completion_noterevs if tr.description in nr.body) 
     completion_noterevs.remove(nrs.next()) 
    except StopIteration: 
     raise ValueError('Some error') 

편집 : 데빈이 권리입니다. 어설 션은 표준 예외를 사용하는 것이 좋습니다.

+0

감사합니다. 아마도 가장 Pythonic으로 보일지 모르지만 첫눈에 분명하지 않습니다. 그래서 저는 지금 귀하의 답변을 투표하고 있지만 Devin의 답변을 수락하고 있습니다. –

3

아래의 목록 생성기는 유효한 모든을 반환 할 수 있지만 꽤 많은 분기가 있기 때문에 알고리즘을 단순화하기가 어렵습니다. 나는 당신이 원하는만큼 알고리즘을 가지고 있다고 말할 것입니다. assert/AssertionError를 사용

[nr for tr in completed_taskrevs for nr in completion_noterevs if tr.description in nr.body] 
+0

이것도 Pythonic으로 보입니다. 그러나 그것은 나에게 너무 혼란 스럽습니다. Pythonic과 쉽게 읽을 수있는 코드를 선호합니다. 이걸 쓰면 너를 위해 투표 해. –

+0

그래, 나는 난독 화 비트에 동의한다. 항상 균형을 추구해야합니다. – rui