2
respostas

Erro na opção

Eu fiz o meu código aplicando algumas novas funções, como por exemplo a verificação de existência do restaurante antes de cadastrar, mas eu estou com um erro de lógica, pois quando tento mudar o status de ativação do restaurante para ativado ou desativado na função, ele muda, mas printa uma mensagem de outra def e eu não estou entendendo quando essa outra def está sendo chamada.

Segue o meu código:

2 respostas
import os

lista_de_restaurantes = [{'nome': 'Pizzaria', 'categoria': 'Massas', 'status': False}, {'nome': 'Churrascaria', 'categoria':'Carnes', 'status': False}]

def exibe_titulo(titulo):
    os.system('cls')
    print(f'{titulo}\n')

def exibe_opcoes():
    print('1. Cadastrar restaurante', '2. Listar restaurantes', '3. Ativar/Desativar restaurante', '4. Finalizar aplicativo', sep = '\n')

def opcao_invalida():
    print('\nEsta opção é inválida')

def voltar_ao_menu_principal():
    input('\nDigite uma tecla para voltar ao menu princpal')
    main()

def cadastra_restaurante():
    nome_do_restaurante = input('Insira o nome do restaurante: ')
    if not verifica_se_existe(nome_do_restaurante):
        categoria_do_restaurante = input(f'Insira a categória do restaurante {nome_do_restaurante}: ')
        novo_restaurante = {'nome':nome_do_restaurante, 'categoria':categoria_do_restaurante, 'status': False}
        lista_de_restaurantes.append(novo_restaurante)
        print(f'\nO restaurante: {nome_do_restaurante}, da categória: {categoria_do_restaurante} foi cadastrado com sucesso.')
    else:
        print(f'\nO restaurante {nome_do_restaurante} já está cadastrado em nossa base de dados.')

def listar_restaurante():
    for restaurante in lista_de_restaurantes:
        print(f'{restaurante['nome']} | {restaurante['categoria']} | {exibe_status_formatado(restaurante)}')

def exibe_status_formatado(restaurante):
    return 'ativado' if restaurante['status'] == True else 'desativado'

def verifica_se_existe(nome_de_restaurante):
    for restaurante in lista_de_restaurantes:
        if nome_de_restaurante == restaurante['nome']:
            return True
    return False

def alternar_estado_do_restaurante():
    nome_do_restaurante = input('Digite o nome do restaurante para alterar o seu estado: ')
    if verifica_se_existe(nome_do_restaurante):
        for restaurante in lista_de_restaurantes:
            if restaurante['nome'] == nome_do_restaurante:
                restaurante['status'] = not restaurante['status']
                print(f'\nO restaurante {restaurante['nome']} foi {exibe_status_formatado(restaurante['status'])} com sucesso')
                return
    else:
        print(f'\nO restaurante {nome_do_restaurante} não existe em nossa base de dados')

def escolhe_opcao():
    try:
        numero = int(input('\nSelecione uma opção: '))
        match numero:
            case 1:
                exibe_titulo('Cadastrar restaurante')
                cadastra_restaurante()
                voltar_ao_menu_principal()
            case 2:
                exibe_titulo('Lista de restaurantes cadastrados')
                listar_restaurante()
                voltar_ao_menu_principal()
            case 3:
                exibe_titulo('Alternar estado do restaurante')
                alternar_estado_do_restaurante()
            case 4:
                exibe_titulo('Finalizando aplicativo')
            case _:
                opcao_invalida()
                voltar_ao_menu_principal()
    except:
        opcao_invalida()
        voltar_ao_menu_principal()

def main():
    exibe_titulo('Sabor Express')
    exibe_opcoes()
    escolhe_opcao()

if __name__ == '__main__':
    main()

Olá, João Victor. Tudo bem?

O problema está na função voltar_ao_menu_principal. Nela, você chama a função main diretamente, o que faz com que o menu seja exibido novamente, mas sem encerrar corretamente a execução da função atual. Isso pode causar comportamento inesperado, como mensagens de outra função sendo exibidas.

Para corrigir isso, remova a chamada direta ao main em voltar_ao_menu_principal e ajuste a lógica para controlar melhor o fluxo do programa. Veja como ajustar:


def voltar_ao_menu_principal():
    input('\nDigite uma tecla para voltar ao menu principal')
    # Remova a chamada para main aqui

Em seguida, altere o fluxo dentro da função escolhe_opcao para garantir que o menu principal seja chamado corretamente, sem redundâncias. Atualize a função assim:


def escolhe_opcao():
    while True:  # Adiciona um loop para manter o programa ativo
        try:
            numero = int(input('\nSelecione uma opção: '))
            match numero:
                case 1:
                    exibe_titulo('Cadastrar restaurante')
                    cadastra_restaurante()
                case 2:
                    exibe_titulo('Lista de restaurantes cadastrados')
                    listar_restaurante()
                case 3:
                    exibe_titulo('Alternar estado do restaurante')
                    alternar_estado_do_restaurante()
                case 4:
                    exibe_titulo('Finalizando aplicativo')
                    break  # Sai do loop e finaliza o programa
                case _:
                    opcao_invalida()
            voltar_ao_menu_principal()  # Chame após executar qualquer opção
        except:
            opcao_invalida()
            voltar_ao_menu_principal()

Com essas alterações:

  1. voltar_ao_menu_principal agora apenas pausa para o usuário ler as mensagens, sem reiniciar o fluxo.
  2. O loop em escolhe_opcao mantém o programa funcionando até que a opção "Finalizar" seja escolhida.

Fico à disposição. Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!