1
resposta

alterar 1 restaurante altera vários

Fica aparecendo a alteração duas ou três vezes, e quando isso acontece pelo menos um outro restaurante tem a ativação trocada

Alterando Estado do Restaurante

Digite o nome do restaurante para alterar seu estado: Tentação
O restaurante Tentação foi desativado com sucesso!
O restaurante Tentação foi ativado com sucesso!

Digite uma tecla para voltar ao menu principal

acima o que aparece no console

abaixo o código

def alternar_estado_restaurante():
exibir_subtitulo('Alterando Estado do Restaurante')
nome_restaurante = input('Digite o nome do restaurante para alterar seu estado: ')
restaurante_encontrado = False
for restaurante in restaurantes:
if nome_restaurante == restaurante['nome']:
restaurante_encontrado = True
restaurante['ativo'] = not restaurante['ativo']
mensagem = f'O restaurante {nome_restaurante} foi ativado com sucesso!' if restaurante['ativo'] else f'O restaurante {nome_restaurante} foi desativado com sucesso!'
print(mensagem)
if not restaurante_encontrado:
print(f'Restaurante "{nome_restaurante}" não foi encontrado!')
voltar_ao_menu_principal()

Desde já agradeço.

P.S não consigo fazer aparecer o espaçamento.

1 resposta

Olá, Hassan. Como vai?

Esse comportamento de alterar o estado várias vezes e acabar modificando o status de outro restaurante por tabela é um clássico problema de lógica que acontece por conta do **fluxo do laço for** e de como os dados estão cadastrados na sua lista restaurantes.

Vamos entender o que está acontecendo e como resolver isso definitivamente!


Por que isso está acontecendo?

O seu código está executando o bloco de ativação dentro do for para cada restaurante da lista. Isso gera dois problemas dependendo do cenário:

  1. Mensagens Duplicadas: Se você tiver mais de um restaurante com o mesmo nome na lista (ou o mesmo dicionário adicionado repetidamente), o for vai encontrar todos eles. A cada repetição, ele inverte o status (not restaurante['ativo']) e imprime a mensagem na tela. Por isso apareceu desativado e ativado em sequência no seu console.
  2. A alteração afeta outros restaurantes: Se o for continuar rodando depois de já ter encontrado e alterado o restaurante certo, qualquer outra validação ou duplicidade na lista fará com que o estado de elementos vizinhos seja afetado.

Como corrigir o código?

Para resolver isso, precisamos usar o comando break. Assim que o programa encontrar o restaurante correspondente e alterar o status dele, o break interrompe o laço for imediatamente, impedindo que o Python continue procurando ou alterando outros itens.

Além disso, ajustei a indentação (o espaçamento do código) que você mencionou ter dificuldade para aplicar no fórum. No editor do fórum Alura, para o código ficar com o espaçamento correto, basta selecioná-lo e clicar no botão com o ícone de código (</>) ou isolá-lo entre três crases (```).

Veja o código corrigido e estruturado com as boas práticas:

def alternar_estado_restaurante():
    exibir_subtitulo('Alterando Estado do Restaurante')
    nome_restaurante = input('Digite o nome do restaurante para alterar seu estado: ')
    restaurante_encontrado = False
    
    for restaurante in restaurantes:
        if nome_restaurante == restaurante['nome']:
            restaurante_encontrado = True
            # Inverte o estado booleano (Ativo/Inativo)
            restaurante['ativo'] = not restaurante['ativo']
            
            # Define a mensagem com base no novo estado
            mensagem = f'O restaurante {nome_restaurante} foi ativado com sucesso!' if restaurante['ativo'] else f'O restaurante {nome_restaurante} foi desativado com sucesso!'
            print(mensagem)
            
            # DICA DE OURO: Para o loop assim que encontrar o restaurante certo!
            break 
            
    if not restaurante_encontrado:
        print(f'Restaurante "{nome_restaurante}" não foi encontrado!')
        
    voltar_ao_menu_principal()

Dica extra: Verifique seu cadastro

Como no seu console apareceu tanto a mensagem de "desativado" quanto a de "ativado" para o mesmo restaurante, vale a pena dar uma olhada na função onde você cadastra os restaurantes.

Certifique-se de que você não está adicionando o mesmo dicionário de restaurante mais de uma vez na sua lista restaurantes. Se a lista contiver registros duplicados, mesmo com o break, vale a pena limpar a lista na inicialização para o seu sistema ficar 100% correto.

Espero que possa ter lhe ajudado!