2009-03-13 4 views
1

Cela fonctionne partiellement. Plus d'informations peuvent être nécessaires, cependant, j'ai pensé que je posterais pour obtenir des conseils sur quelque chose d'évident qui pourrait être mauvais ici.Django, Python Boucle Logique Problème

Le problème est que si activity.get_cost() renvoie une valeur False, la fonction semble se terminer entièrement, renvoyant None.

Ce que je voudrais faire, bien sûr, est d'accumuler cost valeurs décimales dans le costs = [] et de renvoyer leur somme. Simple, j'aurais pensé ... mais mes compétences Python novices manquent apparemment quelque chose.

Plus d'informations sur demande. Je vous remercie.

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 

Répondre

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

Selon la quantité de données que vous traitez, cette version est un peu plus efficace que celle des DNS car il utilise une compréhension du générateur et ne nécessite pas de charger une liste entière dans la mémoire. Il est fonctionnellement équivalent à grieve sauf que la boucle se produit dans C. Notez que cela ne signifie pas nécessairement que c'est mieux. Cette approche est évidemment plus dense et peut être moins lisible.

2

Je pense que vous pouvez simplifier avec:

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

Je remarque que vous êtes soit faux si tous les coûts étaient Aucun; Je ne sais pas s'il y a une raison précise à cela, mais cela rend les choses un peu plus difficiles à écrire. Si ce n'est pas une exigence, vous pouvez l'écrire comme ceci:

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