Множественные правки словаря в цикле while - PullRequest
2 голосов
/ 05 августа 2020

Я работаю над проектом программирования, где мне нужно создать FAQ, который позволяет пользователю добавлять новые записи, а также удалять существующие записи. Пока все функции работают правильно, но у меня возникла проблема. После того, как пользователь выберет добавление новой записи, запись будет успешно добавлена. Однако, если они выбирают вариант добавления еще одной записи, программа просто зацикливается, как если бы она больше не вызывала функцию. Я прочитал свои учебники и поискал в Интернете, но не нашел решения. У меня также есть проблема с получением исключения для печати моего заявления, но это не критический фактор. Я не ищу прямого ответа, который можно просто скопировать в код, просто пример для go. Любая помощь приветствуется. Код ниже:

import pyinputplus as pyip

# Defines variables used in program
done = False #loop for input on menu
userQuestion = ''
userAnswer = ''

# Creates the menu for user interacion
menu = '''
===========================
Frequently Asked Quesstions
===========================

1: Exit
2: List FAQ's
3: Add FAQ
4: Delete FAQ
'''
###############################################

# Creates dictionary and sets default values for FAQ for functionality
faq = {
'North Korea': 'Is afraid of clowns',
'Climate change': 'It is a lie.',
'America': 'Is burning.'
}
###############################################

# Function that prints a list of the current FAQs
def display_Faq():
    print('\nFrequently Asked Questions\n==========================')
    for question in faq:
        print('Question: ', question, '\nAnswer: ', faq[question], '\n')
    print() 
###############################################
    
# Function that adds to the FAQ based on user input
def Add_Faq():
    global userQuestion
    global userAnswer
    while userQuestion not in faq:
        try:
            userQuestion = input('\nPlease enter a question for the FAQs: ')
            userAnswer = input('\nPlease enter the answer: ')
            faq[userQuestion] = userAnswer
            print('\nEntry has been added to the FAQs.')
            break
        except:
            print(str(userQuestion) + ' already exists in FAQs, please rephrase.\n')
###############################################

# Function that checks user input against FAQ and deletes entries
def Del_Faq():
    global userQuestion
    userQuestion = input('\nEnter an entry to delete: ')
    if userQuestion in faq:
        del faq[userQuestion]
        print(str(userQuestion) + ' has been deleted from the FAQs')
    else:
        print(str(userQustion) + ' not exist in the FAQs, no changes have been made.')
###############################################
    
# Actual program that runs based off user input
while not done:
    print(menu)
    try:
        selection = pyip.inputInt(prompt = '\nPlease enter menu item 1-4: ', min=1, max=4)
        if selection == 1:
            done = True
        elif selection == 2:
            display_Faq()
        elif selection == 3:
            Add_Faq()
        elif selection == 4:
            Del_Faq()
    except pyip.PyInputPlusException:
        print('Please check your input and try again')
        continue

Ответы [ 3 ]

1 голос
/ 05 августа 2020

Проблема в том, что userQuestion не сбрасывается на пустую строку, поэтому userQuestion not in faq будет ложным после первого вызова Add_faq (), поэтому программа никогда не войдет в while l oop после первой итерации.

0 голосов
/ 06 августа 2020

Я чувствую себя глупо, но я обнаружил свою ошибку примерно через 20 минут после публикации. Я ценю ответ Вигги. Я просто немного выгорел после чтения и кодирования в течение 3+ часов, все просто слилось воедино, и я расстраивался, лол.

0 голосов
/ 05 августа 2020

Это действительно хороший проект! Вы правильно определили модуль, вызывающий проблему, и это хорошо. В add_faq () вы устанавливаете неправильные переменные как глобальные, здесь это исправлено:

import pyinputplus as pyip

# Defines variables used in program
done = False #loop for input on menu
userQuestion = ''
userAnswer = ''

# Creates the menu for user interacion
menu = '''
===========================
Frequently Asked Quesstions
===========================

1: Exit
2: List FAQ's
3: Add FAQ
4: Delete FAQ
'''
###############################################

# Creates dictionary and sets default values for FAQ for functionality
faq = {
'North Korea': 'Is afraid of clowns',
'Climate change': 'It is a lie.',
'America': 'Is burning.'
}
###############################################

# Function that prints a list of the current FAQs
def display_Faq():
    print('\nFrequently Asked Questions\n==========================')
    for question in faq:
        print('Question: ', question, '\nAnswer: ', faq[question], '\n')
    print() 
###############################################
    
# Function that adds to the FAQ based on user input
def Add_Faq():
    global faq
    while True:
        userQuestion = input('\nPlease enter a question for the FAQs: ')
        userAnswer = input('\nPlease enter the answer: ')
        if userQuestion not in faq:
            faq[userQuestion] = userAnswer
            print('\nEntry has been added to the FAQs.')
            break
        else:
            print(str(userQuestion) + ' already exists in FAQs, please rephrase.\n')
###############################################

# Function that checks user input against FAQ and deletes entries
def Del_Faq():
    global faq
    userQuestion = input('\nEnter an entry to delete: ')
    if userQuestion in faq:
        del faq[userQuestion]
        print(str(userQuestion) + ' has been deleted from the FAQs')
    else:
        print(str(userQustion) + ' not exist in the FAQs, no changes have been made.')
###############################################
    
# Actual program that runs based off user input
while not done:
    print(menu)
    try:
        selection = pyip.inputInt(prompt = '\nPlease enter menu item 1-4: ', min=1, max=4)
        if selection == 1:
            done = True
        elif selection == 2:
            display_Faq()
        elif selection == 3:
            Add_Faq()
        elif selection == 4:
            Del_Faq()
    except pyip.PyInputPlusException:
        print('Please check your input and try again')
        continue
...