Django, Python laço Logic Problem

votos
1

Isso funciona, parcialmente. Mais informações podem ser necessários, no entanto, eu pensei que eu ia postar para obter aconselhamento sobre qualquer coisa óbvia que pode estar errado aqui.

O problema é que, se activity.get_cost () retorna um Falsevalor, a função parece sair totalmente, retornando None.

O que eu gostaria que ele faça, é claro, é acumular costvalores decimais no costs = []e retornar a sua soma. Simples, eu teria pensado ... mas minhas habilidades novato em Python são aparentemente faltando alguma coisa.

Mais informações fornecidas a pedido. Obrigado.

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
Publicado 13/03/2009 em 02:21
fonte usuário
Em outras línguas...                            


3 respostas

votos
3

Estou vendo que você está retornando False se todos os custos foram Nenhuma; Eu não sei se há uma razão específica para isso, mas faz com que seja um pouco mais difícil de escrever. Se isso não é um requisito, você poderia escrevê-lo como este:

def get_jobrecord_cost(self):
    costs = [activity.get_cost() or 0 for activity in self.activity_set.all()]
    return sum(costs)
Respondeu 13/03/2009 em 02:39
fonte usuário

votos
2

Eu acho que você pode simplificar isso com:

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

    return costs
Respondeu 13/03/2009 em 02:26
fonte usuário

votos
1

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

Dependendo da quantidade de dados que você está lidando, esta versão é apenas um pouco mais eficiente do que de DNS do porque ele usa uma compreensão gerador e não requer o carregamento de uma lista inteira na memória. É funcionalmente equivalente a chorar de exceto o looping acontece em C. Note que isso não significa necessariamente que este é melhor . Esta abordagem é, obviamente, mais denso e pode ser menos legível.

Respondeu 13/03/2009 em 02:43
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more