简体   繁体   中英

Python Validation Checks do not correctly work

I have some validation checks for my menu which seem to be repeating the error message and I have spent so long staring at this error I seem to have gone blank!

I am running a file called student_class (not a class but just the file name) and as any menu validation if the user enters the incorrect choice I want it to display the error message and then re-display the menu etc etc.

The validation code is:

def ValidateMenuChoice(choice):
  validchoice = False
  Num = [1,2,3,4,5,6]
  while validchoice == False :
    if choice not in Num:
      print("Invalid choice, please try again.")
      display = menu.Menu("Student")
      display.printMenu()
      GetMenuChoice()
      ValidateMenuChoice(choice)
    else:
      validchoice = True
  return choice

Is there a simple mistake I am making or could it be more complex? Any help would be greatly appreciated.

GetMenuChoice function:

def GetMenuChoice(): #Gets users menu choice
  MenuChoice = int(input())
  print()
  return MenuChoice

ANSWER EDIT:

Using a few answers below (thanks!) I had to just add main(choice) into my code as seen below:

def ValidateMenuChoice(choice=None):
  Num = [1,2,3,4,5,6]
  while True:
    if choice not in Num:
      print("Invalid choice, please try again.")
      display = menu.Menu("Student")
      display.printMenu()
      choice = GetMenuChoice()
      main(choice) #Added to make it work
    else:
      return choice

Thanks for the help :)

I think you need to make a simple tweak:

choice = GetMenuChoice()

At the moment, you never update choice , so it recurses indefinitely.

More broadly, I would probably take an iterative approach, and avoid using a flag ( validchoice ):

def GetValidMenuChoice():
    display = menu.Menu("Student")
    while True:
        display.printMenu()
        choice = GetMenuChoice()
        if choice in range(1, 7):
            return choice
        else:
            "Invalid choice, please try again."

Ideally, I would remove the hard-coded range(1, 7) and make that dependent on the Menu , but I can't tell from what you've posted whether that would be possible.

You are attempting both an iterative and a recursive approach, but you are not tracking your choice and validchoice variables properly.

For a proper recursive approach, get rid of your while and add a return :

def ValidateMenuChoice(choice):
  Num = [1,2,3,4,5,6]
  if choice not in Num:
      print("Invalid choice, please try again.")
      display = menu.Menu("Student")
      display.printMenu()
      choice = GetMenuChoice()
      return ValidateMenuChoice(choice)
  return choice

An iterative approach would look like this:

def ValidateMenuChoice(choice=None):
  Num = [1,2,3,4,5,6]
  while True:
    if choice not in Num:
      print("Invalid choice, please try again.")
      display = menu.Menu("Student")
      display.printMenu()
      choice = GetMenuChoice()
    else:
      return choice

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM