[Tutor] Engarde program was: i++

David Heiser David.Heiser at intelliden.com
Thu Jun 7 15:58:53 CEST 2007


Very nice trick. Thanks.

P.S.  You can still use:

      s = raw_input(question).lower()[:1]
      if s == ...:


-----Original Message-----
From: Danny Yoo [mailto:dyoo at cs.wpi.edu] 
Sent: Wednesday, June 06, 2007 5:53 PM
To: David Heiser
Cc: tutor at python.org
Subject: Re: [Tutor] Engarde program was: i++




On Wed, 6 Jun 2007, David Heiser wrote:

> or..
>
> def is_yes(question):
>     while True:
>         try:
>             s = raw_input(question).lower()[0]
>             if s == 'y':
>                 return True
>             elif s == 'n':
>                 return False
>         except:
>             pass     ## This traps the condition where a user just
> presses enter
>         print '\nplease select y, n, yes, or no\n'

Hi David,

This does have a different functionality and is is more permissive than 
the original code.  What if the user types in "yoo-hoo"?  The original 
code would reject this, but the function above will treat it as as yes. 
It does depend on what one wants.

Since there is no comment or documentation on is_yes() that says how it 
should behave, I guess we can say that anything goes, but that's
probably 
a situation we should fix.


For this particular situation, I'd avoid the try/except block that is
used 
for catching array-out-of-bounds errors.  If we do want the above 
functionality, we can take advantage of string slicing to similar
effect:

###################################################
def is_yes(question):
     """Asks for a response until the user presses something beginning
     either with 'y' or 'n'.  Returns True if 'y', False otherwise."""
     while True:
         s = raw_input(question).lower()
         if s[:1] == 'y':
             return True
         elif s[:1] == 'n':
             return False
         print '\nplease select y, n, yes, or no\n'
###################################################


More information about the Tutor mailing list