1
resposta

[Dúvida] problema com opção invalida

# fiz tudo certo a media do possivel e esta dando erro de opçao invalida, mudei apenas os nomes das variaveis como na aula esta restaurante e eu coloquei nome_restaurantes


import os

nome_restaurantes = [{'nome': 'ifood', 'categoria': 'Fast Food', 'ativo': False},
                     {'nome': 'food99', 'categoria': 'delivery', 'ativo': True},
                     {'nome': 'Uber Eats', 'categoria': 'Fast Food', 'ativo': False}]

def exibir_nome_do_programa():
    print("""
██████╗░███████╗██╗░░░░░██╗██╗░░░██╗███████╗██████╗░██╗░░░██╗░█████╗░░█████╗░
██╔══██╗██╔════╝██║░░░░░██║██║░░░██║██╔════╝██╔══██╗╚██╗░██╔╝██╔══██╗██╔══██╗
██║░░██║█████╗░░██║░░░░░██║╚██╗░██╔╝█████╗░░██████╔╝░╚████╔╝░██║░░╚═╝██║░░██║
██║░░██║██╔══╝░░██║░░░░░██║░╚████╔╝░██╔══╝░░██╔══██╗░░╚██╔╝░░██║░░██╗██║░░██║
██████╔╝███████╗███████╗██║░░╚██╔╝░░███████╗██║░░██║░░░██║░░░╚█████╔╝╚█████╔╝
╚═════╝░╚══════╝╚══════╝╚═╝░░░╚═╝░░░╚══════╝╚═╝░░╚═╝░░░╚═╝░░░░╚════╝░░╚════╝░
 
""")

def exibir_opcoes():
    print('1. Cadastrar restaurante')
    print('2. Listar restaurantes')
    print('3. Ativar restaurante')
    print('4. Sair\n')

def finalizar_app():
    exibir_subtitulo('Encerrando o programa')

def opcao_invalida():
    os.system('cls') 
    print('Opção inválida\n')
    voltar_menu_principal ()

def exibir_subtitulo(texto):
    os.system('cls')
    print(texto)
    print()

def voltar_menu_principal ():
    input('Pressione Enter para voltar ao menu')
    main()

def cadastrar_novo_restaurante ():
    exibir_subtitulo('\nCadastrar novo restaurante')
    nome_restaurante = input('Digite o nome do restaurante: ')
    categoria = input(f'Digite a categoria do restaurante {nome_restaurante}: ')
    dados_restaurante = {'nome': nome_restaurante, 'categoria': categoria, 'ativo': False}
    nome_restaurantes.append(dados_restaurante)
    print(f'Restaurante {nome_restaurante} cadastrado com sucesso!\n')
    voltar_menu_principal ()

def Listar_restaurantes():
    exibir_subtitulo('Listando de restaurantes')

    for restaurante in nome_restaurantes:
        nome = restaurante['nome']
        categorias = restaurante['categoria']
        ativo = restaurante['ativo']
        print(f" - {nome} | {categorias} | {ativo} \n")

    voltar_menu_principal ()

def ativar_restaurante():

    exibir_subtitulo('Ativar restaurante')
    nome_restaurante = input('Digite o nome do restaurante que deseja ativar: ')
    restaurante_encontrado = False

    for nome_restauranteS in nome_restaurante:
        if nome_restaurante == nome_restaurantes['nome']:
            restaurante_encontrado == True
            nome_restaurantes['ativo'] = not nome_restaurantes['ativo']
            mensagem = f'O restaurante {nome_restaurante} foi ativado com sucesso' if nome_restaurantes['ativo'] else f'O restaurante {nome_restaurante} foi desativado com sucesso'
            print(mensagem)
    if not restaurante_encontrado:
        print(f'Restaurante {nome_restaurante} não encontrado.\n')

    voltar_menu_principal()

def escolher_opcao():
    try:
        opcao_escolhida = int(input('Escolha uma opção: '))

        if opcao_escolhida == 1: 
            cadastrar_novo_restaurante()
        elif opcao_escolhida == 2: 
            Listar_restaurantes()
        elif opcao_escolhida == 3: 
            ativar_restaurante()
        else: 
            finalizar_app()
    except:
        opcao_invalida()

def main():
    os.system('cls')
    exibir_nome_do_programa()
    exibir_opcoes()
    escolher_opcao()

if __name__ == '__main__':
    main()
1 resposta

Olá, Vinicius, como vai?

O comportamento de “opção inválida” não está diretamente ligado à mudança do nome da variável para nome_restaurantes, mas sim à lógica dentro da função ativar_restaurante. Existem alguns pontos ali que impedem o funcionamento correto e podem acabar quebrando o fluxo do programa.

O principal problema está neste trecho:

for nome_restauranteS in nome_restaurante:

Aqui você está fazendo um for sobre a variável nome_restaurante, que é uma string digitada pelo usuário. Quando você faz um for em uma string, o Python percorre letra por letra. Por exemplo, se o usuário digitar "ifood", o laço vai percorrer "i", depois "f", depois "o" e assim por diante. O que você realmente precisa é percorrer a lista nome_restaurantes, que é onde estão os dicionários com os dados dos restaurantes.

Outro ponto é esta comparação:

if nome_restaurante == nome_restaurantes['nome']:

nome_restaurantes é uma lista, e listas não podem ser acessadas com chave como se fossem dicionários. Quem tem a chave 'nome' é cada item dentro da lista. Por isso, você precisa iterar assim:

for restaurante in nome_restaurantes:
    if nome_restaurante == restaurante['nome']:

Além disso, você escreveu:

restaurante_encontrado == True

Aqui você usou operador de comparação (==) em vez de atribuição (=). Dessa forma, o valor não alterado. O correto é:

restaurante_encontrado = True

E também a inversão do ativo deve ser feita no restaurante específico dentro do loop:

restaurante['ativo'] = not restaurante['ativo']

Juntando tudo, sua função ativar_restaurante deveria ficar assim, mantendo o nome nome_restaurantes como você escolheu:

def ativar_restaurante():
    exibir_subtitulo('Ativar restaurante')
    nome_restaurante = input('Digite o nome do restaurante que deseja ativar: ')
    restaurante_encontrado = False

    for restaurante in nome_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 encontrado.\n')

    voltar_menu_principal()

Com essa estrutura, você percorre corretamente a lista de dicionários, compara o nome digitado com a chave 'nome' de cada restaurante e alterna o valor booleano de 'ativo'.

Se continuar apresentando comportamento inesperado, compartilhe o novo erro que analisamos juntos. O fórum está à disposição para te ajudar.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!