[Tutor] Most pythonic input validation

Robert Johansson robert.johansson at math.umu.se
Fri Oct 16 13:25:08 CEST 2009


> Hi,
> I'm writing a text based menu and want to validate the user input. I'm
> giving the options as integers, and I want to make sure the user enters a
> proper value.
> Here's what I've got so far: http://pastebin.com/m1fdd5863
> I'm most interested in this segment:
>     while True:
>         choice = raw_input(prompt)
>         if valid_choice(choice, 0, len(options)-1):
>             break
>     return choice
> Is that the most pythonic way of validating? Is there a better way?
> As an aside, in the valid_choice function I know I could do:
> if not choice in range(min, max)
> but I figured a comparison would probably be the better choice, correct?
> Thanks,
> Wayne
> --
> To be considered stupid and to be told so is more painful than being
called
> gluttonous, mendacious, violent, lascivious, lazy, cowardly: every
weakness,
> every vice, has found its defenders, its rhetoric, its ennoblement and
> exaltation, but stupidity hasn’t. - Primo Levi
>
> _______________________________________________
> Tutor maillist  -  Tutor at python.org
> To unsubscribe or change subscription options:
> http://mail.python.org/mailman/listinfo/tutor
>
>

The most pythonic way would be to use a try except block:

    while True:
        choice = raw_input(prompt)
        try:
            options[int(choice)]
        except (KeyError, IndexError, TypeError):
            print "Invalid input, try again."
            continue
        return choice


Also, did you want to convert choice to an int at some point?  You
appear to be comparing it to a number in valid_choice(), but it will
be passed out of the method as a str.

Hence I've added a conversion to int, and I'm catching KeyError (for
dicts), IndexError (for lists), and TypeError, for when int(choice)
fails.

This is a principle called "It's Easier to Ask Forgiveness than
Permission" (EAFP), which is one of the pythonic principles.


Hope that helps.
-- 
Rich "Roadie Rich" Lovely


What if a valid user input has to be an integer between 10 and 20? I mean,
it could be that you are doing something that only makes sense for that
input. Would it be pythonic to add a test like:

If prompt in range(10,21):
  ...
else:
  ... raise an error

If I understand the error handling correctly you can add your own user
defined error, but is that really what you should do in that case?

/Robert 



More information about the Tutor mailing list