2014-11-27 3 views
1

Я практически повторяю тот же код с одним незначительным изменением в каждой функции, но существенным изменением.Как использовать Python Decorator для изменения только одной части функции?

У меня есть около 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 

Я считаю, что это то, что они называют нарушение «всухую», однако я не имею ни малейшего представления, как я могу изменить это быть более DRYlike, поскольку у меня есть два отдельных словаря (expencedict и incomedict), с которыми мне нужно работать.

Я сделал несколько поисковых запросов и нашел что-то, называемое декораторами, и у меня есть очень общее представление о том, как они работают, но не знаю, как я применил бы его к этому.

Так что мой запрос/вопрос:

  1. Является ли это кандидат на декоратор, а если декоратор необходимо, я мог получить намек на то, что декоратор должен делать?

  2. Псевдокод в порядке. Я не против борьбы. Мне просто нужно что-то для начала.

+2

Ответ Константина - это путь. Я просто хочу добавить, что этот вид обработки может быть написан гораздо более компактным образом, например: 'для k, i в сортировке (d.iteritems(), key = lambda t: t [1] .amount): print k, i.amount' – simleo

+0

С этим я могу полностью вырезать понимание списка. Я знаю, что это может показаться глупым, но не могли бы вы рассказать мне, как работает лямбда: t t [1]? Как лямбда становится списком? – Kameron

+0

Nvm, только что реализованный, отсортированный из iterkeys возвращает кортеж, и кортежи могут быть проиндексированы! Вы, ребята, потрясающие. – Kameron

ответ

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 и т.д., соответствующие функции оболочки.

+0

Это звучит очень кратким и, кажется, самый простой способ сократить код. Будучи релятивистом нового программиста на Python, я думаю, я просто подскочил к выводу, что он должен быть сложным. – Kameron

Смежные вопросы