如何使用Python Decorator只更改函数的一部分?

时间:2014-11-27 09:57:32

标签: python python-2.7 dry python-decorators

我实际上重复相同的代码,每个函数只有一个小的改动,但是一个重要的改变。

我有大约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搜索并发现了一些叫做装饰器的东西,我对它们的工作方式有了非常基本的了解,但我不知道如何将它应用于此。

所以我的要求/问题:

  1. 这是装饰者的候选人,如果装饰者是 必要的,我可以提示一下装饰者应该做什么吗?

  2. 伪代码很好。我不介意挣扎。我只需要一些东西 开头。

1 个答案:

答案 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_expenseslist_income等是相应的包装函数。