2016-12-13 1 views
1

은 내가 이런 클래스가이것은 데코레이터에 적절한 용도입니까?</p> <pre><code>class MyClass(object): def __init__(self, name): self.name = name self.df = pd.read_table(name) </code></pre> <p>이 같은 방법의 무리 :

가 결국
def valid_cond1(self): 
    # check if cond1 is satisfied with respect to self.df and return 
    # a DataFrame of rows not satisfying cond1 

def valid_cond2(self): 
    # same deal 

등, 나는이 방법의 각각의 출력을 먹고 싶어, 그리고 형식이 잘못된 행 목록을 클라이언트에 반환하십시오. 내가 지금처럼 구현을 조정하여 valid_cond1이 작업을 수행 할 수 있습니다

def valid_cond1(self): 
    # err_df = rows of self.df not meeting cond1 
    bad_lines = [] 
    for ix, val in err_df.iterrows(): 
     bad_lines.append("Error in line %s: %s. Cond1 not met.." % (ix,val)) 
    return bad_lines 

하지만 이러한 각 기능에 대해 동일한 로직을 작성하지 않으려는 (아마도 그들 중 아주 많습니다).

데코레이터를 사용할 수있는 곳입니까? 아니면 원하는 행동을 달성하기위한 또 다른 방법이 있습니까?

+0

각 방법의 외부에서 어떻게 'err_df'에 접근 할 수 있는가? 데코레이터는 전역,'self', 들어간 인수, 반환 값에 문제없이 액세스 할 수 있습니다. 따라서 * err_df를 반환 한 경우에는 문제가 없습니다. 꾸미는 사람이 대신 할 수 있습니다. 그렇지 않으면 그냥 함수를 사용하십시오. –

+0

다른 메소드를 입력으로 사용하여 호출하고 결과를 원하는대로 형식화하는 메소드를 작성하십시오. – kindall

+0

다른 이유로이 함수의 출력을 원할 가능성이 있습니까? 이 경우 별도의 서식 지정 기능을 작성하여 결과를 전달할 수 있습니다. 프로그램 로직과 프리젠 테이션을 분리하십시오. – tdelaney

답변

2

단순히 무난 무엇인가에 조건을 만들 수없는 경우 피하기 위해 이런 일을 할 수

def check_condition(self, condition): 
    # check the condition 
    return bad_lines # etc. 

def valid_cond1(self): 
    # define condition_1 
    return self.check_condition(condition_1) 

def valid_cond2(self): 
    return self.check_condition(condition_2) 

이 같은 뭔가를 장식으로 이동하지만, 아마도 더 일반적인 방법 않을 것 오류 인쇄 코드를 적어도 반복하십시오 :

@staticmethod 
def invalid_condition(err_df): 
    # bad lines stuff here 

def valid_cond1(self): 
    # calculate err_df 
    if err_df: 
     return self.invalid_condition(err_df) 

EDIT : 그냥 재미를 위해 꾸미기 버전. 나는 장식자를 사용하는 것으로 알려져있어 욕망을 이해할 수있다 :

from functools import wraps 

def print_error_info(func): 
    @wraps(func) 
    def wrapped(*args, **kwargs): 
     err_df = func(*args, **kwargs) 
     bad_lines = [] 
     for ix, val in err_df.iterrows(): 
      bad_lines.append("Error in line %s: %s. Cond1 not met.." % (ix,val)) 
     return bad_lines 
    return wrapped 

# use 
class MyClass: 
    # *snip* 

    @print_error_info 
    def valid_cond1(self): 
     # whatever you need 
     return err_df 
+0

감사합니다. 이것은 아마 그것을하는 방법 일 것이지만, 나는 그것이 장식 자와 함께 어떻게 이루어질 수 있었는지보고 싶었습니다. – user4601931

+0

귀하의 질문에 대한 대답은 아마도 "아니오"일 뿐이지 만,이 사용 사례에 대한 데코레이터의 (테스트되지 않은) 구현에 대한 편집을 참조하십시오. 여기서 내 마음에 데코레이터를 사용하는 데 따른 문제는 실제로 기능과 관련이 없지만 코드의 가독성 및 유지 관리 가능성과 관련이 있습니다. –

+1

그건 중요한 지적입니다. 대략'print_error_info'를 생각해 냈지만 아무 것도하지 않는 것 같습니다. 'def id (df) : return df'를'@ print_error_info'로 꾸미면'[ "에러가 아니라'df'를 리턴합니다. 라인 0의 에러 : ...", ...]'. – user4601931

관련 문제