2009-03-13 15 views
1

Dies funktioniert teilweise. Weitere Informationen sind möglicherweise erforderlich, aber ich dachte, ich würde posten, um Rat zu bekommen, was offensichtlich falsch ist.Django, Python Loop Logic Problem

Das Problem ist, dass, wenn activity.get_cost() einen Wert False zurückgibt, die Funktion vollständig beendet wird und None zurückgibt.

Was ich möchte es natürlich tun, ist akkumulieren cost Dezimalwerte in costs = [] und geben ihre Summe zurück. Einfach hätte ich gedacht ... aber meinen Novizen Python fehlt offenbar etwas.

Weitere Informationen auf Anfrage. Vielen Dank.

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 

Antwort

1
def get_jobrecord_cost(self): 
    return sum((activity.get_cost() or 0 for activity in activity_set.all()) or 0) 

Je nachdem, wie viele Daten Sie mit zu tun haben, diese Version ist nur ein bisschen effizienter als DNS ist, weil es einen Generator Verständnis verwendet und erfordert nicht das Laden einer ganzen Liste in den Speicher. Es ist funktional gleichbedeutend mit Trauer, außer dass die Schleife in C passiert. Beachten Sie, dass dies nicht notwendigerweise bedeutet, dass besser ist. Dieser Ansatz ist offensichtlich dichter und kann weniger lesbar sein.

2

Ich glaube, Sie dies mit vereinfachen kann:

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

    return costs 
3

Ich merke, Sie falsch sind Rückkehr, wenn alle Kosten Keine waren; Ich weiß nicht, ob es einen bestimmten Grund dafür gibt, aber es macht es ein bisschen schwieriger zu schreiben. Wenn das keine Voraussetzung ist, könnte man es so schreiben:

def get_jobrecord_cost(self): 
    costs = [activity.get_cost() or 0 for activity in self.activity_set.all()] 
    return sum(costs)