[Tutor] Most pythonic input validation

Christian Witts cwitts at compuscan.co.za
Fri Oct 16 14:15:53 CEST 2009


Robert Johansson wrote:
>> 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.
>   
 >>> 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 

`if prompt in range(start, stop)` would require building the list every single time you try to make a choice rendering it slower than `if start <= choice <= stop`, although on a small choice set the speed difference would hardly be noticeable.

-- 
Kind Regards,
Christian Witts




More information about the Tutor mailing list