2009-12-16 5 views
0

Je vais créer des statistiques basées sur les informations que les builds ont été réussies ou pas et combien par projet.Organiser le code python pour gérer les informations statistiques

Je crée une classe ProjectStat par nouveau projet que je vois et à l'intérieur des statistiques traitées. Pour imprimer une statistique globale, je dois passer par toutes les instances de ProjectStat. Pour imprimer les statistiques de réussite par projet, je dois les passer à nouveau et ainsi de suite, sur n'importe quel type de statistiques. Ma question est de simplifier la gestion des cycles, c'est-à-dire de ne pas passer le dictionnaire à chaque fois. Peut-être que l'utilisation de décorateurs ou de motifs décoratifs serait une façon pythonique? Comment alors ils peuvent être utilisés si le nombre d'instances de ProjectStat est dynamiquement changé?

Voici le code:

class ProjectStat(object): 
projectSuccess = 0 
projectFailed = 0 
projectTotal = 0 

def addRecord(self, record): 
    if len(record) == 5: record.append(None) 
    try: 
     (datetime, projectName, branchName, number, status, componentName) = record 
    except ValueError: 
     pass 
    self.projectTotal += 1 
    if status == 'true': self.projectSuccess += 1 
    else: self.projectFailed += 1 
def addDecorator(self, decorator): 
    decorator = decorator 


def readBuildHistoryFile(): 
dict = {} 
f = open("filename") 
print("reading the file") 
try: 
    for line in f.readlines(): 
     #print(line) 
     items = line.split() 
     projectName = items[1] 
     projectStat = dict[projectName] = dict.get(projectName, ProjectStat()) 
     projectStat.addRecord(items) 
     print(items[1]) 
finally: 
    f.close() 

success = 0 
failed = 0 
total = 0 

for k in dict.keys(): 
    projectStat = dict[k] 
    success += projectStat.projectSuccess 
    failed += projectStat.projectFailed 
    total += projectStat.projectTotal 

print("Total: " + str(total)) 
print("Success: " + str(success)) 
print("Failed: " + str(failed)) 

if __name__ == '__main__': 
readBuildHistoryFile() 
+1

Pouvez-vous corriger l'indentation? –

+0

Avec quoi? C'est mon premier post et je n'ai fait que copier ce que j'ai fait car il était autorisé par l'interface. Comment puis-je spécifier les onglets sous forme d'onglets dans le code sur la page? – yart

Répondre

1

Je ne suis pas sûr que je comprends le Q, mais je vais essayer de répondre de toute façon :)

option1:

total = sum([project.projectTotal for project in dict.values()]) 
success = sum([project.projectSuccess for project in dict.values()]) 
failed = sum([project.projectFailed for project in dict.values()]) 

option2 :

(total,success,failed) = reduce (lambda x,y:(x[0]+y[0],x[1]+y[1],x[2]+y[2]), [(project.projectTotal,project.projectSuccess,project.projectFailed) for project in dict.values()]) 
+0

Merci Ofri. Bonne technique pour obtenir des informations. Maintenant, si je veux obtenir des statistiques par projet, je vais ajouter une méthode d'impression à ProjectStat et l'appeler en utilisant vos conseils. La seule préoccupation est de savoir si je dois passer par le dictionnaire? Pour obtenir le total global, le succès, l'échec et la statistique par projet après que j'ajouterai la méthode d'impression, j'ai besoin de 4 fois spécifier pour le cycle pour le dictionnaire et s'il y aura beaucoup d'enregistrements alors il pourrait consommer. Qu'est-ce que tu penses? – yart

+0

Je ne pense pas que ça va être une opération lente. Essayez-le d'abord, et seulement si vous rencontrez des problèmes de performance, essayez d'optimiser. –

Questions connexes