我有一个这样的课程:
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
但我不想为每个函数编写相同的逻辑(可能有很多这样的函数)。
这是我可以使用装饰器的地方吗?或者有另一种方法来实现所期望的行为吗?
答案 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