这是装饰器的合适用途吗?

时间:2016-12-13 18:05:25

标签: python decorator python-decorators

我有一个这样的课程:

2015-08-21 09:15:47  27.925
2015-08-21 10:15:47  28.495
2015-08-21 11:15:47  27.596
...
2016-08-10 07:19:24  16.944
2016-08-10 08:19:24  27.149
2016-08-10 09:19:24  28.152

和一堆像这样的方法:

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

但我不想为每个函数编写相同的逻辑(可能有很多这样的函数)。

这是我可以使用装饰器的地方吗?或者有另一种方法来实现所期望的行为吗?

1 个答案:

答案 0 :(得分: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