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 - [email protected]
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
_______________________________________________
Tutor maillist - [email protected]
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor