On 03/15/2013 05:01 PM, Christopher Emery wrote:
Hello All,
>
> Okay, I have created a small function that will check to see if a user
> has answered with a Yes, No or other response. If the user puts yes
> or no the function ends, if they put anything but yes or no then the
> function will ask them the same question and tell them they either
> need to put yes or no for their response
>
> This is what I have as of now:
> ### Start of Code ###
> def question_y_n(question):
> answer = input(question)
> while(answer != "Yes"):
> if answer != "No":
> print("Please enter Yes or No for your response!")
> answer = input(question)
> else:
> answer = "No"
> break
> return answer
>
> answer = question_y_n("You want a drink of water? :")
> print("Your answer to the question was ", answer)
> ### End of Code ###
>
> Is this the best way to handle this? I would like to use this any
> time I have a yes or no question. In the future I will add to this and
> make it work with yes/no, true/false, 1/0 so that anytime there is
> anything that only has two answer I could use this instead of writing
> more code for each two answer type questions.
>
> Thank you for your advice ahead of time!!!
>
> PS: I hope don't mind me posting code that works to see if I can improve on it!
>
> Sincerely in Christ,
> Christopher


Hi Christopher,

I've recently made a couple of functions that do this in a more general
way. There are some usage examples at the end, including y/n input. The
difference between them is that the 2nd function adds more options.



import re

def simpleinp(pattern, prompt="> ", convert=None, errmsg="Invalid Input", blank=False):
    """Keep asking user for input until it matches `pattern`."""
    if pattern == "%d": pattern = "\d+"; convert = int
    if pattern == "%s": pattern = ".+"

    while True:
        i = input(prompt).strip()
        if blank and not i: return None

        if re.match('^'+pattern+'$', i):
            return convert(i) if convert and i else i
        else:
            print(errmsg)


def getinp(pattern, prompt="> ", convert=None, errmsg="Invalid Input", ignorecase=False, lower=False, blank=True):
    """Keep asking user for input until it matches `pattern`."""
    if pattern == "%d":
        pattern = "\d+"
        convert = int
    if pattern == "%f":
        pattern = "\d+.?\d*"
        convert = float
    if pattern == "%s":
        pattern = "\S+"

    while True:
        i = input(prompt).strip()
        if blank and not i:
            return None
        if lower:
            i = i.lower()
        flags = re.I if ignorecase else 0

        if re.match('^'+pattern+'$', i, flags=flags):
            return convert(i) if convert else i
        else:
            print(errmsg)


# print( getinp("%d", "integer: ") )
# print( getinp("%f", "float: ") )
# print( getinp("%s", "string: ") )
# print( getinp("(y|n)", "y/n: ", lower=True) )

# print( simpleinp("%d", "integer: ") )
# print( simpleinp("%s", "string: ") )
# print( simpleinp(".*", "string or blank: ") )
# print( simpleinp("[ynYN]", "y/n: ") )

HTH,  -m



--
Lark's Tongue Guide to Python: http://lightbird.net/larks/

The dreamer can know no truth, not even about his dream, except by awaking
out of it.  George Santayana

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

Reply via email to