Como melhorar esse código

To achando esse código uma gambiarra,muito feio, tem outra maneira de fazer que seja mais elegante?

    produtos = {}

       def addProduto(self,produto):
        if (produto.nome != None and produto.valor > 0 and produto.quantidade >= 0):    #Verifica os campos
            achou = False
            for x in self.produtos.items():    #Percorre o dict em busca do nome do produto
                busca = str(x[1])      #transforma os valores em string
                if busca.split()[1].__eq__(produto.nome):   #verifica se já existe o nome do produto no dict
                    achou = True
                    break
            if not achou:
                self.produtos.__setitem__(produto.id,produto.toString())
                return f'Produto {produto.nome} adicionado'
            return 'Produto já existe'
        return 'Produto com informações invalidas'

da pra remover a variável achou e melhorar a semântica dos nomes, acho que isso já deixa mais legível

def addProduto(self,novoProduto):
    if (verificaCamposProduto):
        produtosCadastrados = self.produtos.items()
        for produtoExistente in produtosCadastrados:
            busca = str(produtoExistente[1])      #transforma os valores em string
            if busca.split()[1].__eq__(novoProduto.nome):   #verifica se já existe o nome do produto no dict
               return 'Produto já existe'

        #em caso do produto não existir
        self.produtos.__setitem__(novoProduto.id,novoProduto.toString())
        return f'Produto {novoProduto.nome} adicionado'

    #Em caso de o produto estar com informações incompletas
    return 'Produto com informações invalidas'

def verificaCamposProduto(produto):
       if (produto.nome != None and produto.valor > 0 and produto.quantidade > 0):
          return True;
      return False;
2 curtidas

Cara, você está usando dicionário, na minha opinião nem precisa de um for para ver se o produto existe já que a chave é o id…

def addProduto(self, novoProduto):
    if (not produtoOK(novoProduto)):
        return 'Produto com informações invalidas'

    if novoProduto.id in self.produtos: # ou if self.produtos[novoProduto.id]:
        return 'Produto já existe'

    #em caso do produto não existir (outra forma de criar uma nova chave!)
    self.produtos[novoProduto.id] = novoProduto.toString()
    return f'Produto {novoProduto.nome} adicionado'

A segunda função nem precisa de dois returns…

def produtoOK(produto):
    return (produto.nome != None and 
        produto.valor > 0 and produto.quantidade > 0)

@leonardodias914 mudei o nome da função apenas para melhorar um pouco a leitura do not lá em cima ok? Fica bravo não beleza? :joy:

1 curtida