[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