2016-12-13 45 views
1

我有這樣一類:這是一個適合裝飾者使用嗎?

class MyClass(object): 
    def __init__(self, name): 
     self.name = name 
     self.df = pd.read_table(name) 

和這樣一堆方法:

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) 

編輯:只是爲了好玩,裝飾版本。我已經知道(ab)使用裝飾器,所以我可以理解這個願望:

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',但它似乎沒有做任何事情。用'@ print_error_info'裝飾'def id(df):return df'返回'df'而不是'[「第0行中的錯誤:...」,...]'。 – user4601931

相關問題