我实际上重复相同的代码,每个函数只有一个小的改动,但是一个重要的改变。
我有大约4个与此类似的功能:
def list_expenses(self):
explist = [(key,item.amount) for key, item in self.expensedict.iteritems()] #create a list from the dictionary, making a tuple of dictkey and object values
sortedlist = reversed(sorted(explist, key = lambda (k,a): (a))) #sort the list based on the value of the amount in the tuples of sorted list. Reverse to get high to low
for ka in sortedlist:
k, a = ka
print k , a
def list_income(self):
inclist = [(key,item.amount) for key, item in self.incomedict.iteritems()] #create a list from the dictionary, making a tuple of dictkey and object values
sortedlist = reversed(sorted(inclist, key = lambda (k,a): (a))) #sort the list based on the value of the amount in the tuples of sorted list. Reverse to get high to low
for ka in sortedlist:
k, a = ka
print k , a
我认为这就是他们所说的违反“DRY”的内容,但是我不知道如何将其更改为DRYlike,因为我有两个单独的词典(costsedict和incomedict),我需要与...合作。
我做了一些google搜索并发现了一些叫做装饰器的东西,我对它们的工作方式有了非常基本的了解,但我不知道如何将它应用于此。
所以我的要求/问题:
这是装饰者的候选人,如果装饰者是 必要的,我可以提示一下装饰者应该做什么吗?
伪代码很好。我不介意挣扎。我只需要一些东西 开头。
答案 0 :(得分:4)
您如何使用单独的函数(作为私有方法)进行列表处理?例如,您可以执行以下操作:
def __list_processing(self, list):
#do the generic processing of your lists
def list_expenses(self):
#invoke __list_processing with self.expensedict as a parameter
def list_income(self):
#invoke __list_processing with self.incomedict as a parameter
它看起来更好,因为所有复杂的处理都在一个地方,list_expenses
和list_income
等是相应的包装函数。