<br><br><div class="gmail_quote">On Thu, Oct 15, 2009 at 10:50 AM, Rich Lovely <span dir="ltr">&lt;<a href="mailto:roadierich@googlemail.com">roadierich@googlemail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

2009/10/15 Wayne Werner &lt;<a href="mailto:waynejwerner@gmail.com">waynejwerner@gmail.com</a>&gt;:<br>
<div><div></div><div class="h5">&gt; Hi,<br>
&gt; I&#39;m writing a text based menu and want to validate the user input. I&#39;m<br>
&gt; giving the options as integers, and I want to make sure the user enters a<br>
&gt; proper value.<br>
&gt; Here&#39;s what I&#39;ve got so far: <a href="http://pastebin.com/m1fdd5863" target="_blank">http://pastebin.com/m1fdd5863</a><br>
&gt; I&#39;m most interested in this segment:<br>
&gt;     while True:<br>
&gt;         choice = raw_input(prompt)<br>
&gt;         if valid_choice(choice, 0, len(options)-1):<br>
&gt;             break<br>
&gt;     return choice<br>
&gt; Is that the most pythonic way of validating? Is there a better way?<br>
&gt; As an aside, in the valid_choice function I know I could do:<br>
&gt; if not choice in range(min, max)<br>
&gt; but I figured a comparison would probably be the better choice, correct?<br>
&gt; Thanks,<br>
&gt; Wayne<br>
&gt; --<br>
&gt; To be considered stupid and to be told so is more painful than being called<br>
&gt; gluttonous, mendacious, violent, lascivious, lazy, cowardly: every weakness,<br>
&gt; every vice, has found its defenders, its rhetoric, its ennoblement and<br>
&gt; exaltation, but stupidity hasn’t. - Primo Levi<br>
&gt;<br>
</div></div>&gt; _______________________________________________<br>
&gt; Tutor maillist  -  <a href="mailto:Tutor@python.org">Tutor@python.org</a><br>
&gt; To unsubscribe or change subscription options:<br>
&gt; <a href="http://mail.python.org/mailman/listinfo/tutor" target="_blank">http://mail.python.org/mailman/listinfo/tutor</a><br>
&gt;<br>
&gt;<br>
<br>
The most pythonic way would be to use a try except block:<br>
<div class="im"><br>
    while True:<br>
        choice = raw_input(prompt)<br>
</div>        try:<br>
            options[int(choice)]<br>
        except (KeyError, IndexError, TypeError):<br>
            print &quot;Invalid input, try again.&quot;<br>
            continue<br>
        return choice<br></blockquote><div><br></div><div>Ah, that&#39;s much cleaner, I like it :)</div><div><br></div><div> yeah, I noticed right after I had sent my email that I forgot to convert it to an int. Though I do believe (and checking confirms) it&#39;s ValueError on an int() fail:</div>

<div><br></div><div><div>ValueError: invalid literal for int() with base 10: &#39;asdf&#39;</div><div><br></div><div>Now I can eliminate a function, so that&#39;s helpful :)</div><div><br></div><div>Thanks,</div><div>Wayne</div>

</div></div>