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:
- 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. - 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!