Джанго, проблема логики петли Питона - PullRequest
1 голос
/ 13 марта 2009

Это работает, частично. Может потребоваться больше информации, однако я подумал, что опубликую, чтобы получить совет по поводу всего очевидного, что может быть здесь неправильным.

Проблема в том, что если activity.get_cost () возвращает значение False, функция, похоже, завершается полностью, возвращая None.

Что бы я хотел, конечно, это накапливать cost Десятичные значения в costs = [] и возвращать их сумму. Все просто, я бы подумал ... но моим начинающим навыкам Python явно что-то не хватает.

Более подробная информация предоставляется по запросу. Спасибо.

def get_jobrecord_cost(self):
    costs = []
    for activity in self.activity_set.all():
        cost = activity.get_cost()
        if cost:
            costs.append(cost)
    if len(costs):
        return sum(costs)
    else:
        return False

Ответы [ 3 ]

3 голосов
/ 13 марта 2009

Я заметил, что вы возвращаете False, если все затраты были None; Я не знаю, есть ли конкретная причина для этого, но это немного усложняет написание. Если это не требование, вы можете написать это так:

def get_jobrecord_cost(self):
    costs = [activity.get_cost() or 0 for activity in self.activity_set.all()]
    return sum(costs)
2 голосов
/ 13 марта 2009

Я думаю, вы можете упростить это с помощью:

def get_jobrecord_cost(self):
    costs = 0
    for activity in self.activity_set.all():
        cost = activity.get_cost()
        if cost:
            costs += cost

    return costs
1 голос
/ 13 марта 2009
def get_jobrecord_cost(self):
    return sum((activity.get_cost() or 0 for activity in activity_set.all()) or 0)

В зависимости от того, с каким количеством данных вы имеете дело, эта версия чуть более эффективна, чем DNS, потому что она использует понимание генератора и не требует загрузки всего списка в память. Это функционально эквивалентно скорби, за исключением того, что зацикливание происходит в C. Обратите внимание, что это не обязательно означает, что это лучше . Этот подход, очевидно, более плотный и менее читабельный.

...