2011-01-29 2 views
0

다양한 목록을 가져와야하는 결과 목록이 있습니다. 예를 들어, 남성 인 모든 소유자, 5 세에서 10 세 사이의 모든 자동차.이 목록 작성 코드를 리팩토링하는 가장 좋은 방법은 무엇입니까?

def get_male_owners(self): 
    results = [] 
    for result in self.results: 
     if result.owner.sex.male: 
      results.append(result) 
    return results 

def get_cars_5_to_10(self): 
    results = [] 
    for result in self.results: 
     if result.car: 
      if self.is_5_to_10(result.car): 
       results.append(result) 
    return results 

def is_5_to_10(self, car): 
    if car.age <= 10 and car.age >= 5: 
     return True 
    else: 
     return False 

빌드해야 할 목록이 많이 있지만 목록 작성 기능의 각 코드는 많이 사용됩니다. Python 방식으로 DRY를 구현하는 가장 좋은 방법은 무엇입니까? 감사.

+0

"가장 평범한"방법은 없습니다. 아주 단순한 경우를 제외하고는 Pythonic 방식이 있습니다. 그렇지만 "가장 파이썬적인"방식은 아닙니다. 예를 들어, 목록 내재는 Pythonic (이 경우와 같이)으로 표시되지만 때로는 너무 복잡하여 읽을 수 없기 때문에 이해하기 어렵습니다. :) –

답변

3

사용 지능형리스트 : 당신은 당신이 또한 괄호 브래킷을 교체하여 발전기 식을 반환 할 수 반복 가능한 무언가를해야하는 경우

def get_male_owners(self): 
    return [res for res in self.results if res.owner.sex.male] 

def get_cards_5_to_10(self): 
    return [res for res in self.results if res.car and self.is_5_to_10(res.car)] 

def is_5_to_10(self, car): 
    return 5 <= car.age <= 10 

.

그렇습니다. x <= y <= z 표현식은 파이썬에서 작동하며 올바른 결과를 산출하지만 (5 <= car.age) <= 10과 같은 것은 아닙니다.

+0

하나의 부차적 인 점, 결과 변수가 res가 아니어야합니까? – Ambrosio

+0

이 수정되었습니다. (그리고이 최소한의 주석 길이는 어리 석다.) – ThiefMaster

1
def filter(self, by=None): 
    return [res for res in self.results if by(res)] 

def get_male_owners(self): 
    return self.filter(lambda res: res.owner.sex.male) 
+1

'self.get' 대신'self.filter'를 사용 했습니까? – ThiefMaster

+2

인수에 대해 함수를 제공하지 않고 필터 메서드를 호출하면 어떻게됩니까? by is가 None이 아닌지 확인하지 않습니다. 또한 파이썬은 내장 함수 필터를 가지고 있으며 파이썬 내장 함수와 동일한 방법으로 이름을 지정하는 것은 좋은 생각이 아닙니다. – sateesh

관련 문제