'UnboundLocalError while accessing option 2 in a choice menu

I have been trying different code combinations for three days now and I figured before i throw in the towel this might be a good place to ask my question. In my code, no matter how I try to declare the lists I've been unsuccessful. My problem currently is:

line 54, in main
inputExpenseAmounts(expenseItems)
UnboundLocalError: local variable 'expenseItems' referenced before assignment
import matplotlib.pyplot as plt
from prettytable import PrettyTable

def menu():
    print('[1] Enter Expense Name')    
    print('[2] Enter Expense Amount')    
    print('[3] Display Expense Report')    
    print('[4] Quit')    
    choice = input('Enter choice: ')    
    return choice

def inputExpenseNames():
    expenseItems = []    
    name = input("Enter expense name (q for quit) \n")    
    while name != "q" :    
        expenseItems.append(name)    
        name = input("Enter expense name (q for quit) \n")    
    return expenseItems

def inputExpenseAmounts(expenseItems):
    expenseAmounts = []    
    print("Enter the amount for each expense ")    
    for i in expenseItems:    
        amount = int(input(i + " : "))    
        expenseAmounts.append(amount)    
    return ExpenseAmounts

def displayExpenseReport(expenseItems, expenseAmounts):
    displayExpenseReport = []    
    option = input("Display in \n (a) table \n (b) bar chart \n (c) pie chart \n")    
    if option == "c":    
        plt.pie(expenseAmounts, labels = expenseItems)    
        plt.show()    
    elif option == "b":    
        plt.bar(expenseItems, expenseAmounts)    
        plt.show()    
    elif option == "a":    
        t = PrettyTable()    
        t.add_column("expenseItems",expenseItems)    
        t.add_column("expenseAmounts",expenseAmounts)    
        print(t)    
    else:    
        print("Invalid option - allowed only (a / b / c")

def main():
    while True:    
        choice = menu()    
        if choice == '1':    
            inputExpenseNames()    
        elif choice == '2':    
            inputExpenseAmounts(expenseItems)    
        elif choice == '3':    
            displayExpenseReport(expenseItems, expenseAmounts)    
        elif choice == '4':    
            break    
        else:    
            print('Invalid selection. Please re-enter.')    
    expenseItems = inputExpenseNames()

main()


Solution 1:[1]

The error is telling you that you used a variable (expenseItems) that hadn't been defined yet.

What you probably want to do is initialize those variables to empty lists, and then store the results of calling your earlier menu functions so you can pass them to the later functions.

def main():
    expenseItems = []
    expenseAmounts = []
    while True:
        choice = menu()
        if choice == '1':
            expenseItems = inputExpenseNames()
        elif choice == '2':
            expenseAmounts = inputExpenseAmounts(expenseItems)
        elif choice == '3':
            displayExpenseReport(expenseItems, expenseAmounts)
        elif choice == '4':
            break
        else:
            print('Invalid selection. Please re-enter.')

I'll note that you may want to rethink the idea of having a menu here, since the user always must go through the items in the exact order they're listed. It would be simpler to just automatically go through the three steps in order.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1