Message: 3
Date: Thu, 15 Oct 2009 16:50:57 +0100
From: Rich Lovely <[email protected]>
To: Wayne Werner <[email protected]>
Cc: "[email protected]" <[email protected]>
Subject: Re: [Tutor] Most pythonic input validation
Message-ID:
<[email protected]>
Content-Type: text/plain; charset=windows-1252

2009/10/15 Wayne Werner <[email protected]>:
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.
--
Rich "Roadie Rich" Lovely

As I am a new programmer I am specifically trying to pay attention to when you guys discuss making thing more python like.

I am a bit confused though on a couple things in this code. Probably since I have not dealt with it as of yet.

The first is the while statement. I have made a successful menu selection but my while statement is:
   while prompt != 0:
0 of course meaning exit.  Does "while True:" mean the same?

Second is the input statement. Could you not just put choice = int(raw_input(prompt)) instead of using two different statements? Or is it that my example will return as string?

The third is the "try" statement. How is this different from the "for" loop or "if" loop?

The fourth is except (KeyError, IndexError, TypeError): why do you check for three different types of errors?

Thanks in advance,

Katt


_______________________________________________
Tutor maillist  -  [email protected]
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to