Asking the user for input until they give a valid response












442















I am writing a program that must accept input from the user.



#note: Python 2.7 users should use `raw_input`, the equivalent of 3.X's `input`
age = int(input("Please enter your age: "))
if age >= 18:
print("You are able to vote in the United States!")
else:
print("You are not able to vote in the United States.")


This works as expected if the user enters sensible data.



C:PythonProjects> canyouvote.py
Please enter your age: 23
You are able to vote in the United States!


But if they make a mistake, then it crashes:



C:PythonProjects> canyouvote.py
Please enter your age: dickety six
Traceback (most recent call last):
File "canyouvote.py", line 1, in <module>
age = int(input("Please enter your age: "))
ValueError: invalid literal for int() with base 10: 'dickety six'


Instead of crashing, I would like it to try getting the input again. Like this:



C:PythonProjects> canyouvote.py
Please enter your age: dickety six
Sorry, I didn't understand that.
Please enter your age: 26
You are able to vote in the United States!


How can I accomplish this? What if I also wanted to reject values like -1, which is a valid int, but nonsensical in this context?










share|improve this question























  • 37





    PS. Some may think it's wrong that I'm answering my own question right after posting it. Before downvoting, please read It's OK to Ask and Answer Your Own Questions. See also Putting the Community back in Wiki, which says "Compiling a canonical reference" is "something wonderful". Questions like this one are asked often enough to justify writing a post that can concisely answer all of them.

    – Kevin
    Apr 25 '14 at 13:32
















442















I am writing a program that must accept input from the user.



#note: Python 2.7 users should use `raw_input`, the equivalent of 3.X's `input`
age = int(input("Please enter your age: "))
if age >= 18:
print("You are able to vote in the United States!")
else:
print("You are not able to vote in the United States.")


This works as expected if the user enters sensible data.



C:PythonProjects> canyouvote.py
Please enter your age: 23
You are able to vote in the United States!


But if they make a mistake, then it crashes:



C:PythonProjects> canyouvote.py
Please enter your age: dickety six
Traceback (most recent call last):
File "canyouvote.py", line 1, in <module>
age = int(input("Please enter your age: "))
ValueError: invalid literal for int() with base 10: 'dickety six'


Instead of crashing, I would like it to try getting the input again. Like this:



C:PythonProjects> canyouvote.py
Please enter your age: dickety six
Sorry, I didn't understand that.
Please enter your age: 26
You are able to vote in the United States!


How can I accomplish this? What if I also wanted to reject values like -1, which is a valid int, but nonsensical in this context?










share|improve this question























  • 37





    PS. Some may think it's wrong that I'm answering my own question right after posting it. Before downvoting, please read It's OK to Ask and Answer Your Own Questions. See also Putting the Community back in Wiki, which says "Compiling a canonical reference" is "something wonderful". Questions like this one are asked often enough to justify writing a post that can concisely answer all of them.

    – Kevin
    Apr 25 '14 at 13:32














442












442








442


208






I am writing a program that must accept input from the user.



#note: Python 2.7 users should use `raw_input`, the equivalent of 3.X's `input`
age = int(input("Please enter your age: "))
if age >= 18:
print("You are able to vote in the United States!")
else:
print("You are not able to vote in the United States.")


This works as expected if the user enters sensible data.



C:PythonProjects> canyouvote.py
Please enter your age: 23
You are able to vote in the United States!


But if they make a mistake, then it crashes:



C:PythonProjects> canyouvote.py
Please enter your age: dickety six
Traceback (most recent call last):
File "canyouvote.py", line 1, in <module>
age = int(input("Please enter your age: "))
ValueError: invalid literal for int() with base 10: 'dickety six'


Instead of crashing, I would like it to try getting the input again. Like this:



C:PythonProjects> canyouvote.py
Please enter your age: dickety six
Sorry, I didn't understand that.
Please enter your age: 26
You are able to vote in the United States!


How can I accomplish this? What if I also wanted to reject values like -1, which is a valid int, but nonsensical in this context?










share|improve this question
















I am writing a program that must accept input from the user.



#note: Python 2.7 users should use `raw_input`, the equivalent of 3.X's `input`
age = int(input("Please enter your age: "))
if age >= 18:
print("You are able to vote in the United States!")
else:
print("You are not able to vote in the United States.")


This works as expected if the user enters sensible data.



C:PythonProjects> canyouvote.py
Please enter your age: 23
You are able to vote in the United States!


But if they make a mistake, then it crashes:



C:PythonProjects> canyouvote.py
Please enter your age: dickety six
Traceback (most recent call last):
File "canyouvote.py", line 1, in <module>
age = int(input("Please enter your age: "))
ValueError: invalid literal for int() with base 10: 'dickety six'


Instead of crashing, I would like it to try getting the input again. Like this:



C:PythonProjects> canyouvote.py
Please enter your age: dickety six
Sorry, I didn't understand that.
Please enter your age: 26
You are able to vote in the United States!


How can I accomplish this? What if I also wanted to reject values like -1, which is a valid int, but nonsensical in this context?







python validation loops python-3.x user-input






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Mar 22 '17 at 16:13


























community wiki





9 revs, 6 users 72%
Kevin













  • 37





    PS. Some may think it's wrong that I'm answering my own question right after posting it. Before downvoting, please read It's OK to Ask and Answer Your Own Questions. See also Putting the Community back in Wiki, which says "Compiling a canonical reference" is "something wonderful". Questions like this one are asked often enough to justify writing a post that can concisely answer all of them.

    – Kevin
    Apr 25 '14 at 13:32














  • 37





    PS. Some may think it's wrong that I'm answering my own question right after posting it. Before downvoting, please read It's OK to Ask and Answer Your Own Questions. See also Putting the Community back in Wiki, which says "Compiling a canonical reference" is "something wonderful". Questions like this one are asked often enough to justify writing a post that can concisely answer all of them.

    – Kevin
    Apr 25 '14 at 13:32








37




37





PS. Some may think it's wrong that I'm answering my own question right after posting it. Before downvoting, please read It's OK to Ask and Answer Your Own Questions. See also Putting the Community back in Wiki, which says "Compiling a canonical reference" is "something wonderful". Questions like this one are asked often enough to justify writing a post that can concisely answer all of them.

– Kevin
Apr 25 '14 at 13:32





PS. Some may think it's wrong that I'm answering my own question right after posting it. Before downvoting, please read It's OK to Ask and Answer Your Own Questions. See also Putting the Community back in Wiki, which says "Compiling a canonical reference" is "something wonderful". Questions like this one are asked often enough to justify writing a post that can concisely answer all of them.

– Kevin
Apr 25 '14 at 13:32












17 Answers
17






active

oldest

votes


















545





+750









The simplest way to accomplish this would be to put the input method in a while loop. Use continue when you get bad input, and break out of the loop when you're satisfied.



When Your Input Might Raise an Exception



Use try and catch to detect when the user enters data that can't be parsed.



while True:
try:
# Note: Python 2.x users should use raw_input, the equivalent of 3.x's input
age = int(input("Please enter your age: "))
except ValueError:
print("Sorry, I didn't understand that.")
#better try again... Return to the start of the loop
continue
else:
#age was successfully parsed!
#we're ready to exit the loop.
break
if age >= 18:
print("You are able to vote in the United States!")
else:
print("You are not able to vote in the United States.")


Implementing Your Own Validation Rules



If you want to reject values that Python can successfully parse, you can add your own validation logic.



while True:
data = input("Please enter a loud message (must be all caps): ")
if not data.isupper():
print("Sorry, your response was not loud enough.")
continue
else:
#we're happy with the value given.
#we're ready to exit the loop.
break

while True:
data = input("Pick an answer from A to D:")
if data.lower() not in ('a', 'b', 'c', 'd'):
print("Not an appropriate choice.")
else:
break


Combining Exception Handling and Custom Validation



Both of the above techniques can be combined into one loop.



while True:
try:
age = int(input("Please enter your age: "))
except ValueError:
print("Sorry, I didn't understand that.")
continue

if age < 0:
print("Sorry, your response must not be negative.")
continue
else:
#age was successfully parsed, and we're happy with its value.
#we're ready to exit the loop.
break
if age >= 18:
print("You are able to vote in the United States!")
else:
print("You are not able to vote in the United States.")


Encapsulating it All in a Function



If you need to ask your user for a lot of different values, it might be useful to put this code in a function, so you don't have to retype it every time.



def get_non_negative_int(prompt):
while True:
try:
value = int(input(prompt))
except ValueError:
print("Sorry, I didn't understand that.")
continue

if value < 0:
print("Sorry, your response must not be negative.")
continue
else:
break
return value

age = get_non_negative_int("Please enter your age: ")
kids = get_non_negative_int("Please enter the number of children you have: ")
salary = get_non_negative_int("Please enter your yearly earnings, in dollars: ")


Putting It All Together



You can extend this idea to make a very generic input function:



def sanitised_input(prompt, type_=None, min_=None, max_=None, range_=None):
if min_ is not None and max_ is not None and max_ < min_:
raise ValueError("min_ must be less than or equal to max_.")
while True:
ui = input(prompt)
if type_ is not None:
try:
ui = type_(ui)
except ValueError:
print("Input type must be {0}.".format(type_.__name__))
continue
if max_ is not None and ui > max_:
print("Input must be less than or equal to {0}.".format(max_))
elif min_ is not None and ui < min_:
print("Input must be greater than or equal to {0}.".format(min_))
elif range_ is not None and ui not in range_:
if isinstance(range_, range):
template = "Input must be between {0.start} and {0.stop}."
print(template.format(range_))
else:
template = "Input must be {0}."
if len(range_) == 1:
print(template.format(*range_))
else:
print(template.format(" or ".join((", ".join(map(str,
range_[:-1])),
str(range_[-1])))))
else:
return ui


With usage such as:



age = sanitised_input("Enter your age: ", int, 1, 101)
answer = sanitised_input("Enter your answer: ", str.lower, range_=('a', 'b', 'c', 'd'))


Common Pitfalls, and Why you Should Avoid Them



The Redundant Use of Redundant input Statements



This method works but is generally considered poor style:



data = input("Please enter a loud message (must be all caps): ")
while not data.isupper():
print("Sorry, your response was not loud enough.")
data = input("Please enter a loud message (must be all caps): ")


It might look attractive initially because it's shorter than the while True method, but it violates the Don't Repeat Yourself principle of software development. This increases the likelihood of bugs in your system. What if you want to backport to 2.7 by changing input to raw_input, but accidentally change only the first input above? It's a SyntaxError just waiting to happen.



Recursion Will Blow Your Stack



If you've just learned about recursion, you might be tempted to use it in get_non_negative_int so you can dispose of the while loop.



def get_non_negative_int(prompt):
try:
value = int(input(prompt))
except ValueError:
print("Sorry, I didn't understand that.")
return get_non_negative_int(prompt)

if value < 0:
print("Sorry, your response must not be negative.")
return get_non_negative_int(prompt)
else:
return value


This appears to work fine most of the time, but if the user enters invalid data enough times, the script will terminate with a RuntimeError: maximum recursion depth exceeded. You may think "no fool would make 1000 mistakes in a row", but you're underestimating the ingenuity of fools!






share|improve this answer





















  • 30





    Its fun reading it with many examples, kudos. Underrated lesson: "Don't underestimate the ingenuity of fools!"

    – pibano
    Jan 3 '17 at 2:02






  • 1





    Not only would I have upvoted both the Q&A anyway, as they're great, but you sealed the deal with "dickety six". Well done, @Kevin.

    – erekalper
    Feb 2 '18 at 15:58



















28














Why would you do a while True and then break out of this loop while you can also just put your requirements in the while statement since all you want is to stop once you have the age?



age = None
while age is None:
input_value = input("Please enter your age: ")
try:
# try and convert the string input to a number
age = int(input_value)
except ValueError:
# tell the user off
print("{input} is not a number, please enter a number only".format(input=input_value))
if age >= 18:
print("You are able to vote in the United States!")
else:
print("You are not able to vote in the United States.")


This would result in the following:



Please enter your age: *potato*
potato is not a number, please enter a number only
Please enter your age: *5*
You are not able to vote in the United States.


this will work since age will never have a value that will not make sense and the code follows the logic of your "business process"






share|improve this answer

































    20














    Though the accepted answer is amazing. I would also like to share a quick hack for this problem. (This takes care of the negative age problem as well.)



    f=lambda age: (age.isdigit() and ((int(age)>=18  and "Can vote" ) or "Cannot vote")) or 
    f(input("invalid input. Try againnPlease enter your age: "))
    print(f(input("Please enter your age: ")))


    P.S. This code is for python 3.x.






    share|improve this answer





















    • 1





      Note that this code is recursive, but recursion isn't necessary here, and as Kevin said, it can blow your stack.

      – PM 2Ring
      Jan 31 '16 at 8:12






    • 1





      @PM2Ring - you are right. But my purpose here was just to show how "short circuiting" can minimise (beautify) long pieces of code.

      – aaveg
      Feb 3 '16 at 8:58






    • 7





      Why would you assign a lambda to a variable, just use def instead. def f(age): is far clearer than f = lambda age:

      – GP89
      May 16 '17 at 22:29








    • 2





      In some cases, you may need the age just once and then there is no use of that function. One may want to use a function and throw it away after the job is done. Also, this may not be the best way, but it definitely is a different way of doing it (which was the purpose of my solution).

      – aaveg
      May 16 '17 at 23:17













    • interesting POV!

      – MJM
      Jul 24 '18 at 10:55



















    9














    So, I was messing around with something similar to this recently, and I came up with the following solution, which uses a way of getting input that rejects junk, before it's even checked in any logical way.



    read_single_keypress() courtesy https://stackoverflow.com/a/6599441/4532996



    def read_single_keypress() -> str:
    """Waits for a single keypress on stdin.
    -- from :: https://stackoverflow.com/a/6599441/4532996
    """

    import termios, fcntl, sys, os
    fd = sys.stdin.fileno()
    # save old state
    flags_save = fcntl.fcntl(fd, fcntl.F_GETFL)
    attrs_save = termios.tcgetattr(fd)
    # make raw - the way to do this comes from the termios(3) man page.
    attrs = list(attrs_save) # copy the stored version to update
    # iflag
    attrs[0] &= ~(termios.IGNBRK | termios.BRKINT | termios.PARMRK
    | termios.ISTRIP | termios.INLCR | termios. IGNCR
    | termios.ICRNL | termios.IXON )
    # oflag
    attrs[1] &= ~termios.OPOST
    # cflag
    attrs[2] &= ~(termios.CSIZE | termios. PARENB)
    attrs[2] |= termios.CS8
    # lflag
    attrs[3] &= ~(termios.ECHONL | termios.ECHO | termios.ICANON
    | termios.ISIG | termios.IEXTEN)
    termios.tcsetattr(fd, termios.TCSANOW, attrs)
    # turn off non-blocking
    fcntl.fcntl(fd, fcntl.F_SETFL, flags_save & ~os.O_NONBLOCK)
    # read a single keystroke
    try:
    ret = sys.stdin.read(1) # returns a single character
    except KeyboardInterrupt:
    ret = 0
    finally:
    # restore old state
    termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save)
    fcntl.fcntl(fd, fcntl.F_SETFL, flags_save)
    return ret

    def until_not_multi(chars) -> str:
    """read stdin until !(chars)"""
    import sys
    chars = list(chars)
    y = ""
    sys.stdout.flush()
    while True:
    i = read_single_keypress()
    _ = sys.stdout.write(i)
    sys.stdout.flush()
    if i not in chars:
    break
    y += i
    return y

    def _can_you_vote() -> str:
    """a practical example:
    test if a user can vote based purely on keypresses"""
    print("can you vote? age : ", end="")
    x = int("0" + until_not_multi("0123456789"))
    if not x:
    print("nsorry, age can only consist of digits.")
    return
    print("your age is", x, "nYou can vote!" if x >= 18 else "Sorry! you can't vote")

    _can_you_vote()


    You can find the complete module here.



    Example:



    $ ./input_constrain.py
    can you vote? age : a
    sorry, age can only consist of digits.
    $ ./input_constrain.py
    can you vote? age : 23<RETURN>
    your age is 23
    You can vote!
    $ _


    Note that the nature of this implementation is it closes stdin as soon as something that isn't a digit is read. I didn't hit enter after a, but I needed to after the numbers.



    You could merge this with the thismany() function in the same module to only allow, say, three digits.






    share|improve this answer

































      3














      def validate_age(age):
      if age >=0 :
      return True
      return False

      while True:
      try:
      age = int(raw_input("Please enter your age:"))
      if validate_age(age): break
      except ValueError:
      print "Error: Invalid age."





      share|improve this answer

































        3














        Try this one:-



        def takeInput(required):
        print 'ooo or OOO to exit'
        ans = raw_input('Enter: ')

        if not ans:
        print "You entered nothing...!"
        return takeInput(required)

        ## FOR Exit ##
        elif ans in ['ooo', 'OOO']:
        print "Closing instance."
        exit()

        else:
        if ans.isdigit():
        current = 'int'
        elif set('[~!@#$%^&*()_+{}":/']+$').intersection(ans):
        current = 'other'
        elif isinstance(ans,basestring):
        current = 'str'
        else:
        current = 'none'

        if required == current :
        return ans
        else:
        return takeInput(required)

        ## pass the value in which type you want [str/int/special character(as other )]
        print "input: ", takeInput('str')





        share|improve this answer

































          3














          To edit your code and fix the error:



          while True:
          try:
          age = int(input("Please enter your age: "))
          if age >= 18:
          print("You are able to vote in the United States!")
          break
          else:
          print("You are not able to vote in the United States.")
          break
          except ValueError:
          print("Please enter a valid response")





          share|improve this answer

































            1














            You can write more general logic to allow user to enter only specific number of times, as the same use-case arises in many real-world applications.



            def getValidInt(iMaxAttemps = None):
            iCount = 0
            while True:
            # exit when maximum attempt limit has expired
            if iCount != None and iCount > iMaxAttemps:
            return 0 # return as default value

            i = raw_input("Enter no")
            try:
            i = int(i)
            except ValueError as e:
            print "Enter valid int value"
            else:
            break

            return i

            age = getValidInt()
            # do whatever you want to do.





            share|improve this answer


























            • you forget to increase the iCount value after each loop

              – Hoai-Thu Vuong
              Mar 1 '17 at 8:49





















            1














            Use "while" statement till user enter a true value and if the input value is not a number or it's a null value skip it and try to ask again and so on.
            In example I tried to answer truly your question. If we suppose that our age is between 1 and 150 then input value accepted, else it's a wrong value.
            For terminating program, the user can use 0 key and enter it as a value.




            Note: Read comments top of code.




            # If your input value is only a number then use "Value.isdigit() == False".
            # If you need an input that is a text, you should remove "Value.isdigit() == False".
            def Input(Message):
            Value = None
            while Value == None or Value.isdigit() == False:
            try:
            Value = str(input(Message)).strip()
            except InputError:
            Value = None
            return Value

            # Example:
            age = 0
            # If we suppose that our age is between 1 and 150 then input value accepted,
            # else it's a wrong value.
            while age <=0 or age >150:
            age = int(Input("Please enter your age: "))
            # For terminating program, the user can use 0 key and enter it as an a value.
            if age == 0:
            print("Terminating ...")
            exit(0)

            if age >= 18 and age <=150:
            print("You are able to vote in the United States!")
            else:
            print("You are not able to vote in the United States.")





            share|improve this answer

































              0














              While a try/except block will work, a much faster and cleaner way to accomplish this task would be to use str.isdigit().



              while True:
              age = input("Please enter your age: ")
              if age.isdigit():
              age = int(age)
              break
              else:
              print("Invalid number '{age}'. Try again.".format(age=age))

              if age >= 18:
              print("You are able to vote in the United States!")
              else:
              print("You are not able to vote in the United States.")





              share|improve this answer





















              • 1





                str.isnumeric is only available in Python 3 and does not return true for all valid integers. Like str.isdigit it is testing properties of the characters, and - is not a numeric character.

                – Martijn Pieters
                Jun 6 '16 at 6:50



















              0














              You can make the input statement a while True loop so it repeatedly asks for the users input and then break that loop if the user enters the response you would like. And you can use try and except blocks to handle invalid responses.



              while True:

              var = True

              try:
              age = int(input("Please enter your age: "))

              except ValueError:
              print("Invalid input.")
              var = False

              if var == True:
              if age >= 18:
              print("You are able to vote in the United States.")
              break
              else:
              print("You are not able to vote in the United States.")


              The var variable is just so that if the user enters a string instead of a integer the program wont return "You are not able to vote in the United States."






              share|improve this answer

































                0














                Use try catch with never ending while loop. To check for blank string use IF statement to check if string is empty.



                while True:
                name = input("Enter Your Namen")
                if not name:
                print("I did not understood that")
                continue
                else:
                break

                while True:
                try:
                salary = float(input("whats ur salaryn"))
                except ValueError:
                print("I did not understood that")
                continue
                else:
                break

                while True:
                try:
                print("whats ur age?")
                age = int(float(input()))
                except ValueError:
                print("I did not understood that")
                continue
                else:
                break

                print("Hello "+ name + "nYour salary is " + str(salary) + 'nand you will be ' + str(age+1) +' in a Year')





                share|improve this answer

































                  0














                  This will continue ask user to input the number until they input a valid number:



                  #note: Python 2.7 users should use raw_input, the equivalent of 3.X's input
                  while(1):
                  try:
                  age = int(input("Please enter your age: "))
                  if age >= 18:
                  print("You are able to vote in the United States!")
                  break()
                  else:
                  print("You are not able to vote in the United States.")
                  break()
                  except:
                  print("Please only enter numbers ")





                  share|improve this answer

































                    0














                    One more solution for using input validation using a customized ValidationError and a (optional) range validation for integer inputs:



                    class ValidationError(ValueError): 
                    """Special validation error - its message is supposed to be printed"""
                    pass

                    def RangeValidator(text,num,r):
                    """Generic validator - raises 'text' as ValidationError if 'num' not in range 'r'."""
                    if num in r:
                    return num
                    raise ValidationError(text)

                    def ValidCol(c):
                    """Specialized column validator providing text and range."""
                    return RangeValidator("Columns must be in the range of 0 to 3 (inclusive)",
                    c, range(4))

                    def ValidRow(r):
                    """Specialized row validator providing text and range."""
                    return RangeValidator("Rows must be in the range of 5 to 15(exclusive)",
                    r, range(5,15))


                    Usage:



                    def GetInt(text, validator=None):
                    """Aks user for integer input until a valid integer is given. If provided,
                    a 'validator' function takes the integer and either raises a
                    ValidationError to be printed or returns the valid number.
                    Non integers display a simple error message."""
                    print()
                    while True:
                    n = input(text)
                    try:
                    n = int(n)

                    return n if validator is None else validator(n)

                    except ValueError as ve:
                    # prints ValidationErrors directly - else generic message:
                    if isinstance(ve, ValidationError):
                    print(ve)
                    else:
                    print("Invalid input: ", n)


                    column = GetInt("Pleased enter column: ", ValidCol)
                    row = GetInt("Pleased enter row: ", ValidRow)
                    print( row, column)


                    Output:



                    Pleased enter column: 22
                    Columns must be in the range of 0 to 3 (inclusive)
                    Pleased enter column: -2
                    Columns must be in the range of 0 to 3 (inclusive)
                    Pleased enter column: 2
                    Pleased enter row: a
                    Invalid input: a
                    Pleased enter row: 72
                    Rows must be in the range of 5 to 15(exclusive)
                    Pleased enter row: 9

                    9, 2





                    share|improve this answer

































                      0














                      Here's a cleaner, more generalized solution that avoids repetitive if/else blocks: write a function that takes (Error, error prompt) pairs in a dictionary and do all your value-checking with assertions.



                      def validate_input(prompt, error_map):
                      while True:
                      try:
                      data = int(input(prompt))
                      # Insert your non-exception-throwing conditionals here
                      assert data > 0
                      return data
                      # Print whatever text you want the user to see
                      # depending on how they messed up
                      except tuple(error_map.keys()) as e:
                      print(error_map[type(e)])


                      Usage:



                      d = {ValueError: 'Integers only', AssertionError: 'Positive numbers only', 
                      KeyboardInterrupt: 'You can never leave'}
                      user_input = validate_input("Positive number: ", d)





                      share|improve this answer

































                        0














                        Building upon Daniel Q's and Patrick Artner's excellent suggestions,
                        here is an even more generalized solution.



                        # Assuming Python3
                        import sys

                        class ValidationError(ValueError): # thanks Patrick Artner
                        pass

                        def validate_input(prompt, cast=str, cond=(lambda x: True), onerror=None):
                        if onerror==None: onerror = {}
                        while True:
                        try:
                        data = cast(input(prompt))
                        if not cond(data): raise ValidationError
                        return data
                        except tuple(onerror.keys()) as e: # thanks Daniel Q
                        print(onerror[type(e)], file=sys.stderr)


                        I opted for explicit if and raise statements instead of an assert,
                        because assertion checking may be turned off,
                        whereas validation should always be on to provide robustness.



                        This may be used to get different kinds of input,
                        with different validation conditions.
                        For example:



                        # No validation, equivalent to simple input:
                        anystr = validate_input("Enter any string: ")

                        # Get a string containing only letters:
                        letters = validate_input("Enter letters: ",
                        cond=str.isalpha,
                        onerror={ValidationError: "Only letters, please!"})

                        # Get a float in [0, 100]:
                        percentage = validate_input("Percentage? ",
                        cast=float, cond=lambda x: 0.0<=x<=100.0,
                        onerror={ValidationError: "Must be between 0 and 100!",
                        ValueError: "Not a number!"})


                        Or, to answer the original question:



                        age = validate_input("Please enter your age: ",
                        cast=int, cond=lambda a:0<=a<150,
                        onerror={ValidationError: "Enter a plausible age, please!",
                        ValueError: "Enter an integer, please!"})
                        if age >= 18:
                        print("You are able to vote in the United States!")
                        else:
                        print("You are not able to vote in the United States.")





                        share|improve this answer

































                          0














                          Good question! You can try the following code for this. =)



                          This code uses ast.literal_eval() to find the data type of the input (age). Then it follows the following algorithm:






                          1. Ask user to input her/his age.



                            1.1. If age is float or int data type:




                            • Check if age>=18. If age>=18, print appropriate output and exit.


                            • Check if 0<age<18. If 0<age<18, print appropriate output and exit.


                            • If age<=0, ask the user to input a valid number for age again, (i.e. go back to step 1.)



                            1.2. If age is not float or int data type, then ask user to input her/his age again (i.e. go back to step 1.)






                          Here is the code.



                          from ast import literal_eval

                          ''' This function is used to identify the data type of input data.'''
                          def input_type(input_data):
                          try:
                          return type(literal_eval(input_data))
                          except (ValueError, SyntaxError):
                          return str

                          flag = True

                          while(flag):
                          age = raw_input("Please enter your age: ")

                          if input_type(age)==float or input_type(age)==int:
                          if eval(age)>=18:
                          print("You are able to vote in the United States!")
                          flag = False
                          elif eval(age)>0 and eval(age)<18:
                          print("You are not able to vote in the United States.")
                          flag = False
                          else: print("Please enter a valid number as your age.")

                          else: print("Sorry, I didn't understand that.")





                          share|improve this answer
























                            protected by Robert Harvey Jan 14 '15 at 21:13



                            Thank you for your interest in this question.
                            Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).



                            Would you like to answer one of these unanswered questions instead?














                            17 Answers
                            17






                            active

                            oldest

                            votes








                            17 Answers
                            17






                            active

                            oldest

                            votes









                            active

                            oldest

                            votes






                            active

                            oldest

                            votes









                            545





                            +750









                            The simplest way to accomplish this would be to put the input method in a while loop. Use continue when you get bad input, and break out of the loop when you're satisfied.



                            When Your Input Might Raise an Exception



                            Use try and catch to detect when the user enters data that can't be parsed.



                            while True:
                            try:
                            # Note: Python 2.x users should use raw_input, the equivalent of 3.x's input
                            age = int(input("Please enter your age: "))
                            except ValueError:
                            print("Sorry, I didn't understand that.")
                            #better try again... Return to the start of the loop
                            continue
                            else:
                            #age was successfully parsed!
                            #we're ready to exit the loop.
                            break
                            if age >= 18:
                            print("You are able to vote in the United States!")
                            else:
                            print("You are not able to vote in the United States.")


                            Implementing Your Own Validation Rules



                            If you want to reject values that Python can successfully parse, you can add your own validation logic.



                            while True:
                            data = input("Please enter a loud message (must be all caps): ")
                            if not data.isupper():
                            print("Sorry, your response was not loud enough.")
                            continue
                            else:
                            #we're happy with the value given.
                            #we're ready to exit the loop.
                            break

                            while True:
                            data = input("Pick an answer from A to D:")
                            if data.lower() not in ('a', 'b', 'c', 'd'):
                            print("Not an appropriate choice.")
                            else:
                            break


                            Combining Exception Handling and Custom Validation



                            Both of the above techniques can be combined into one loop.



                            while True:
                            try:
                            age = int(input("Please enter your age: "))
                            except ValueError:
                            print("Sorry, I didn't understand that.")
                            continue

                            if age < 0:
                            print("Sorry, your response must not be negative.")
                            continue
                            else:
                            #age was successfully parsed, and we're happy with its value.
                            #we're ready to exit the loop.
                            break
                            if age >= 18:
                            print("You are able to vote in the United States!")
                            else:
                            print("You are not able to vote in the United States.")


                            Encapsulating it All in a Function



                            If you need to ask your user for a lot of different values, it might be useful to put this code in a function, so you don't have to retype it every time.



                            def get_non_negative_int(prompt):
                            while True:
                            try:
                            value = int(input(prompt))
                            except ValueError:
                            print("Sorry, I didn't understand that.")
                            continue

                            if value < 0:
                            print("Sorry, your response must not be negative.")
                            continue
                            else:
                            break
                            return value

                            age = get_non_negative_int("Please enter your age: ")
                            kids = get_non_negative_int("Please enter the number of children you have: ")
                            salary = get_non_negative_int("Please enter your yearly earnings, in dollars: ")


                            Putting It All Together



                            You can extend this idea to make a very generic input function:



                            def sanitised_input(prompt, type_=None, min_=None, max_=None, range_=None):
                            if min_ is not None and max_ is not None and max_ < min_:
                            raise ValueError("min_ must be less than or equal to max_.")
                            while True:
                            ui = input(prompt)
                            if type_ is not None:
                            try:
                            ui = type_(ui)
                            except ValueError:
                            print("Input type must be {0}.".format(type_.__name__))
                            continue
                            if max_ is not None and ui > max_:
                            print("Input must be less than or equal to {0}.".format(max_))
                            elif min_ is not None and ui < min_:
                            print("Input must be greater than or equal to {0}.".format(min_))
                            elif range_ is not None and ui not in range_:
                            if isinstance(range_, range):
                            template = "Input must be between {0.start} and {0.stop}."
                            print(template.format(range_))
                            else:
                            template = "Input must be {0}."
                            if len(range_) == 1:
                            print(template.format(*range_))
                            else:
                            print(template.format(" or ".join((", ".join(map(str,
                            range_[:-1])),
                            str(range_[-1])))))
                            else:
                            return ui


                            With usage such as:



                            age = sanitised_input("Enter your age: ", int, 1, 101)
                            answer = sanitised_input("Enter your answer: ", str.lower, range_=('a', 'b', 'c', 'd'))


                            Common Pitfalls, and Why you Should Avoid Them



                            The Redundant Use of Redundant input Statements



                            This method works but is generally considered poor style:



                            data = input("Please enter a loud message (must be all caps): ")
                            while not data.isupper():
                            print("Sorry, your response was not loud enough.")
                            data = input("Please enter a loud message (must be all caps): ")


                            It might look attractive initially because it's shorter than the while True method, but it violates the Don't Repeat Yourself principle of software development. This increases the likelihood of bugs in your system. What if you want to backport to 2.7 by changing input to raw_input, but accidentally change only the first input above? It's a SyntaxError just waiting to happen.



                            Recursion Will Blow Your Stack



                            If you've just learned about recursion, you might be tempted to use it in get_non_negative_int so you can dispose of the while loop.



                            def get_non_negative_int(prompt):
                            try:
                            value = int(input(prompt))
                            except ValueError:
                            print("Sorry, I didn't understand that.")
                            return get_non_negative_int(prompt)

                            if value < 0:
                            print("Sorry, your response must not be negative.")
                            return get_non_negative_int(prompt)
                            else:
                            return value


                            This appears to work fine most of the time, but if the user enters invalid data enough times, the script will terminate with a RuntimeError: maximum recursion depth exceeded. You may think "no fool would make 1000 mistakes in a row", but you're underestimating the ingenuity of fools!






                            share|improve this answer





















                            • 30





                              Its fun reading it with many examples, kudos. Underrated lesson: "Don't underestimate the ingenuity of fools!"

                              – pibano
                              Jan 3 '17 at 2:02






                            • 1





                              Not only would I have upvoted both the Q&A anyway, as they're great, but you sealed the deal with "dickety six". Well done, @Kevin.

                              – erekalper
                              Feb 2 '18 at 15:58
















                            545





                            +750









                            The simplest way to accomplish this would be to put the input method in a while loop. Use continue when you get bad input, and break out of the loop when you're satisfied.



                            When Your Input Might Raise an Exception



                            Use try and catch to detect when the user enters data that can't be parsed.



                            while True:
                            try:
                            # Note: Python 2.x users should use raw_input, the equivalent of 3.x's input
                            age = int(input("Please enter your age: "))
                            except ValueError:
                            print("Sorry, I didn't understand that.")
                            #better try again... Return to the start of the loop
                            continue
                            else:
                            #age was successfully parsed!
                            #we're ready to exit the loop.
                            break
                            if age >= 18:
                            print("You are able to vote in the United States!")
                            else:
                            print("You are not able to vote in the United States.")


                            Implementing Your Own Validation Rules



                            If you want to reject values that Python can successfully parse, you can add your own validation logic.



                            while True:
                            data = input("Please enter a loud message (must be all caps): ")
                            if not data.isupper():
                            print("Sorry, your response was not loud enough.")
                            continue
                            else:
                            #we're happy with the value given.
                            #we're ready to exit the loop.
                            break

                            while True:
                            data = input("Pick an answer from A to D:")
                            if data.lower() not in ('a', 'b', 'c', 'd'):
                            print("Not an appropriate choice.")
                            else:
                            break


                            Combining Exception Handling and Custom Validation



                            Both of the above techniques can be combined into one loop.



                            while True:
                            try:
                            age = int(input("Please enter your age: "))
                            except ValueError:
                            print("Sorry, I didn't understand that.")
                            continue

                            if age < 0:
                            print("Sorry, your response must not be negative.")
                            continue
                            else:
                            #age was successfully parsed, and we're happy with its value.
                            #we're ready to exit the loop.
                            break
                            if age >= 18:
                            print("You are able to vote in the United States!")
                            else:
                            print("You are not able to vote in the United States.")


                            Encapsulating it All in a Function



                            If you need to ask your user for a lot of different values, it might be useful to put this code in a function, so you don't have to retype it every time.



                            def get_non_negative_int(prompt):
                            while True:
                            try:
                            value = int(input(prompt))
                            except ValueError:
                            print("Sorry, I didn't understand that.")
                            continue

                            if value < 0:
                            print("Sorry, your response must not be negative.")
                            continue
                            else:
                            break
                            return value

                            age = get_non_negative_int("Please enter your age: ")
                            kids = get_non_negative_int("Please enter the number of children you have: ")
                            salary = get_non_negative_int("Please enter your yearly earnings, in dollars: ")


                            Putting It All Together



                            You can extend this idea to make a very generic input function:



                            def sanitised_input(prompt, type_=None, min_=None, max_=None, range_=None):
                            if min_ is not None and max_ is not None and max_ < min_:
                            raise ValueError("min_ must be less than or equal to max_.")
                            while True:
                            ui = input(prompt)
                            if type_ is not None:
                            try:
                            ui = type_(ui)
                            except ValueError:
                            print("Input type must be {0}.".format(type_.__name__))
                            continue
                            if max_ is not None and ui > max_:
                            print("Input must be less than or equal to {0}.".format(max_))
                            elif min_ is not None and ui < min_:
                            print("Input must be greater than or equal to {0}.".format(min_))
                            elif range_ is not None and ui not in range_:
                            if isinstance(range_, range):
                            template = "Input must be between {0.start} and {0.stop}."
                            print(template.format(range_))
                            else:
                            template = "Input must be {0}."
                            if len(range_) == 1:
                            print(template.format(*range_))
                            else:
                            print(template.format(" or ".join((", ".join(map(str,
                            range_[:-1])),
                            str(range_[-1])))))
                            else:
                            return ui


                            With usage such as:



                            age = sanitised_input("Enter your age: ", int, 1, 101)
                            answer = sanitised_input("Enter your answer: ", str.lower, range_=('a', 'b', 'c', 'd'))


                            Common Pitfalls, and Why you Should Avoid Them



                            The Redundant Use of Redundant input Statements



                            This method works but is generally considered poor style:



                            data = input("Please enter a loud message (must be all caps): ")
                            while not data.isupper():
                            print("Sorry, your response was not loud enough.")
                            data = input("Please enter a loud message (must be all caps): ")


                            It might look attractive initially because it's shorter than the while True method, but it violates the Don't Repeat Yourself principle of software development. This increases the likelihood of bugs in your system. What if you want to backport to 2.7 by changing input to raw_input, but accidentally change only the first input above? It's a SyntaxError just waiting to happen.



                            Recursion Will Blow Your Stack



                            If you've just learned about recursion, you might be tempted to use it in get_non_negative_int so you can dispose of the while loop.



                            def get_non_negative_int(prompt):
                            try:
                            value = int(input(prompt))
                            except ValueError:
                            print("Sorry, I didn't understand that.")
                            return get_non_negative_int(prompt)

                            if value < 0:
                            print("Sorry, your response must not be negative.")
                            return get_non_negative_int(prompt)
                            else:
                            return value


                            This appears to work fine most of the time, but if the user enters invalid data enough times, the script will terminate with a RuntimeError: maximum recursion depth exceeded. You may think "no fool would make 1000 mistakes in a row", but you're underestimating the ingenuity of fools!






                            share|improve this answer





















                            • 30





                              Its fun reading it with many examples, kudos. Underrated lesson: "Don't underestimate the ingenuity of fools!"

                              – pibano
                              Jan 3 '17 at 2:02






                            • 1





                              Not only would I have upvoted both the Q&A anyway, as they're great, but you sealed the deal with "dickety six". Well done, @Kevin.

                              – erekalper
                              Feb 2 '18 at 15:58














                            545





                            +750







                            545





                            +750



                            545




                            +750





                            The simplest way to accomplish this would be to put the input method in a while loop. Use continue when you get bad input, and break out of the loop when you're satisfied.



                            When Your Input Might Raise an Exception



                            Use try and catch to detect when the user enters data that can't be parsed.



                            while True:
                            try:
                            # Note: Python 2.x users should use raw_input, the equivalent of 3.x's input
                            age = int(input("Please enter your age: "))
                            except ValueError:
                            print("Sorry, I didn't understand that.")
                            #better try again... Return to the start of the loop
                            continue
                            else:
                            #age was successfully parsed!
                            #we're ready to exit the loop.
                            break
                            if age >= 18:
                            print("You are able to vote in the United States!")
                            else:
                            print("You are not able to vote in the United States.")


                            Implementing Your Own Validation Rules



                            If you want to reject values that Python can successfully parse, you can add your own validation logic.



                            while True:
                            data = input("Please enter a loud message (must be all caps): ")
                            if not data.isupper():
                            print("Sorry, your response was not loud enough.")
                            continue
                            else:
                            #we're happy with the value given.
                            #we're ready to exit the loop.
                            break

                            while True:
                            data = input("Pick an answer from A to D:")
                            if data.lower() not in ('a', 'b', 'c', 'd'):
                            print("Not an appropriate choice.")
                            else:
                            break


                            Combining Exception Handling and Custom Validation



                            Both of the above techniques can be combined into one loop.



                            while True:
                            try:
                            age = int(input("Please enter your age: "))
                            except ValueError:
                            print("Sorry, I didn't understand that.")
                            continue

                            if age < 0:
                            print("Sorry, your response must not be negative.")
                            continue
                            else:
                            #age was successfully parsed, and we're happy with its value.
                            #we're ready to exit the loop.
                            break
                            if age >= 18:
                            print("You are able to vote in the United States!")
                            else:
                            print("You are not able to vote in the United States.")


                            Encapsulating it All in a Function



                            If you need to ask your user for a lot of different values, it might be useful to put this code in a function, so you don't have to retype it every time.



                            def get_non_negative_int(prompt):
                            while True:
                            try:
                            value = int(input(prompt))
                            except ValueError:
                            print("Sorry, I didn't understand that.")
                            continue

                            if value < 0:
                            print("Sorry, your response must not be negative.")
                            continue
                            else:
                            break
                            return value

                            age = get_non_negative_int("Please enter your age: ")
                            kids = get_non_negative_int("Please enter the number of children you have: ")
                            salary = get_non_negative_int("Please enter your yearly earnings, in dollars: ")


                            Putting It All Together



                            You can extend this idea to make a very generic input function:



                            def sanitised_input(prompt, type_=None, min_=None, max_=None, range_=None):
                            if min_ is not None and max_ is not None and max_ < min_:
                            raise ValueError("min_ must be less than or equal to max_.")
                            while True:
                            ui = input(prompt)
                            if type_ is not None:
                            try:
                            ui = type_(ui)
                            except ValueError:
                            print("Input type must be {0}.".format(type_.__name__))
                            continue
                            if max_ is not None and ui > max_:
                            print("Input must be less than or equal to {0}.".format(max_))
                            elif min_ is not None and ui < min_:
                            print("Input must be greater than or equal to {0}.".format(min_))
                            elif range_ is not None and ui not in range_:
                            if isinstance(range_, range):
                            template = "Input must be between {0.start} and {0.stop}."
                            print(template.format(range_))
                            else:
                            template = "Input must be {0}."
                            if len(range_) == 1:
                            print(template.format(*range_))
                            else:
                            print(template.format(" or ".join((", ".join(map(str,
                            range_[:-1])),
                            str(range_[-1])))))
                            else:
                            return ui


                            With usage such as:



                            age = sanitised_input("Enter your age: ", int, 1, 101)
                            answer = sanitised_input("Enter your answer: ", str.lower, range_=('a', 'b', 'c', 'd'))


                            Common Pitfalls, and Why you Should Avoid Them



                            The Redundant Use of Redundant input Statements



                            This method works but is generally considered poor style:



                            data = input("Please enter a loud message (must be all caps): ")
                            while not data.isupper():
                            print("Sorry, your response was not loud enough.")
                            data = input("Please enter a loud message (must be all caps): ")


                            It might look attractive initially because it's shorter than the while True method, but it violates the Don't Repeat Yourself principle of software development. This increases the likelihood of bugs in your system. What if you want to backport to 2.7 by changing input to raw_input, but accidentally change only the first input above? It's a SyntaxError just waiting to happen.



                            Recursion Will Blow Your Stack



                            If you've just learned about recursion, you might be tempted to use it in get_non_negative_int so you can dispose of the while loop.



                            def get_non_negative_int(prompt):
                            try:
                            value = int(input(prompt))
                            except ValueError:
                            print("Sorry, I didn't understand that.")
                            return get_non_negative_int(prompt)

                            if value < 0:
                            print("Sorry, your response must not be negative.")
                            return get_non_negative_int(prompt)
                            else:
                            return value


                            This appears to work fine most of the time, but if the user enters invalid data enough times, the script will terminate with a RuntimeError: maximum recursion depth exceeded. You may think "no fool would make 1000 mistakes in a row", but you're underestimating the ingenuity of fools!






                            share|improve this answer















                            The simplest way to accomplish this would be to put the input method in a while loop. Use continue when you get bad input, and break out of the loop when you're satisfied.



                            When Your Input Might Raise an Exception



                            Use try and catch to detect when the user enters data that can't be parsed.



                            while True:
                            try:
                            # Note: Python 2.x users should use raw_input, the equivalent of 3.x's input
                            age = int(input("Please enter your age: "))
                            except ValueError:
                            print("Sorry, I didn't understand that.")
                            #better try again... Return to the start of the loop
                            continue
                            else:
                            #age was successfully parsed!
                            #we're ready to exit the loop.
                            break
                            if age >= 18:
                            print("You are able to vote in the United States!")
                            else:
                            print("You are not able to vote in the United States.")


                            Implementing Your Own Validation Rules



                            If you want to reject values that Python can successfully parse, you can add your own validation logic.



                            while True:
                            data = input("Please enter a loud message (must be all caps): ")
                            if not data.isupper():
                            print("Sorry, your response was not loud enough.")
                            continue
                            else:
                            #we're happy with the value given.
                            #we're ready to exit the loop.
                            break

                            while True:
                            data = input("Pick an answer from A to D:")
                            if data.lower() not in ('a', 'b', 'c', 'd'):
                            print("Not an appropriate choice.")
                            else:
                            break


                            Combining Exception Handling and Custom Validation



                            Both of the above techniques can be combined into one loop.



                            while True:
                            try:
                            age = int(input("Please enter your age: "))
                            except ValueError:
                            print("Sorry, I didn't understand that.")
                            continue

                            if age < 0:
                            print("Sorry, your response must not be negative.")
                            continue
                            else:
                            #age was successfully parsed, and we're happy with its value.
                            #we're ready to exit the loop.
                            break
                            if age >= 18:
                            print("You are able to vote in the United States!")
                            else:
                            print("You are not able to vote in the United States.")


                            Encapsulating it All in a Function



                            If you need to ask your user for a lot of different values, it might be useful to put this code in a function, so you don't have to retype it every time.



                            def get_non_negative_int(prompt):
                            while True:
                            try:
                            value = int(input(prompt))
                            except ValueError:
                            print("Sorry, I didn't understand that.")
                            continue

                            if value < 0:
                            print("Sorry, your response must not be negative.")
                            continue
                            else:
                            break
                            return value

                            age = get_non_negative_int("Please enter your age: ")
                            kids = get_non_negative_int("Please enter the number of children you have: ")
                            salary = get_non_negative_int("Please enter your yearly earnings, in dollars: ")


                            Putting It All Together



                            You can extend this idea to make a very generic input function:



                            def sanitised_input(prompt, type_=None, min_=None, max_=None, range_=None):
                            if min_ is not None and max_ is not None and max_ < min_:
                            raise ValueError("min_ must be less than or equal to max_.")
                            while True:
                            ui = input(prompt)
                            if type_ is not None:
                            try:
                            ui = type_(ui)
                            except ValueError:
                            print("Input type must be {0}.".format(type_.__name__))
                            continue
                            if max_ is not None and ui > max_:
                            print("Input must be less than or equal to {0}.".format(max_))
                            elif min_ is not None and ui < min_:
                            print("Input must be greater than or equal to {0}.".format(min_))
                            elif range_ is not None and ui not in range_:
                            if isinstance(range_, range):
                            template = "Input must be between {0.start} and {0.stop}."
                            print(template.format(range_))
                            else:
                            template = "Input must be {0}."
                            if len(range_) == 1:
                            print(template.format(*range_))
                            else:
                            print(template.format(" or ".join((", ".join(map(str,
                            range_[:-1])),
                            str(range_[-1])))))
                            else:
                            return ui


                            With usage such as:



                            age = sanitised_input("Enter your age: ", int, 1, 101)
                            answer = sanitised_input("Enter your answer: ", str.lower, range_=('a', 'b', 'c', 'd'))


                            Common Pitfalls, and Why you Should Avoid Them



                            The Redundant Use of Redundant input Statements



                            This method works but is generally considered poor style:



                            data = input("Please enter a loud message (must be all caps): ")
                            while not data.isupper():
                            print("Sorry, your response was not loud enough.")
                            data = input("Please enter a loud message (must be all caps): ")


                            It might look attractive initially because it's shorter than the while True method, but it violates the Don't Repeat Yourself principle of software development. This increases the likelihood of bugs in your system. What if you want to backport to 2.7 by changing input to raw_input, but accidentally change only the first input above? It's a SyntaxError just waiting to happen.



                            Recursion Will Blow Your Stack



                            If you've just learned about recursion, you might be tempted to use it in get_non_negative_int so you can dispose of the while loop.



                            def get_non_negative_int(prompt):
                            try:
                            value = int(input(prompt))
                            except ValueError:
                            print("Sorry, I didn't understand that.")
                            return get_non_negative_int(prompt)

                            if value < 0:
                            print("Sorry, your response must not be negative.")
                            return get_non_negative_int(prompt)
                            else:
                            return value


                            This appears to work fine most of the time, but if the user enters invalid data enough times, the script will terminate with a RuntimeError: maximum recursion depth exceeded. You may think "no fool would make 1000 mistakes in a row", but you're underestimating the ingenuity of fools!







                            share|improve this answer














                            share|improve this answer



                            share|improve this answer








                            edited Mar 15 '18 at 17:37


























                            community wiki





                            6 revs, 4 users 75%
                            Kevin









                            • 30





                              Its fun reading it with many examples, kudos. Underrated lesson: "Don't underestimate the ingenuity of fools!"

                              – pibano
                              Jan 3 '17 at 2:02






                            • 1





                              Not only would I have upvoted both the Q&A anyway, as they're great, but you sealed the deal with "dickety six". Well done, @Kevin.

                              – erekalper
                              Feb 2 '18 at 15:58














                            • 30





                              Its fun reading it with many examples, kudos. Underrated lesson: "Don't underestimate the ingenuity of fools!"

                              – pibano
                              Jan 3 '17 at 2:02






                            • 1





                              Not only would I have upvoted both the Q&A anyway, as they're great, but you sealed the deal with "dickety six". Well done, @Kevin.

                              – erekalper
                              Feb 2 '18 at 15:58








                            30




                            30





                            Its fun reading it with many examples, kudos. Underrated lesson: "Don't underestimate the ingenuity of fools!"

                            – pibano
                            Jan 3 '17 at 2:02





                            Its fun reading it with many examples, kudos. Underrated lesson: "Don't underestimate the ingenuity of fools!"

                            – pibano
                            Jan 3 '17 at 2:02




                            1




                            1





                            Not only would I have upvoted both the Q&A anyway, as they're great, but you sealed the deal with "dickety six". Well done, @Kevin.

                            – erekalper
                            Feb 2 '18 at 15:58





                            Not only would I have upvoted both the Q&A anyway, as they're great, but you sealed the deal with "dickety six". Well done, @Kevin.

                            – erekalper
                            Feb 2 '18 at 15:58













                            28














                            Why would you do a while True and then break out of this loop while you can also just put your requirements in the while statement since all you want is to stop once you have the age?



                            age = None
                            while age is None:
                            input_value = input("Please enter your age: ")
                            try:
                            # try and convert the string input to a number
                            age = int(input_value)
                            except ValueError:
                            # tell the user off
                            print("{input} is not a number, please enter a number only".format(input=input_value))
                            if age >= 18:
                            print("You are able to vote in the United States!")
                            else:
                            print("You are not able to vote in the United States.")


                            This would result in the following:



                            Please enter your age: *potato*
                            potato is not a number, please enter a number only
                            Please enter your age: *5*
                            You are not able to vote in the United States.


                            this will work since age will never have a value that will not make sense and the code follows the logic of your "business process"






                            share|improve this answer






























                              28














                              Why would you do a while True and then break out of this loop while you can also just put your requirements in the while statement since all you want is to stop once you have the age?



                              age = None
                              while age is None:
                              input_value = input("Please enter your age: ")
                              try:
                              # try and convert the string input to a number
                              age = int(input_value)
                              except ValueError:
                              # tell the user off
                              print("{input} is not a number, please enter a number only".format(input=input_value))
                              if age >= 18:
                              print("You are able to vote in the United States!")
                              else:
                              print("You are not able to vote in the United States.")


                              This would result in the following:



                              Please enter your age: *potato*
                              potato is not a number, please enter a number only
                              Please enter your age: *5*
                              You are not able to vote in the United States.


                              this will work since age will never have a value that will not make sense and the code follows the logic of your "business process"






                              share|improve this answer




























                                28












                                28








                                28







                                Why would you do a while True and then break out of this loop while you can also just put your requirements in the while statement since all you want is to stop once you have the age?



                                age = None
                                while age is None:
                                input_value = input("Please enter your age: ")
                                try:
                                # try and convert the string input to a number
                                age = int(input_value)
                                except ValueError:
                                # tell the user off
                                print("{input} is not a number, please enter a number only".format(input=input_value))
                                if age >= 18:
                                print("You are able to vote in the United States!")
                                else:
                                print("You are not able to vote in the United States.")


                                This would result in the following:



                                Please enter your age: *potato*
                                potato is not a number, please enter a number only
                                Please enter your age: *5*
                                You are not able to vote in the United States.


                                this will work since age will never have a value that will not make sense and the code follows the logic of your "business process"






                                share|improve this answer















                                Why would you do a while True and then break out of this loop while you can also just put your requirements in the while statement since all you want is to stop once you have the age?



                                age = None
                                while age is None:
                                input_value = input("Please enter your age: ")
                                try:
                                # try and convert the string input to a number
                                age = int(input_value)
                                except ValueError:
                                # tell the user off
                                print("{input} is not a number, please enter a number only".format(input=input_value))
                                if age >= 18:
                                print("You are able to vote in the United States!")
                                else:
                                print("You are not able to vote in the United States.")


                                This would result in the following:



                                Please enter your age: *potato*
                                potato is not a number, please enter a number only
                                Please enter your age: *5*
                                You are not able to vote in the United States.


                                this will work since age will never have a value that will not make sense and the code follows the logic of your "business process"







                                share|improve this answer














                                share|improve this answer



                                share|improve this answer








                                edited Feb 24 '18 at 16:44


























                                community wiki





                                2 revs, 2 users 96%
                                Steven Stip
























                                    20














                                    Though the accepted answer is amazing. I would also like to share a quick hack for this problem. (This takes care of the negative age problem as well.)



                                    f=lambda age: (age.isdigit() and ((int(age)>=18  and "Can vote" ) or "Cannot vote")) or 
                                    f(input("invalid input. Try againnPlease enter your age: "))
                                    print(f(input("Please enter your age: ")))


                                    P.S. This code is for python 3.x.






                                    share|improve this answer





















                                    • 1





                                      Note that this code is recursive, but recursion isn't necessary here, and as Kevin said, it can blow your stack.

                                      – PM 2Ring
                                      Jan 31 '16 at 8:12






                                    • 1





                                      @PM2Ring - you are right. But my purpose here was just to show how "short circuiting" can minimise (beautify) long pieces of code.

                                      – aaveg
                                      Feb 3 '16 at 8:58






                                    • 7





                                      Why would you assign a lambda to a variable, just use def instead. def f(age): is far clearer than f = lambda age:

                                      – GP89
                                      May 16 '17 at 22:29








                                    • 2





                                      In some cases, you may need the age just once and then there is no use of that function. One may want to use a function and throw it away after the job is done. Also, this may not be the best way, but it definitely is a different way of doing it (which was the purpose of my solution).

                                      – aaveg
                                      May 16 '17 at 23:17













                                    • interesting POV!

                                      – MJM
                                      Jul 24 '18 at 10:55
















                                    20














                                    Though the accepted answer is amazing. I would also like to share a quick hack for this problem. (This takes care of the negative age problem as well.)



                                    f=lambda age: (age.isdigit() and ((int(age)>=18  and "Can vote" ) or "Cannot vote")) or 
                                    f(input("invalid input. Try againnPlease enter your age: "))
                                    print(f(input("Please enter your age: ")))


                                    P.S. This code is for python 3.x.






                                    share|improve this answer





















                                    • 1





                                      Note that this code is recursive, but recursion isn't necessary here, and as Kevin said, it can blow your stack.

                                      – PM 2Ring
                                      Jan 31 '16 at 8:12






                                    • 1





                                      @PM2Ring - you are right. But my purpose here was just to show how "short circuiting" can minimise (beautify) long pieces of code.

                                      – aaveg
                                      Feb 3 '16 at 8:58






                                    • 7





                                      Why would you assign a lambda to a variable, just use def instead. def f(age): is far clearer than f = lambda age:

                                      – GP89
                                      May 16 '17 at 22:29








                                    • 2





                                      In some cases, you may need the age just once and then there is no use of that function. One may want to use a function and throw it away after the job is done. Also, this may not be the best way, but it definitely is a different way of doing it (which was the purpose of my solution).

                                      – aaveg
                                      May 16 '17 at 23:17













                                    • interesting POV!

                                      – MJM
                                      Jul 24 '18 at 10:55














                                    20












                                    20








                                    20







                                    Though the accepted answer is amazing. I would also like to share a quick hack for this problem. (This takes care of the negative age problem as well.)



                                    f=lambda age: (age.isdigit() and ((int(age)>=18  and "Can vote" ) or "Cannot vote")) or 
                                    f(input("invalid input. Try againnPlease enter your age: "))
                                    print(f(input("Please enter your age: ")))


                                    P.S. This code is for python 3.x.






                                    share|improve this answer















                                    Though the accepted answer is amazing. I would also like to share a quick hack for this problem. (This takes care of the negative age problem as well.)



                                    f=lambda age: (age.isdigit() and ((int(age)>=18  and "Can vote" ) or "Cannot vote")) or 
                                    f(input("invalid input. Try againnPlease enter your age: "))
                                    print(f(input("Please enter your age: ")))


                                    P.S. This code is for python 3.x.







                                    share|improve this answer














                                    share|improve this answer



                                    share|improve this answer








                                    edited Dec 21 '18 at 18:25


























                                    community wiki





                                    2 revs, 2 users 78%
                                    aaveg









                                    • 1





                                      Note that this code is recursive, but recursion isn't necessary here, and as Kevin said, it can blow your stack.

                                      – PM 2Ring
                                      Jan 31 '16 at 8:12






                                    • 1





                                      @PM2Ring - you are right. But my purpose here was just to show how "short circuiting" can minimise (beautify) long pieces of code.

                                      – aaveg
                                      Feb 3 '16 at 8:58






                                    • 7





                                      Why would you assign a lambda to a variable, just use def instead. def f(age): is far clearer than f = lambda age:

                                      – GP89
                                      May 16 '17 at 22:29








                                    • 2





                                      In some cases, you may need the age just once and then there is no use of that function. One may want to use a function and throw it away after the job is done. Also, this may not be the best way, but it definitely is a different way of doing it (which was the purpose of my solution).

                                      – aaveg
                                      May 16 '17 at 23:17













                                    • interesting POV!

                                      – MJM
                                      Jul 24 '18 at 10:55














                                    • 1





                                      Note that this code is recursive, but recursion isn't necessary here, and as Kevin said, it can blow your stack.

                                      – PM 2Ring
                                      Jan 31 '16 at 8:12






                                    • 1





                                      @PM2Ring - you are right. But my purpose here was just to show how "short circuiting" can minimise (beautify) long pieces of code.

                                      – aaveg
                                      Feb 3 '16 at 8:58






                                    • 7





                                      Why would you assign a lambda to a variable, just use def instead. def f(age): is far clearer than f = lambda age:

                                      – GP89
                                      May 16 '17 at 22:29








                                    • 2





                                      In some cases, you may need the age just once and then there is no use of that function. One may want to use a function and throw it away after the job is done. Also, this may not be the best way, but it definitely is a different way of doing it (which was the purpose of my solution).

                                      – aaveg
                                      May 16 '17 at 23:17













                                    • interesting POV!

                                      – MJM
                                      Jul 24 '18 at 10:55








                                    1




                                    1





                                    Note that this code is recursive, but recursion isn't necessary here, and as Kevin said, it can blow your stack.

                                    – PM 2Ring
                                    Jan 31 '16 at 8:12





                                    Note that this code is recursive, but recursion isn't necessary here, and as Kevin said, it can blow your stack.

                                    – PM 2Ring
                                    Jan 31 '16 at 8:12




                                    1




                                    1





                                    @PM2Ring - you are right. But my purpose here was just to show how "short circuiting" can minimise (beautify) long pieces of code.

                                    – aaveg
                                    Feb 3 '16 at 8:58





                                    @PM2Ring - you are right. But my purpose here was just to show how "short circuiting" can minimise (beautify) long pieces of code.

                                    – aaveg
                                    Feb 3 '16 at 8:58




                                    7




                                    7





                                    Why would you assign a lambda to a variable, just use def instead. def f(age): is far clearer than f = lambda age:

                                    – GP89
                                    May 16 '17 at 22:29







                                    Why would you assign a lambda to a variable, just use def instead. def f(age): is far clearer than f = lambda age:

                                    – GP89
                                    May 16 '17 at 22:29






                                    2




                                    2





                                    In some cases, you may need the age just once and then there is no use of that function. One may want to use a function and throw it away after the job is done. Also, this may not be the best way, but it definitely is a different way of doing it (which was the purpose of my solution).

                                    – aaveg
                                    May 16 '17 at 23:17







                                    In some cases, you may need the age just once and then there is no use of that function. One may want to use a function and throw it away after the job is done. Also, this may not be the best way, but it definitely is a different way of doing it (which was the purpose of my solution).

                                    – aaveg
                                    May 16 '17 at 23:17















                                    interesting POV!

                                    – MJM
                                    Jul 24 '18 at 10:55





                                    interesting POV!

                                    – MJM
                                    Jul 24 '18 at 10:55











                                    9














                                    So, I was messing around with something similar to this recently, and I came up with the following solution, which uses a way of getting input that rejects junk, before it's even checked in any logical way.



                                    read_single_keypress() courtesy https://stackoverflow.com/a/6599441/4532996



                                    def read_single_keypress() -> str:
                                    """Waits for a single keypress on stdin.
                                    -- from :: https://stackoverflow.com/a/6599441/4532996
                                    """

                                    import termios, fcntl, sys, os
                                    fd = sys.stdin.fileno()
                                    # save old state
                                    flags_save = fcntl.fcntl(fd, fcntl.F_GETFL)
                                    attrs_save = termios.tcgetattr(fd)
                                    # make raw - the way to do this comes from the termios(3) man page.
                                    attrs = list(attrs_save) # copy the stored version to update
                                    # iflag
                                    attrs[0] &= ~(termios.IGNBRK | termios.BRKINT | termios.PARMRK
                                    | termios.ISTRIP | termios.INLCR | termios. IGNCR
                                    | termios.ICRNL | termios.IXON )
                                    # oflag
                                    attrs[1] &= ~termios.OPOST
                                    # cflag
                                    attrs[2] &= ~(termios.CSIZE | termios. PARENB)
                                    attrs[2] |= termios.CS8
                                    # lflag
                                    attrs[3] &= ~(termios.ECHONL | termios.ECHO | termios.ICANON
                                    | termios.ISIG | termios.IEXTEN)
                                    termios.tcsetattr(fd, termios.TCSANOW, attrs)
                                    # turn off non-blocking
                                    fcntl.fcntl(fd, fcntl.F_SETFL, flags_save & ~os.O_NONBLOCK)
                                    # read a single keystroke
                                    try:
                                    ret = sys.stdin.read(1) # returns a single character
                                    except KeyboardInterrupt:
                                    ret = 0
                                    finally:
                                    # restore old state
                                    termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save)
                                    fcntl.fcntl(fd, fcntl.F_SETFL, flags_save)
                                    return ret

                                    def until_not_multi(chars) -> str:
                                    """read stdin until !(chars)"""
                                    import sys
                                    chars = list(chars)
                                    y = ""
                                    sys.stdout.flush()
                                    while True:
                                    i = read_single_keypress()
                                    _ = sys.stdout.write(i)
                                    sys.stdout.flush()
                                    if i not in chars:
                                    break
                                    y += i
                                    return y

                                    def _can_you_vote() -> str:
                                    """a practical example:
                                    test if a user can vote based purely on keypresses"""
                                    print("can you vote? age : ", end="")
                                    x = int("0" + until_not_multi("0123456789"))
                                    if not x:
                                    print("nsorry, age can only consist of digits.")
                                    return
                                    print("your age is", x, "nYou can vote!" if x >= 18 else "Sorry! you can't vote")

                                    _can_you_vote()


                                    You can find the complete module here.



                                    Example:



                                    $ ./input_constrain.py
                                    can you vote? age : a
                                    sorry, age can only consist of digits.
                                    $ ./input_constrain.py
                                    can you vote? age : 23<RETURN>
                                    your age is 23
                                    You can vote!
                                    $ _


                                    Note that the nature of this implementation is it closes stdin as soon as something that isn't a digit is read. I didn't hit enter after a, but I needed to after the numbers.



                                    You could merge this with the thismany() function in the same module to only allow, say, three digits.






                                    share|improve this answer






























                                      9














                                      So, I was messing around with something similar to this recently, and I came up with the following solution, which uses a way of getting input that rejects junk, before it's even checked in any logical way.



                                      read_single_keypress() courtesy https://stackoverflow.com/a/6599441/4532996



                                      def read_single_keypress() -> str:
                                      """Waits for a single keypress on stdin.
                                      -- from :: https://stackoverflow.com/a/6599441/4532996
                                      """

                                      import termios, fcntl, sys, os
                                      fd = sys.stdin.fileno()
                                      # save old state
                                      flags_save = fcntl.fcntl(fd, fcntl.F_GETFL)
                                      attrs_save = termios.tcgetattr(fd)
                                      # make raw - the way to do this comes from the termios(3) man page.
                                      attrs = list(attrs_save) # copy the stored version to update
                                      # iflag
                                      attrs[0] &= ~(termios.IGNBRK | termios.BRKINT | termios.PARMRK
                                      | termios.ISTRIP | termios.INLCR | termios. IGNCR
                                      | termios.ICRNL | termios.IXON )
                                      # oflag
                                      attrs[1] &= ~termios.OPOST
                                      # cflag
                                      attrs[2] &= ~(termios.CSIZE | termios. PARENB)
                                      attrs[2] |= termios.CS8
                                      # lflag
                                      attrs[3] &= ~(termios.ECHONL | termios.ECHO | termios.ICANON
                                      | termios.ISIG | termios.IEXTEN)
                                      termios.tcsetattr(fd, termios.TCSANOW, attrs)
                                      # turn off non-blocking
                                      fcntl.fcntl(fd, fcntl.F_SETFL, flags_save & ~os.O_NONBLOCK)
                                      # read a single keystroke
                                      try:
                                      ret = sys.stdin.read(1) # returns a single character
                                      except KeyboardInterrupt:
                                      ret = 0
                                      finally:
                                      # restore old state
                                      termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save)
                                      fcntl.fcntl(fd, fcntl.F_SETFL, flags_save)
                                      return ret

                                      def until_not_multi(chars) -> str:
                                      """read stdin until !(chars)"""
                                      import sys
                                      chars = list(chars)
                                      y = ""
                                      sys.stdout.flush()
                                      while True:
                                      i = read_single_keypress()
                                      _ = sys.stdout.write(i)
                                      sys.stdout.flush()
                                      if i not in chars:
                                      break
                                      y += i
                                      return y

                                      def _can_you_vote() -> str:
                                      """a practical example:
                                      test if a user can vote based purely on keypresses"""
                                      print("can you vote? age : ", end="")
                                      x = int("0" + until_not_multi("0123456789"))
                                      if not x:
                                      print("nsorry, age can only consist of digits.")
                                      return
                                      print("your age is", x, "nYou can vote!" if x >= 18 else "Sorry! you can't vote")

                                      _can_you_vote()


                                      You can find the complete module here.



                                      Example:



                                      $ ./input_constrain.py
                                      can you vote? age : a
                                      sorry, age can only consist of digits.
                                      $ ./input_constrain.py
                                      can you vote? age : 23<RETURN>
                                      your age is 23
                                      You can vote!
                                      $ _


                                      Note that the nature of this implementation is it closes stdin as soon as something that isn't a digit is read. I didn't hit enter after a, but I needed to after the numbers.



                                      You could merge this with the thismany() function in the same module to only allow, say, three digits.






                                      share|improve this answer




























                                        9












                                        9








                                        9







                                        So, I was messing around with something similar to this recently, and I came up with the following solution, which uses a way of getting input that rejects junk, before it's even checked in any logical way.



                                        read_single_keypress() courtesy https://stackoverflow.com/a/6599441/4532996



                                        def read_single_keypress() -> str:
                                        """Waits for a single keypress on stdin.
                                        -- from :: https://stackoverflow.com/a/6599441/4532996
                                        """

                                        import termios, fcntl, sys, os
                                        fd = sys.stdin.fileno()
                                        # save old state
                                        flags_save = fcntl.fcntl(fd, fcntl.F_GETFL)
                                        attrs_save = termios.tcgetattr(fd)
                                        # make raw - the way to do this comes from the termios(3) man page.
                                        attrs = list(attrs_save) # copy the stored version to update
                                        # iflag
                                        attrs[0] &= ~(termios.IGNBRK | termios.BRKINT | termios.PARMRK
                                        | termios.ISTRIP | termios.INLCR | termios. IGNCR
                                        | termios.ICRNL | termios.IXON )
                                        # oflag
                                        attrs[1] &= ~termios.OPOST
                                        # cflag
                                        attrs[2] &= ~(termios.CSIZE | termios. PARENB)
                                        attrs[2] |= termios.CS8
                                        # lflag
                                        attrs[3] &= ~(termios.ECHONL | termios.ECHO | termios.ICANON
                                        | termios.ISIG | termios.IEXTEN)
                                        termios.tcsetattr(fd, termios.TCSANOW, attrs)
                                        # turn off non-blocking
                                        fcntl.fcntl(fd, fcntl.F_SETFL, flags_save & ~os.O_NONBLOCK)
                                        # read a single keystroke
                                        try:
                                        ret = sys.stdin.read(1) # returns a single character
                                        except KeyboardInterrupt:
                                        ret = 0
                                        finally:
                                        # restore old state
                                        termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save)
                                        fcntl.fcntl(fd, fcntl.F_SETFL, flags_save)
                                        return ret

                                        def until_not_multi(chars) -> str:
                                        """read stdin until !(chars)"""
                                        import sys
                                        chars = list(chars)
                                        y = ""
                                        sys.stdout.flush()
                                        while True:
                                        i = read_single_keypress()
                                        _ = sys.stdout.write(i)
                                        sys.stdout.flush()
                                        if i not in chars:
                                        break
                                        y += i
                                        return y

                                        def _can_you_vote() -> str:
                                        """a practical example:
                                        test if a user can vote based purely on keypresses"""
                                        print("can you vote? age : ", end="")
                                        x = int("0" + until_not_multi("0123456789"))
                                        if not x:
                                        print("nsorry, age can only consist of digits.")
                                        return
                                        print("your age is", x, "nYou can vote!" if x >= 18 else "Sorry! you can't vote")

                                        _can_you_vote()


                                        You can find the complete module here.



                                        Example:



                                        $ ./input_constrain.py
                                        can you vote? age : a
                                        sorry, age can only consist of digits.
                                        $ ./input_constrain.py
                                        can you vote? age : 23<RETURN>
                                        your age is 23
                                        You can vote!
                                        $ _


                                        Note that the nature of this implementation is it closes stdin as soon as something that isn't a digit is read. I didn't hit enter after a, but I needed to after the numbers.



                                        You could merge this with the thismany() function in the same module to only allow, say, three digits.






                                        share|improve this answer















                                        So, I was messing around with something similar to this recently, and I came up with the following solution, which uses a way of getting input that rejects junk, before it's even checked in any logical way.



                                        read_single_keypress() courtesy https://stackoverflow.com/a/6599441/4532996



                                        def read_single_keypress() -> str:
                                        """Waits for a single keypress on stdin.
                                        -- from :: https://stackoverflow.com/a/6599441/4532996
                                        """

                                        import termios, fcntl, sys, os
                                        fd = sys.stdin.fileno()
                                        # save old state
                                        flags_save = fcntl.fcntl(fd, fcntl.F_GETFL)
                                        attrs_save = termios.tcgetattr(fd)
                                        # make raw - the way to do this comes from the termios(3) man page.
                                        attrs = list(attrs_save) # copy the stored version to update
                                        # iflag
                                        attrs[0] &= ~(termios.IGNBRK | termios.BRKINT | termios.PARMRK
                                        | termios.ISTRIP | termios.INLCR | termios. IGNCR
                                        | termios.ICRNL | termios.IXON )
                                        # oflag
                                        attrs[1] &= ~termios.OPOST
                                        # cflag
                                        attrs[2] &= ~(termios.CSIZE | termios. PARENB)
                                        attrs[2] |= termios.CS8
                                        # lflag
                                        attrs[3] &= ~(termios.ECHONL | termios.ECHO | termios.ICANON
                                        | termios.ISIG | termios.IEXTEN)
                                        termios.tcsetattr(fd, termios.TCSANOW, attrs)
                                        # turn off non-blocking
                                        fcntl.fcntl(fd, fcntl.F_SETFL, flags_save & ~os.O_NONBLOCK)
                                        # read a single keystroke
                                        try:
                                        ret = sys.stdin.read(1) # returns a single character
                                        except KeyboardInterrupt:
                                        ret = 0
                                        finally:
                                        # restore old state
                                        termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save)
                                        fcntl.fcntl(fd, fcntl.F_SETFL, flags_save)
                                        return ret

                                        def until_not_multi(chars) -> str:
                                        """read stdin until !(chars)"""
                                        import sys
                                        chars = list(chars)
                                        y = ""
                                        sys.stdout.flush()
                                        while True:
                                        i = read_single_keypress()
                                        _ = sys.stdout.write(i)
                                        sys.stdout.flush()
                                        if i not in chars:
                                        break
                                        y += i
                                        return y

                                        def _can_you_vote() -> str:
                                        """a practical example:
                                        test if a user can vote based purely on keypresses"""
                                        print("can you vote? age : ", end="")
                                        x = int("0" + until_not_multi("0123456789"))
                                        if not x:
                                        print("nsorry, age can only consist of digits.")
                                        return
                                        print("your age is", x, "nYou can vote!" if x >= 18 else "Sorry! you can't vote")

                                        _can_you_vote()


                                        You can find the complete module here.



                                        Example:



                                        $ ./input_constrain.py
                                        can you vote? age : a
                                        sorry, age can only consist of digits.
                                        $ ./input_constrain.py
                                        can you vote? age : 23<RETURN>
                                        your age is 23
                                        You can vote!
                                        $ _


                                        Note that the nature of this implementation is it closes stdin as soon as something that isn't a digit is read. I didn't hit enter after a, but I needed to after the numbers.



                                        You could merge this with the thismany() function in the same module to only allow, say, three digits.







                                        share|improve this answer














                                        share|improve this answer



                                        share|improve this answer








                                        edited May 23 '17 at 12:34


























                                        community wiki





                                        3 revs
                                        cat
























                                            3














                                            def validate_age(age):
                                            if age >=0 :
                                            return True
                                            return False

                                            while True:
                                            try:
                                            age = int(raw_input("Please enter your age:"))
                                            if validate_age(age): break
                                            except ValueError:
                                            print "Error: Invalid age."





                                            share|improve this answer






























                                              3














                                              def validate_age(age):
                                              if age >=0 :
                                              return True
                                              return False

                                              while True:
                                              try:
                                              age = int(raw_input("Please enter your age:"))
                                              if validate_age(age): break
                                              except ValueError:
                                              print "Error: Invalid age."





                                              share|improve this answer




























                                                3












                                                3








                                                3







                                                def validate_age(age):
                                                if age >=0 :
                                                return True
                                                return False

                                                while True:
                                                try:
                                                age = int(raw_input("Please enter your age:"))
                                                if validate_age(age): break
                                                except ValueError:
                                                print "Error: Invalid age."





                                                share|improve this answer















                                                def validate_age(age):
                                                if age >=0 :
                                                return True
                                                return False

                                                while True:
                                                try:
                                                age = int(raw_input("Please enter your age:"))
                                                if validate_age(age): break
                                                except ValueError:
                                                print "Error: Invalid age."






                                                share|improve this answer














                                                share|improve this answer



                                                share|improve this answer








                                                answered Jun 23 '16 at 10:34


























                                                community wiki





                                                ojas mohril
























                                                    3














                                                    Try this one:-



                                                    def takeInput(required):
                                                    print 'ooo or OOO to exit'
                                                    ans = raw_input('Enter: ')

                                                    if not ans:
                                                    print "You entered nothing...!"
                                                    return takeInput(required)

                                                    ## FOR Exit ##
                                                    elif ans in ['ooo', 'OOO']:
                                                    print "Closing instance."
                                                    exit()

                                                    else:
                                                    if ans.isdigit():
                                                    current = 'int'
                                                    elif set('[~!@#$%^&*()_+{}":/']+$').intersection(ans):
                                                    current = 'other'
                                                    elif isinstance(ans,basestring):
                                                    current = 'str'
                                                    else:
                                                    current = 'none'

                                                    if required == current :
                                                    return ans
                                                    else:
                                                    return takeInput(required)

                                                    ## pass the value in which type you want [str/int/special character(as other )]
                                                    print "input: ", takeInput('str')





                                                    share|improve this answer






























                                                      3














                                                      Try this one:-



                                                      def takeInput(required):
                                                      print 'ooo or OOO to exit'
                                                      ans = raw_input('Enter: ')

                                                      if not ans:
                                                      print "You entered nothing...!"
                                                      return takeInput(required)

                                                      ## FOR Exit ##
                                                      elif ans in ['ooo', 'OOO']:
                                                      print "Closing instance."
                                                      exit()

                                                      else:
                                                      if ans.isdigit():
                                                      current = 'int'
                                                      elif set('[~!@#$%^&*()_+{}":/']+$').intersection(ans):
                                                      current = 'other'
                                                      elif isinstance(ans,basestring):
                                                      current = 'str'
                                                      else:
                                                      current = 'none'

                                                      if required == current :
                                                      return ans
                                                      else:
                                                      return takeInput(required)

                                                      ## pass the value in which type you want [str/int/special character(as other )]
                                                      print "input: ", takeInput('str')





                                                      share|improve this answer




























                                                        3












                                                        3








                                                        3







                                                        Try this one:-



                                                        def takeInput(required):
                                                        print 'ooo or OOO to exit'
                                                        ans = raw_input('Enter: ')

                                                        if not ans:
                                                        print "You entered nothing...!"
                                                        return takeInput(required)

                                                        ## FOR Exit ##
                                                        elif ans in ['ooo', 'OOO']:
                                                        print "Closing instance."
                                                        exit()

                                                        else:
                                                        if ans.isdigit():
                                                        current = 'int'
                                                        elif set('[~!@#$%^&*()_+{}":/']+$').intersection(ans):
                                                        current = 'other'
                                                        elif isinstance(ans,basestring):
                                                        current = 'str'
                                                        else:
                                                        current = 'none'

                                                        if required == current :
                                                        return ans
                                                        else:
                                                        return takeInput(required)

                                                        ## pass the value in which type you want [str/int/special character(as other )]
                                                        print "input: ", takeInput('str')





                                                        share|improve this answer















                                                        Try this one:-



                                                        def takeInput(required):
                                                        print 'ooo or OOO to exit'
                                                        ans = raw_input('Enter: ')

                                                        if not ans:
                                                        print "You entered nothing...!"
                                                        return takeInput(required)

                                                        ## FOR Exit ##
                                                        elif ans in ['ooo', 'OOO']:
                                                        print "Closing instance."
                                                        exit()

                                                        else:
                                                        if ans.isdigit():
                                                        current = 'int'
                                                        elif set('[~!@#$%^&*()_+{}":/']+$').intersection(ans):
                                                        current = 'other'
                                                        elif isinstance(ans,basestring):
                                                        current = 'str'
                                                        else:
                                                        current = 'none'

                                                        if required == current :
                                                        return ans
                                                        else:
                                                        return takeInput(required)

                                                        ## pass the value in which type you want [str/int/special character(as other )]
                                                        print "input: ", takeInput('str')






                                                        share|improve this answer














                                                        share|improve this answer



                                                        share|improve this answer








                                                        answered Apr 30 '17 at 9:29


























                                                        community wiki





                                                        Pratik Anand
























                                                            3














                                                            To edit your code and fix the error:



                                                            while True:
                                                            try:
                                                            age = int(input("Please enter your age: "))
                                                            if age >= 18:
                                                            print("You are able to vote in the United States!")
                                                            break
                                                            else:
                                                            print("You are not able to vote in the United States.")
                                                            break
                                                            except ValueError:
                                                            print("Please enter a valid response")





                                                            share|improve this answer






























                                                              3














                                                              To edit your code and fix the error:



                                                              while True:
                                                              try:
                                                              age = int(input("Please enter your age: "))
                                                              if age >= 18:
                                                              print("You are able to vote in the United States!")
                                                              break
                                                              else:
                                                              print("You are not able to vote in the United States.")
                                                              break
                                                              except ValueError:
                                                              print("Please enter a valid response")





                                                              share|improve this answer




























                                                                3












                                                                3








                                                                3







                                                                To edit your code and fix the error:



                                                                while True:
                                                                try:
                                                                age = int(input("Please enter your age: "))
                                                                if age >= 18:
                                                                print("You are able to vote in the United States!")
                                                                break
                                                                else:
                                                                print("You are not able to vote in the United States.")
                                                                break
                                                                except ValueError:
                                                                print("Please enter a valid response")





                                                                share|improve this answer















                                                                To edit your code and fix the error:



                                                                while True:
                                                                try:
                                                                age = int(input("Please enter your age: "))
                                                                if age >= 18:
                                                                print("You are able to vote in the United States!")
                                                                break
                                                                else:
                                                                print("You are not able to vote in the United States.")
                                                                break
                                                                except ValueError:
                                                                print("Please enter a valid response")






                                                                share|improve this answer














                                                                share|improve this answer



                                                                share|improve this answer








                                                                answered Aug 9 '17 at 16:19


























                                                                community wiki





                                                                whackamadoodle3000
























                                                                    1














                                                                    You can write more general logic to allow user to enter only specific number of times, as the same use-case arises in many real-world applications.



                                                                    def getValidInt(iMaxAttemps = None):
                                                                    iCount = 0
                                                                    while True:
                                                                    # exit when maximum attempt limit has expired
                                                                    if iCount != None and iCount > iMaxAttemps:
                                                                    return 0 # return as default value

                                                                    i = raw_input("Enter no")
                                                                    try:
                                                                    i = int(i)
                                                                    except ValueError as e:
                                                                    print "Enter valid int value"
                                                                    else:
                                                                    break

                                                                    return i

                                                                    age = getValidInt()
                                                                    # do whatever you want to do.





                                                                    share|improve this answer


























                                                                    • you forget to increase the iCount value after each loop

                                                                      – Hoai-Thu Vuong
                                                                      Mar 1 '17 at 8:49


















                                                                    1














                                                                    You can write more general logic to allow user to enter only specific number of times, as the same use-case arises in many real-world applications.



                                                                    def getValidInt(iMaxAttemps = None):
                                                                    iCount = 0
                                                                    while True:
                                                                    # exit when maximum attempt limit has expired
                                                                    if iCount != None and iCount > iMaxAttemps:
                                                                    return 0 # return as default value

                                                                    i = raw_input("Enter no")
                                                                    try:
                                                                    i = int(i)
                                                                    except ValueError as e:
                                                                    print "Enter valid int value"
                                                                    else:
                                                                    break

                                                                    return i

                                                                    age = getValidInt()
                                                                    # do whatever you want to do.





                                                                    share|improve this answer


























                                                                    • you forget to increase the iCount value after each loop

                                                                      – Hoai-Thu Vuong
                                                                      Mar 1 '17 at 8:49
















                                                                    1












                                                                    1








                                                                    1







                                                                    You can write more general logic to allow user to enter only specific number of times, as the same use-case arises in many real-world applications.



                                                                    def getValidInt(iMaxAttemps = None):
                                                                    iCount = 0
                                                                    while True:
                                                                    # exit when maximum attempt limit has expired
                                                                    if iCount != None and iCount > iMaxAttemps:
                                                                    return 0 # return as default value

                                                                    i = raw_input("Enter no")
                                                                    try:
                                                                    i = int(i)
                                                                    except ValueError as e:
                                                                    print "Enter valid int value"
                                                                    else:
                                                                    break

                                                                    return i

                                                                    age = getValidInt()
                                                                    # do whatever you want to do.





                                                                    share|improve this answer















                                                                    You can write more general logic to allow user to enter only specific number of times, as the same use-case arises in many real-world applications.



                                                                    def getValidInt(iMaxAttemps = None):
                                                                    iCount = 0
                                                                    while True:
                                                                    # exit when maximum attempt limit has expired
                                                                    if iCount != None and iCount > iMaxAttemps:
                                                                    return 0 # return as default value

                                                                    i = raw_input("Enter no")
                                                                    try:
                                                                    i = int(i)
                                                                    except ValueError as e:
                                                                    print "Enter valid int value"
                                                                    else:
                                                                    break

                                                                    return i

                                                                    age = getValidInt()
                                                                    # do whatever you want to do.






                                                                    share|improve this answer














                                                                    share|improve this answer



                                                                    share|improve this answer








                                                                    answered Nov 3 '16 at 7:49


























                                                                    community wiki





                                                                    Mangu Singh Rajpurohit














                                                                    • you forget to increase the iCount value after each loop

                                                                      – Hoai-Thu Vuong
                                                                      Mar 1 '17 at 8:49





















                                                                    • you forget to increase the iCount value after each loop

                                                                      – Hoai-Thu Vuong
                                                                      Mar 1 '17 at 8:49



















                                                                    you forget to increase the iCount value after each loop

                                                                    – Hoai-Thu Vuong
                                                                    Mar 1 '17 at 8:49







                                                                    you forget to increase the iCount value after each loop

                                                                    – Hoai-Thu Vuong
                                                                    Mar 1 '17 at 8:49













                                                                    1














                                                                    Use "while" statement till user enter a true value and if the input value is not a number or it's a null value skip it and try to ask again and so on.
                                                                    In example I tried to answer truly your question. If we suppose that our age is between 1 and 150 then input value accepted, else it's a wrong value.
                                                                    For terminating program, the user can use 0 key and enter it as a value.




                                                                    Note: Read comments top of code.




                                                                    # If your input value is only a number then use "Value.isdigit() == False".
                                                                    # If you need an input that is a text, you should remove "Value.isdigit() == False".
                                                                    def Input(Message):
                                                                    Value = None
                                                                    while Value == None or Value.isdigit() == False:
                                                                    try:
                                                                    Value = str(input(Message)).strip()
                                                                    except InputError:
                                                                    Value = None
                                                                    return Value

                                                                    # Example:
                                                                    age = 0
                                                                    # If we suppose that our age is between 1 and 150 then input value accepted,
                                                                    # else it's a wrong value.
                                                                    while age <=0 or age >150:
                                                                    age = int(Input("Please enter your age: "))
                                                                    # For terminating program, the user can use 0 key and enter it as an a value.
                                                                    if age == 0:
                                                                    print("Terminating ...")
                                                                    exit(0)

                                                                    if age >= 18 and age <=150:
                                                                    print("You are able to vote in the United States!")
                                                                    else:
                                                                    print("You are not able to vote in the United States.")





                                                                    share|improve this answer






























                                                                      1














                                                                      Use "while" statement till user enter a true value and if the input value is not a number or it's a null value skip it and try to ask again and so on.
                                                                      In example I tried to answer truly your question. If we suppose that our age is between 1 and 150 then input value accepted, else it's a wrong value.
                                                                      For terminating program, the user can use 0 key and enter it as a value.




                                                                      Note: Read comments top of code.




                                                                      # If your input value is only a number then use "Value.isdigit() == False".
                                                                      # If you need an input that is a text, you should remove "Value.isdigit() == False".
                                                                      def Input(Message):
                                                                      Value = None
                                                                      while Value == None or Value.isdigit() == False:
                                                                      try:
                                                                      Value = str(input(Message)).strip()
                                                                      except InputError:
                                                                      Value = None
                                                                      return Value

                                                                      # Example:
                                                                      age = 0
                                                                      # If we suppose that our age is between 1 and 150 then input value accepted,
                                                                      # else it's a wrong value.
                                                                      while age <=0 or age >150:
                                                                      age = int(Input("Please enter your age: "))
                                                                      # For terminating program, the user can use 0 key and enter it as an a value.
                                                                      if age == 0:
                                                                      print("Terminating ...")
                                                                      exit(0)

                                                                      if age >= 18 and age <=150:
                                                                      print("You are able to vote in the United States!")
                                                                      else:
                                                                      print("You are not able to vote in the United States.")





                                                                      share|improve this answer




























                                                                        1












                                                                        1








                                                                        1







                                                                        Use "while" statement till user enter a true value and if the input value is not a number or it's a null value skip it and try to ask again and so on.
                                                                        In example I tried to answer truly your question. If we suppose that our age is between 1 and 150 then input value accepted, else it's a wrong value.
                                                                        For terminating program, the user can use 0 key and enter it as a value.




                                                                        Note: Read comments top of code.




                                                                        # If your input value is only a number then use "Value.isdigit() == False".
                                                                        # If you need an input that is a text, you should remove "Value.isdigit() == False".
                                                                        def Input(Message):
                                                                        Value = None
                                                                        while Value == None or Value.isdigit() == False:
                                                                        try:
                                                                        Value = str(input(Message)).strip()
                                                                        except InputError:
                                                                        Value = None
                                                                        return Value

                                                                        # Example:
                                                                        age = 0
                                                                        # If we suppose that our age is between 1 and 150 then input value accepted,
                                                                        # else it's a wrong value.
                                                                        while age <=0 or age >150:
                                                                        age = int(Input("Please enter your age: "))
                                                                        # For terminating program, the user can use 0 key and enter it as an a value.
                                                                        if age == 0:
                                                                        print("Terminating ...")
                                                                        exit(0)

                                                                        if age >= 18 and age <=150:
                                                                        print("You are able to vote in the United States!")
                                                                        else:
                                                                        print("You are not able to vote in the United States.")





                                                                        share|improve this answer















                                                                        Use "while" statement till user enter a true value and if the input value is not a number or it's a null value skip it and try to ask again and so on.
                                                                        In example I tried to answer truly your question. If we suppose that our age is between 1 and 150 then input value accepted, else it's a wrong value.
                                                                        For terminating program, the user can use 0 key and enter it as a value.




                                                                        Note: Read comments top of code.




                                                                        # If your input value is only a number then use "Value.isdigit() == False".
                                                                        # If you need an input that is a text, you should remove "Value.isdigit() == False".
                                                                        def Input(Message):
                                                                        Value = None
                                                                        while Value == None or Value.isdigit() == False:
                                                                        try:
                                                                        Value = str(input(Message)).strip()
                                                                        except InputError:
                                                                        Value = None
                                                                        return Value

                                                                        # Example:
                                                                        age = 0
                                                                        # If we suppose that our age is between 1 and 150 then input value accepted,
                                                                        # else it's a wrong value.
                                                                        while age <=0 or age >150:
                                                                        age = int(Input("Please enter your age: "))
                                                                        # For terminating program, the user can use 0 key and enter it as an a value.
                                                                        if age == 0:
                                                                        print("Terminating ...")
                                                                        exit(0)

                                                                        if age >= 18 and age <=150:
                                                                        print("You are able to vote in the United States!")
                                                                        else:
                                                                        print("You are not able to vote in the United States.")






                                                                        share|improve this answer














                                                                        share|improve this answer



                                                                        share|improve this answer








                                                                        edited Jul 7 '18 at 9:28


























                                                                        community wiki





                                                                        5 revs
                                                                        Saeed Zahedian Abroodi
























                                                                            0














                                                                            While a try/except block will work, a much faster and cleaner way to accomplish this task would be to use str.isdigit().



                                                                            while True:
                                                                            age = input("Please enter your age: ")
                                                                            if age.isdigit():
                                                                            age = int(age)
                                                                            break
                                                                            else:
                                                                            print("Invalid number '{age}'. Try again.".format(age=age))

                                                                            if age >= 18:
                                                                            print("You are able to vote in the United States!")
                                                                            else:
                                                                            print("You are not able to vote in the United States.")





                                                                            share|improve this answer





















                                                                            • 1





                                                                              str.isnumeric is only available in Python 3 and does not return true for all valid integers. Like str.isdigit it is testing properties of the characters, and - is not a numeric character.

                                                                              – Martijn Pieters
                                                                              Jun 6 '16 at 6:50
















                                                                            0














                                                                            While a try/except block will work, a much faster and cleaner way to accomplish this task would be to use str.isdigit().



                                                                            while True:
                                                                            age = input("Please enter your age: ")
                                                                            if age.isdigit():
                                                                            age = int(age)
                                                                            break
                                                                            else:
                                                                            print("Invalid number '{age}'. Try again.".format(age=age))

                                                                            if age >= 18:
                                                                            print("You are able to vote in the United States!")
                                                                            else:
                                                                            print("You are not able to vote in the United States.")





                                                                            share|improve this answer





















                                                                            • 1





                                                                              str.isnumeric is only available in Python 3 and does not return true for all valid integers. Like str.isdigit it is testing properties of the characters, and - is not a numeric character.

                                                                              – Martijn Pieters
                                                                              Jun 6 '16 at 6:50














                                                                            0












                                                                            0








                                                                            0







                                                                            While a try/except block will work, a much faster and cleaner way to accomplish this task would be to use str.isdigit().



                                                                            while True:
                                                                            age = input("Please enter your age: ")
                                                                            if age.isdigit():
                                                                            age = int(age)
                                                                            break
                                                                            else:
                                                                            print("Invalid number '{age}'. Try again.".format(age=age))

                                                                            if age >= 18:
                                                                            print("You are able to vote in the United States!")
                                                                            else:
                                                                            print("You are not able to vote in the United States.")





                                                                            share|improve this answer















                                                                            While a try/except block will work, a much faster and cleaner way to accomplish this task would be to use str.isdigit().



                                                                            while True:
                                                                            age = input("Please enter your age: ")
                                                                            if age.isdigit():
                                                                            age = int(age)
                                                                            break
                                                                            else:
                                                                            print("Invalid number '{age}'. Try again.".format(age=age))

                                                                            if age >= 18:
                                                                            print("You are able to vote in the United States!")
                                                                            else:
                                                                            print("You are not able to vote in the United States.")






                                                                            share|improve this answer














                                                                            share|improve this answer



                                                                            share|improve this answer








                                                                            edited Jun 6 '16 at 7:15


























                                                                            community wiki





                                                                            2 revs
                                                                            2Cubed









                                                                            • 1





                                                                              str.isnumeric is only available in Python 3 and does not return true for all valid integers. Like str.isdigit it is testing properties of the characters, and - is not a numeric character.

                                                                              – Martijn Pieters
                                                                              Jun 6 '16 at 6:50














                                                                            • 1





                                                                              str.isnumeric is only available in Python 3 and does not return true for all valid integers. Like str.isdigit it is testing properties of the characters, and - is not a numeric character.

                                                                              – Martijn Pieters
                                                                              Jun 6 '16 at 6:50








                                                                            1




                                                                            1





                                                                            str.isnumeric is only available in Python 3 and does not return true for all valid integers. Like str.isdigit it is testing properties of the characters, and - is not a numeric character.

                                                                            – Martijn Pieters
                                                                            Jun 6 '16 at 6:50





                                                                            str.isnumeric is only available in Python 3 and does not return true for all valid integers. Like str.isdigit it is testing properties of the characters, and - is not a numeric character.

                                                                            – Martijn Pieters
                                                                            Jun 6 '16 at 6:50











                                                                            0














                                                                            You can make the input statement a while True loop so it repeatedly asks for the users input and then break that loop if the user enters the response you would like. And you can use try and except blocks to handle invalid responses.



                                                                            while True:

                                                                            var = True

                                                                            try:
                                                                            age = int(input("Please enter your age: "))

                                                                            except ValueError:
                                                                            print("Invalid input.")
                                                                            var = False

                                                                            if var == True:
                                                                            if age >= 18:
                                                                            print("You are able to vote in the United States.")
                                                                            break
                                                                            else:
                                                                            print("You are not able to vote in the United States.")


                                                                            The var variable is just so that if the user enters a string instead of a integer the program wont return "You are not able to vote in the United States."






                                                                            share|improve this answer






























                                                                              0














                                                                              You can make the input statement a while True loop so it repeatedly asks for the users input and then break that loop if the user enters the response you would like. And you can use try and except blocks to handle invalid responses.



                                                                              while True:

                                                                              var = True

                                                                              try:
                                                                              age = int(input("Please enter your age: "))

                                                                              except ValueError:
                                                                              print("Invalid input.")
                                                                              var = False

                                                                              if var == True:
                                                                              if age >= 18:
                                                                              print("You are able to vote in the United States.")
                                                                              break
                                                                              else:
                                                                              print("You are not able to vote in the United States.")


                                                                              The var variable is just so that if the user enters a string instead of a integer the program wont return "You are not able to vote in the United States."






                                                                              share|improve this answer




























                                                                                0












                                                                                0








                                                                                0







                                                                                You can make the input statement a while True loop so it repeatedly asks for the users input and then break that loop if the user enters the response you would like. And you can use try and except blocks to handle invalid responses.



                                                                                while True:

                                                                                var = True

                                                                                try:
                                                                                age = int(input("Please enter your age: "))

                                                                                except ValueError:
                                                                                print("Invalid input.")
                                                                                var = False

                                                                                if var == True:
                                                                                if age >= 18:
                                                                                print("You are able to vote in the United States.")
                                                                                break
                                                                                else:
                                                                                print("You are not able to vote in the United States.")


                                                                                The var variable is just so that if the user enters a string instead of a integer the program wont return "You are not able to vote in the United States."






                                                                                share|improve this answer















                                                                                You can make the input statement a while True loop so it repeatedly asks for the users input and then break that loop if the user enters the response you would like. And you can use try and except blocks to handle invalid responses.



                                                                                while True:

                                                                                var = True

                                                                                try:
                                                                                age = int(input("Please enter your age: "))

                                                                                except ValueError:
                                                                                print("Invalid input.")
                                                                                var = False

                                                                                if var == True:
                                                                                if age >= 18:
                                                                                print("You are able to vote in the United States.")
                                                                                break
                                                                                else:
                                                                                print("You are not able to vote in the United States.")


                                                                                The var variable is just so that if the user enters a string instead of a integer the program wont return "You are not able to vote in the United States."







                                                                                share|improve this answer














                                                                                share|improve this answer



                                                                                share|improve this answer








                                                                                answered Jan 3 '18 at 0:59


























                                                                                community wiki





                                                                                user9142415
























                                                                                    0














                                                                                    Use try catch with never ending while loop. To check for blank string use IF statement to check if string is empty.



                                                                                    while True:
                                                                                    name = input("Enter Your Namen")
                                                                                    if not name:
                                                                                    print("I did not understood that")
                                                                                    continue
                                                                                    else:
                                                                                    break

                                                                                    while True:
                                                                                    try:
                                                                                    salary = float(input("whats ur salaryn"))
                                                                                    except ValueError:
                                                                                    print("I did not understood that")
                                                                                    continue
                                                                                    else:
                                                                                    break

                                                                                    while True:
                                                                                    try:
                                                                                    print("whats ur age?")
                                                                                    age = int(float(input()))
                                                                                    except ValueError:
                                                                                    print("I did not understood that")
                                                                                    continue
                                                                                    else:
                                                                                    break

                                                                                    print("Hello "+ name + "nYour salary is " + str(salary) + 'nand you will be ' + str(age+1) +' in a Year')





                                                                                    share|improve this answer






























                                                                                      0














                                                                                      Use try catch with never ending while loop. To check for blank string use IF statement to check if string is empty.



                                                                                      while True:
                                                                                      name = input("Enter Your Namen")
                                                                                      if not name:
                                                                                      print("I did not understood that")
                                                                                      continue
                                                                                      else:
                                                                                      break

                                                                                      while True:
                                                                                      try:
                                                                                      salary = float(input("whats ur salaryn"))
                                                                                      except ValueError:
                                                                                      print("I did not understood that")
                                                                                      continue
                                                                                      else:
                                                                                      break

                                                                                      while True:
                                                                                      try:
                                                                                      print("whats ur age?")
                                                                                      age = int(float(input()))
                                                                                      except ValueError:
                                                                                      print("I did not understood that")
                                                                                      continue
                                                                                      else:
                                                                                      break

                                                                                      print("Hello "+ name + "nYour salary is " + str(salary) + 'nand you will be ' + str(age+1) +' in a Year')





                                                                                      share|improve this answer




























                                                                                        0












                                                                                        0








                                                                                        0







                                                                                        Use try catch with never ending while loop. To check for blank string use IF statement to check if string is empty.



                                                                                        while True:
                                                                                        name = input("Enter Your Namen")
                                                                                        if not name:
                                                                                        print("I did not understood that")
                                                                                        continue
                                                                                        else:
                                                                                        break

                                                                                        while True:
                                                                                        try:
                                                                                        salary = float(input("whats ur salaryn"))
                                                                                        except ValueError:
                                                                                        print("I did not understood that")
                                                                                        continue
                                                                                        else:
                                                                                        break

                                                                                        while True:
                                                                                        try:
                                                                                        print("whats ur age?")
                                                                                        age = int(float(input()))
                                                                                        except ValueError:
                                                                                        print("I did not understood that")
                                                                                        continue
                                                                                        else:
                                                                                        break

                                                                                        print("Hello "+ name + "nYour salary is " + str(salary) + 'nand you will be ' + str(age+1) +' in a Year')





                                                                                        share|improve this answer















                                                                                        Use try catch with never ending while loop. To check for blank string use IF statement to check if string is empty.



                                                                                        while True:
                                                                                        name = input("Enter Your Namen")
                                                                                        if not name:
                                                                                        print("I did not understood that")
                                                                                        continue
                                                                                        else:
                                                                                        break

                                                                                        while True:
                                                                                        try:
                                                                                        salary = float(input("whats ur salaryn"))
                                                                                        except ValueError:
                                                                                        print("I did not understood that")
                                                                                        continue
                                                                                        else:
                                                                                        break

                                                                                        while True:
                                                                                        try:
                                                                                        print("whats ur age?")
                                                                                        age = int(float(input()))
                                                                                        except ValueError:
                                                                                        print("I did not understood that")
                                                                                        continue
                                                                                        else:
                                                                                        break

                                                                                        print("Hello "+ name + "nYour salary is " + str(salary) + 'nand you will be ' + str(age+1) +' in a Year')






                                                                                        share|improve this answer














                                                                                        share|improve this answer



                                                                                        share|improve this answer








                                                                                        answered Jul 4 '18 at 13:49


























                                                                                        community wiki





                                                                                        Mahesh Sonavane
























                                                                                            0














                                                                                            This will continue ask user to input the number until they input a valid number:



                                                                                            #note: Python 2.7 users should use raw_input, the equivalent of 3.X's input
                                                                                            while(1):
                                                                                            try:
                                                                                            age = int(input("Please enter your age: "))
                                                                                            if age >= 18:
                                                                                            print("You are able to vote in the United States!")
                                                                                            break()
                                                                                            else:
                                                                                            print("You are not able to vote in the United States.")
                                                                                            break()
                                                                                            except:
                                                                                            print("Please only enter numbers ")





                                                                                            share|improve this answer






























                                                                                              0














                                                                                              This will continue ask user to input the number until they input a valid number:



                                                                                              #note: Python 2.7 users should use raw_input, the equivalent of 3.X's input
                                                                                              while(1):
                                                                                              try:
                                                                                              age = int(input("Please enter your age: "))
                                                                                              if age >= 18:
                                                                                              print("You are able to vote in the United States!")
                                                                                              break()
                                                                                              else:
                                                                                              print("You are not able to vote in the United States.")
                                                                                              break()
                                                                                              except:
                                                                                              print("Please only enter numbers ")





                                                                                              share|improve this answer




























                                                                                                0












                                                                                                0








                                                                                                0







                                                                                                This will continue ask user to input the number until they input a valid number:



                                                                                                #note: Python 2.7 users should use raw_input, the equivalent of 3.X's input
                                                                                                while(1):
                                                                                                try:
                                                                                                age = int(input("Please enter your age: "))
                                                                                                if age >= 18:
                                                                                                print("You are able to vote in the United States!")
                                                                                                break()
                                                                                                else:
                                                                                                print("You are not able to vote in the United States.")
                                                                                                break()
                                                                                                except:
                                                                                                print("Please only enter numbers ")





                                                                                                share|improve this answer















                                                                                                This will continue ask user to input the number until they input a valid number:



                                                                                                #note: Python 2.7 users should use raw_input, the equivalent of 3.X's input
                                                                                                while(1):
                                                                                                try:
                                                                                                age = int(input("Please enter your age: "))
                                                                                                if age >= 18:
                                                                                                print("You are able to vote in the United States!")
                                                                                                break()
                                                                                                else:
                                                                                                print("You are not able to vote in the United States.")
                                                                                                break()
                                                                                                except:
                                                                                                print("Please only enter numbers ")






                                                                                                share|improve this answer














                                                                                                share|improve this answer



                                                                                                share|improve this answer








                                                                                                answered Sep 15 '18 at 6:25


























                                                                                                community wiki





                                                                                                Ray Hu
























                                                                                                    0














                                                                                                    One more solution for using input validation using a customized ValidationError and a (optional) range validation for integer inputs:



                                                                                                    class ValidationError(ValueError): 
                                                                                                    """Special validation error - its message is supposed to be printed"""
                                                                                                    pass

                                                                                                    def RangeValidator(text,num,r):
                                                                                                    """Generic validator - raises 'text' as ValidationError if 'num' not in range 'r'."""
                                                                                                    if num in r:
                                                                                                    return num
                                                                                                    raise ValidationError(text)

                                                                                                    def ValidCol(c):
                                                                                                    """Specialized column validator providing text and range."""
                                                                                                    return RangeValidator("Columns must be in the range of 0 to 3 (inclusive)",
                                                                                                    c, range(4))

                                                                                                    def ValidRow(r):
                                                                                                    """Specialized row validator providing text and range."""
                                                                                                    return RangeValidator("Rows must be in the range of 5 to 15(exclusive)",
                                                                                                    r, range(5,15))


                                                                                                    Usage:



                                                                                                    def GetInt(text, validator=None):
                                                                                                    """Aks user for integer input until a valid integer is given. If provided,
                                                                                                    a 'validator' function takes the integer and either raises a
                                                                                                    ValidationError to be printed or returns the valid number.
                                                                                                    Non integers display a simple error message."""
                                                                                                    print()
                                                                                                    while True:
                                                                                                    n = input(text)
                                                                                                    try:
                                                                                                    n = int(n)

                                                                                                    return n if validator is None else validator(n)

                                                                                                    except ValueError as ve:
                                                                                                    # prints ValidationErrors directly - else generic message:
                                                                                                    if isinstance(ve, ValidationError):
                                                                                                    print(ve)
                                                                                                    else:
                                                                                                    print("Invalid input: ", n)


                                                                                                    column = GetInt("Pleased enter column: ", ValidCol)
                                                                                                    row = GetInt("Pleased enter row: ", ValidRow)
                                                                                                    print( row, column)


                                                                                                    Output:



                                                                                                    Pleased enter column: 22
                                                                                                    Columns must be in the range of 0 to 3 (inclusive)
                                                                                                    Pleased enter column: -2
                                                                                                    Columns must be in the range of 0 to 3 (inclusive)
                                                                                                    Pleased enter column: 2
                                                                                                    Pleased enter row: a
                                                                                                    Invalid input: a
                                                                                                    Pleased enter row: 72
                                                                                                    Rows must be in the range of 5 to 15(exclusive)
                                                                                                    Pleased enter row: 9

                                                                                                    9, 2





                                                                                                    share|improve this answer






























                                                                                                      0














                                                                                                      One more solution for using input validation using a customized ValidationError and a (optional) range validation for integer inputs:



                                                                                                      class ValidationError(ValueError): 
                                                                                                      """Special validation error - its message is supposed to be printed"""
                                                                                                      pass

                                                                                                      def RangeValidator(text,num,r):
                                                                                                      """Generic validator - raises 'text' as ValidationError if 'num' not in range 'r'."""
                                                                                                      if num in r:
                                                                                                      return num
                                                                                                      raise ValidationError(text)

                                                                                                      def ValidCol(c):
                                                                                                      """Specialized column validator providing text and range."""
                                                                                                      return RangeValidator("Columns must be in the range of 0 to 3 (inclusive)",
                                                                                                      c, range(4))

                                                                                                      def ValidRow(r):
                                                                                                      """Specialized row validator providing text and range."""
                                                                                                      return RangeValidator("Rows must be in the range of 5 to 15(exclusive)",
                                                                                                      r, range(5,15))


                                                                                                      Usage:



                                                                                                      def GetInt(text, validator=None):
                                                                                                      """Aks user for integer input until a valid integer is given. If provided,
                                                                                                      a 'validator' function takes the integer and either raises a
                                                                                                      ValidationError to be printed or returns the valid number.
                                                                                                      Non integers display a simple error message."""
                                                                                                      print()
                                                                                                      while True:
                                                                                                      n = input(text)
                                                                                                      try:
                                                                                                      n = int(n)

                                                                                                      return n if validator is None else validator(n)

                                                                                                      except ValueError as ve:
                                                                                                      # prints ValidationErrors directly - else generic message:
                                                                                                      if isinstance(ve, ValidationError):
                                                                                                      print(ve)
                                                                                                      else:
                                                                                                      print("Invalid input: ", n)


                                                                                                      column = GetInt("Pleased enter column: ", ValidCol)
                                                                                                      row = GetInt("Pleased enter row: ", ValidRow)
                                                                                                      print( row, column)


                                                                                                      Output:



                                                                                                      Pleased enter column: 22
                                                                                                      Columns must be in the range of 0 to 3 (inclusive)
                                                                                                      Pleased enter column: -2
                                                                                                      Columns must be in the range of 0 to 3 (inclusive)
                                                                                                      Pleased enter column: 2
                                                                                                      Pleased enter row: a
                                                                                                      Invalid input: a
                                                                                                      Pleased enter row: 72
                                                                                                      Rows must be in the range of 5 to 15(exclusive)
                                                                                                      Pleased enter row: 9

                                                                                                      9, 2





                                                                                                      share|improve this answer




























                                                                                                        0












                                                                                                        0








                                                                                                        0







                                                                                                        One more solution for using input validation using a customized ValidationError and a (optional) range validation for integer inputs:



                                                                                                        class ValidationError(ValueError): 
                                                                                                        """Special validation error - its message is supposed to be printed"""
                                                                                                        pass

                                                                                                        def RangeValidator(text,num,r):
                                                                                                        """Generic validator - raises 'text' as ValidationError if 'num' not in range 'r'."""
                                                                                                        if num in r:
                                                                                                        return num
                                                                                                        raise ValidationError(text)

                                                                                                        def ValidCol(c):
                                                                                                        """Specialized column validator providing text and range."""
                                                                                                        return RangeValidator("Columns must be in the range of 0 to 3 (inclusive)",
                                                                                                        c, range(4))

                                                                                                        def ValidRow(r):
                                                                                                        """Specialized row validator providing text and range."""
                                                                                                        return RangeValidator("Rows must be in the range of 5 to 15(exclusive)",
                                                                                                        r, range(5,15))


                                                                                                        Usage:



                                                                                                        def GetInt(text, validator=None):
                                                                                                        """Aks user for integer input until a valid integer is given. If provided,
                                                                                                        a 'validator' function takes the integer and either raises a
                                                                                                        ValidationError to be printed or returns the valid number.
                                                                                                        Non integers display a simple error message."""
                                                                                                        print()
                                                                                                        while True:
                                                                                                        n = input(text)
                                                                                                        try:
                                                                                                        n = int(n)

                                                                                                        return n if validator is None else validator(n)

                                                                                                        except ValueError as ve:
                                                                                                        # prints ValidationErrors directly - else generic message:
                                                                                                        if isinstance(ve, ValidationError):
                                                                                                        print(ve)
                                                                                                        else:
                                                                                                        print("Invalid input: ", n)


                                                                                                        column = GetInt("Pleased enter column: ", ValidCol)
                                                                                                        row = GetInt("Pleased enter row: ", ValidRow)
                                                                                                        print( row, column)


                                                                                                        Output:



                                                                                                        Pleased enter column: 22
                                                                                                        Columns must be in the range of 0 to 3 (inclusive)
                                                                                                        Pleased enter column: -2
                                                                                                        Columns must be in the range of 0 to 3 (inclusive)
                                                                                                        Pleased enter column: 2
                                                                                                        Pleased enter row: a
                                                                                                        Invalid input: a
                                                                                                        Pleased enter row: 72
                                                                                                        Rows must be in the range of 5 to 15(exclusive)
                                                                                                        Pleased enter row: 9

                                                                                                        9, 2





                                                                                                        share|improve this answer















                                                                                                        One more solution for using input validation using a customized ValidationError and a (optional) range validation for integer inputs:



                                                                                                        class ValidationError(ValueError): 
                                                                                                        """Special validation error - its message is supposed to be printed"""
                                                                                                        pass

                                                                                                        def RangeValidator(text,num,r):
                                                                                                        """Generic validator - raises 'text' as ValidationError if 'num' not in range 'r'."""
                                                                                                        if num in r:
                                                                                                        return num
                                                                                                        raise ValidationError(text)

                                                                                                        def ValidCol(c):
                                                                                                        """Specialized column validator providing text and range."""
                                                                                                        return RangeValidator("Columns must be in the range of 0 to 3 (inclusive)",
                                                                                                        c, range(4))

                                                                                                        def ValidRow(r):
                                                                                                        """Specialized row validator providing text and range."""
                                                                                                        return RangeValidator("Rows must be in the range of 5 to 15(exclusive)",
                                                                                                        r, range(5,15))


                                                                                                        Usage:



                                                                                                        def GetInt(text, validator=None):
                                                                                                        """Aks user for integer input until a valid integer is given. If provided,
                                                                                                        a 'validator' function takes the integer and either raises a
                                                                                                        ValidationError to be printed or returns the valid number.
                                                                                                        Non integers display a simple error message."""
                                                                                                        print()
                                                                                                        while True:
                                                                                                        n = input(text)
                                                                                                        try:
                                                                                                        n = int(n)

                                                                                                        return n if validator is None else validator(n)

                                                                                                        except ValueError as ve:
                                                                                                        # prints ValidationErrors directly - else generic message:
                                                                                                        if isinstance(ve, ValidationError):
                                                                                                        print(ve)
                                                                                                        else:
                                                                                                        print("Invalid input: ", n)


                                                                                                        column = GetInt("Pleased enter column: ", ValidCol)
                                                                                                        row = GetInt("Pleased enter row: ", ValidRow)
                                                                                                        print( row, column)


                                                                                                        Output:



                                                                                                        Pleased enter column: 22
                                                                                                        Columns must be in the range of 0 to 3 (inclusive)
                                                                                                        Pleased enter column: -2
                                                                                                        Columns must be in the range of 0 to 3 (inclusive)
                                                                                                        Pleased enter column: 2
                                                                                                        Pleased enter row: a
                                                                                                        Invalid input: a
                                                                                                        Pleased enter row: 72
                                                                                                        Rows must be in the range of 5 to 15(exclusive)
                                                                                                        Pleased enter row: 9

                                                                                                        9, 2






                                                                                                        share|improve this answer














                                                                                                        share|improve this answer



                                                                                                        share|improve this answer








                                                                                                        edited Nov 8 '18 at 12:04


























                                                                                                        community wiki





                                                                                                        3 revs
                                                                                                        Patrick Artner
























                                                                                                            0














                                                                                                            Here's a cleaner, more generalized solution that avoids repetitive if/else blocks: write a function that takes (Error, error prompt) pairs in a dictionary and do all your value-checking with assertions.



                                                                                                            def validate_input(prompt, error_map):
                                                                                                            while True:
                                                                                                            try:
                                                                                                            data = int(input(prompt))
                                                                                                            # Insert your non-exception-throwing conditionals here
                                                                                                            assert data > 0
                                                                                                            return data
                                                                                                            # Print whatever text you want the user to see
                                                                                                            # depending on how they messed up
                                                                                                            except tuple(error_map.keys()) as e:
                                                                                                            print(error_map[type(e)])


                                                                                                            Usage:



                                                                                                            d = {ValueError: 'Integers only', AssertionError: 'Positive numbers only', 
                                                                                                            KeyboardInterrupt: 'You can never leave'}
                                                                                                            user_input = validate_input("Positive number: ", d)





                                                                                                            share|improve this answer






























                                                                                                              0














                                                                                                              Here's a cleaner, more generalized solution that avoids repetitive if/else blocks: write a function that takes (Error, error prompt) pairs in a dictionary and do all your value-checking with assertions.



                                                                                                              def validate_input(prompt, error_map):
                                                                                                              while True:
                                                                                                              try:
                                                                                                              data = int(input(prompt))
                                                                                                              # Insert your non-exception-throwing conditionals here
                                                                                                              assert data > 0
                                                                                                              return data
                                                                                                              # Print whatever text you want the user to see
                                                                                                              # depending on how they messed up
                                                                                                              except tuple(error_map.keys()) as e:
                                                                                                              print(error_map[type(e)])


                                                                                                              Usage:



                                                                                                              d = {ValueError: 'Integers only', AssertionError: 'Positive numbers only', 
                                                                                                              KeyboardInterrupt: 'You can never leave'}
                                                                                                              user_input = validate_input("Positive number: ", d)





                                                                                                              share|improve this answer




























                                                                                                                0












                                                                                                                0








                                                                                                                0







                                                                                                                Here's a cleaner, more generalized solution that avoids repetitive if/else blocks: write a function that takes (Error, error prompt) pairs in a dictionary and do all your value-checking with assertions.



                                                                                                                def validate_input(prompt, error_map):
                                                                                                                while True:
                                                                                                                try:
                                                                                                                data = int(input(prompt))
                                                                                                                # Insert your non-exception-throwing conditionals here
                                                                                                                assert data > 0
                                                                                                                return data
                                                                                                                # Print whatever text you want the user to see
                                                                                                                # depending on how they messed up
                                                                                                                except tuple(error_map.keys()) as e:
                                                                                                                print(error_map[type(e)])


                                                                                                                Usage:



                                                                                                                d = {ValueError: 'Integers only', AssertionError: 'Positive numbers only', 
                                                                                                                KeyboardInterrupt: 'You can never leave'}
                                                                                                                user_input = validate_input("Positive number: ", d)





                                                                                                                share|improve this answer















                                                                                                                Here's a cleaner, more generalized solution that avoids repetitive if/else blocks: write a function that takes (Error, error prompt) pairs in a dictionary and do all your value-checking with assertions.



                                                                                                                def validate_input(prompt, error_map):
                                                                                                                while True:
                                                                                                                try:
                                                                                                                data = int(input(prompt))
                                                                                                                # Insert your non-exception-throwing conditionals here
                                                                                                                assert data > 0
                                                                                                                return data
                                                                                                                # Print whatever text you want the user to see
                                                                                                                # depending on how they messed up
                                                                                                                except tuple(error_map.keys()) as e:
                                                                                                                print(error_map[type(e)])


                                                                                                                Usage:



                                                                                                                d = {ValueError: 'Integers only', AssertionError: 'Positive numbers only', 
                                                                                                                KeyboardInterrupt: 'You can never leave'}
                                                                                                                user_input = validate_input("Positive number: ", d)






                                                                                                                share|improve this answer














                                                                                                                share|improve this answer



                                                                                                                share|improve this answer








                                                                                                                edited Nov 19 '18 at 21:26


























                                                                                                                community wiki





                                                                                                                2 revs
                                                                                                                Daniel Q
























                                                                                                                    0














                                                                                                                    Building upon Daniel Q's and Patrick Artner's excellent suggestions,
                                                                                                                    here is an even more generalized solution.



                                                                                                                    # Assuming Python3
                                                                                                                    import sys

                                                                                                                    class ValidationError(ValueError): # thanks Patrick Artner
                                                                                                                    pass

                                                                                                                    def validate_input(prompt, cast=str, cond=(lambda x: True), onerror=None):
                                                                                                                    if onerror==None: onerror = {}
                                                                                                                    while True:
                                                                                                                    try:
                                                                                                                    data = cast(input(prompt))
                                                                                                                    if not cond(data): raise ValidationError
                                                                                                                    return data
                                                                                                                    except tuple(onerror.keys()) as e: # thanks Daniel Q
                                                                                                                    print(onerror[type(e)], file=sys.stderr)


                                                                                                                    I opted for explicit if and raise statements instead of an assert,
                                                                                                                    because assertion checking may be turned off,
                                                                                                                    whereas validation should always be on to provide robustness.



                                                                                                                    This may be used to get different kinds of input,
                                                                                                                    with different validation conditions.
                                                                                                                    For example:



                                                                                                                    # No validation, equivalent to simple input:
                                                                                                                    anystr = validate_input("Enter any string: ")

                                                                                                                    # Get a string containing only letters:
                                                                                                                    letters = validate_input("Enter letters: ",
                                                                                                                    cond=str.isalpha,
                                                                                                                    onerror={ValidationError: "Only letters, please!"})

                                                                                                                    # Get a float in [0, 100]:
                                                                                                                    percentage = validate_input("Percentage? ",
                                                                                                                    cast=float, cond=lambda x: 0.0<=x<=100.0,
                                                                                                                    onerror={ValidationError: "Must be between 0 and 100!",
                                                                                                                    ValueError: "Not a number!"})


                                                                                                                    Or, to answer the original question:



                                                                                                                    age = validate_input("Please enter your age: ",
                                                                                                                    cast=int, cond=lambda a:0<=a<150,
                                                                                                                    onerror={ValidationError: "Enter a plausible age, please!",
                                                                                                                    ValueError: "Enter an integer, please!"})
                                                                                                                    if age >= 18:
                                                                                                                    print("You are able to vote in the United States!")
                                                                                                                    else:
                                                                                                                    print("You are not able to vote in the United States.")





                                                                                                                    share|improve this answer






























                                                                                                                      0














                                                                                                                      Building upon Daniel Q's and Patrick Artner's excellent suggestions,
                                                                                                                      here is an even more generalized solution.



                                                                                                                      # Assuming Python3
                                                                                                                      import sys

                                                                                                                      class ValidationError(ValueError): # thanks Patrick Artner
                                                                                                                      pass

                                                                                                                      def validate_input(prompt, cast=str, cond=(lambda x: True), onerror=None):
                                                                                                                      if onerror==None: onerror = {}
                                                                                                                      while True:
                                                                                                                      try:
                                                                                                                      data = cast(input(prompt))
                                                                                                                      if not cond(data): raise ValidationError
                                                                                                                      return data
                                                                                                                      except tuple(onerror.keys()) as e: # thanks Daniel Q
                                                                                                                      print(onerror[type(e)], file=sys.stderr)


                                                                                                                      I opted for explicit if and raise statements instead of an assert,
                                                                                                                      because assertion checking may be turned off,
                                                                                                                      whereas validation should always be on to provide robustness.



                                                                                                                      This may be used to get different kinds of input,
                                                                                                                      with different validation conditions.
                                                                                                                      For example:



                                                                                                                      # No validation, equivalent to simple input:
                                                                                                                      anystr = validate_input("Enter any string: ")

                                                                                                                      # Get a string containing only letters:
                                                                                                                      letters = validate_input("Enter letters: ",
                                                                                                                      cond=str.isalpha,
                                                                                                                      onerror={ValidationError: "Only letters, please!"})

                                                                                                                      # Get a float in [0, 100]:
                                                                                                                      percentage = validate_input("Percentage? ",
                                                                                                                      cast=float, cond=lambda x: 0.0<=x<=100.0,
                                                                                                                      onerror={ValidationError: "Must be between 0 and 100!",
                                                                                                                      ValueError: "Not a number!"})


                                                                                                                      Or, to answer the original question:



                                                                                                                      age = validate_input("Please enter your age: ",
                                                                                                                      cast=int, cond=lambda a:0<=a<150,
                                                                                                                      onerror={ValidationError: "Enter a plausible age, please!",
                                                                                                                      ValueError: "Enter an integer, please!"})
                                                                                                                      if age >= 18:
                                                                                                                      print("You are able to vote in the United States!")
                                                                                                                      else:
                                                                                                                      print("You are not able to vote in the United States.")





                                                                                                                      share|improve this answer




























                                                                                                                        0












                                                                                                                        0








                                                                                                                        0







                                                                                                                        Building upon Daniel Q's and Patrick Artner's excellent suggestions,
                                                                                                                        here is an even more generalized solution.



                                                                                                                        # Assuming Python3
                                                                                                                        import sys

                                                                                                                        class ValidationError(ValueError): # thanks Patrick Artner
                                                                                                                        pass

                                                                                                                        def validate_input(prompt, cast=str, cond=(lambda x: True), onerror=None):
                                                                                                                        if onerror==None: onerror = {}
                                                                                                                        while True:
                                                                                                                        try:
                                                                                                                        data = cast(input(prompt))
                                                                                                                        if not cond(data): raise ValidationError
                                                                                                                        return data
                                                                                                                        except tuple(onerror.keys()) as e: # thanks Daniel Q
                                                                                                                        print(onerror[type(e)], file=sys.stderr)


                                                                                                                        I opted for explicit if and raise statements instead of an assert,
                                                                                                                        because assertion checking may be turned off,
                                                                                                                        whereas validation should always be on to provide robustness.



                                                                                                                        This may be used to get different kinds of input,
                                                                                                                        with different validation conditions.
                                                                                                                        For example:



                                                                                                                        # No validation, equivalent to simple input:
                                                                                                                        anystr = validate_input("Enter any string: ")

                                                                                                                        # Get a string containing only letters:
                                                                                                                        letters = validate_input("Enter letters: ",
                                                                                                                        cond=str.isalpha,
                                                                                                                        onerror={ValidationError: "Only letters, please!"})

                                                                                                                        # Get a float in [0, 100]:
                                                                                                                        percentage = validate_input("Percentage? ",
                                                                                                                        cast=float, cond=lambda x: 0.0<=x<=100.0,
                                                                                                                        onerror={ValidationError: "Must be between 0 and 100!",
                                                                                                                        ValueError: "Not a number!"})


                                                                                                                        Or, to answer the original question:



                                                                                                                        age = validate_input("Please enter your age: ",
                                                                                                                        cast=int, cond=lambda a:0<=a<150,
                                                                                                                        onerror={ValidationError: "Enter a plausible age, please!",
                                                                                                                        ValueError: "Enter an integer, please!"})
                                                                                                                        if age >= 18:
                                                                                                                        print("You are able to vote in the United States!")
                                                                                                                        else:
                                                                                                                        print("You are not able to vote in the United States.")





                                                                                                                        share|improve this answer















                                                                                                                        Building upon Daniel Q's and Patrick Artner's excellent suggestions,
                                                                                                                        here is an even more generalized solution.



                                                                                                                        # Assuming Python3
                                                                                                                        import sys

                                                                                                                        class ValidationError(ValueError): # thanks Patrick Artner
                                                                                                                        pass

                                                                                                                        def validate_input(prompt, cast=str, cond=(lambda x: True), onerror=None):
                                                                                                                        if onerror==None: onerror = {}
                                                                                                                        while True:
                                                                                                                        try:
                                                                                                                        data = cast(input(prompt))
                                                                                                                        if not cond(data): raise ValidationError
                                                                                                                        return data
                                                                                                                        except tuple(onerror.keys()) as e: # thanks Daniel Q
                                                                                                                        print(onerror[type(e)], file=sys.stderr)


                                                                                                                        I opted for explicit if and raise statements instead of an assert,
                                                                                                                        because assertion checking may be turned off,
                                                                                                                        whereas validation should always be on to provide robustness.



                                                                                                                        This may be used to get different kinds of input,
                                                                                                                        with different validation conditions.
                                                                                                                        For example:



                                                                                                                        # No validation, equivalent to simple input:
                                                                                                                        anystr = validate_input("Enter any string: ")

                                                                                                                        # Get a string containing only letters:
                                                                                                                        letters = validate_input("Enter letters: ",
                                                                                                                        cond=str.isalpha,
                                                                                                                        onerror={ValidationError: "Only letters, please!"})

                                                                                                                        # Get a float in [0, 100]:
                                                                                                                        percentage = validate_input("Percentage? ",
                                                                                                                        cast=float, cond=lambda x: 0.0<=x<=100.0,
                                                                                                                        onerror={ValidationError: "Must be between 0 and 100!",
                                                                                                                        ValueError: "Not a number!"})


                                                                                                                        Or, to answer the original question:



                                                                                                                        age = validate_input("Please enter your age: ",
                                                                                                                        cast=int, cond=lambda a:0<=a<150,
                                                                                                                        onerror={ValidationError: "Enter a plausible age, please!",
                                                                                                                        ValueError: "Enter an integer, please!"})
                                                                                                                        if age >= 18:
                                                                                                                        print("You are able to vote in the United States!")
                                                                                                                        else:
                                                                                                                        print("You are not able to vote in the United States.")






                                                                                                                        share|improve this answer














                                                                                                                        share|improve this answer



                                                                                                                        share|improve this answer








                                                                                                                        edited Dec 1 '18 at 11:17


























                                                                                                                        community wiki





                                                                                                                        3 revs
                                                                                                                        João Manuel Rodrigues
























                                                                                                                            0














                                                                                                                            Good question! You can try the following code for this. =)



                                                                                                                            This code uses ast.literal_eval() to find the data type of the input (age). Then it follows the following algorithm:






                                                                                                                            1. Ask user to input her/his age.



                                                                                                                              1.1. If age is float or int data type:




                                                                                                                              • Check if age>=18. If age>=18, print appropriate output and exit.


                                                                                                                              • Check if 0<age<18. If 0<age<18, print appropriate output and exit.


                                                                                                                              • If age<=0, ask the user to input a valid number for age again, (i.e. go back to step 1.)



                                                                                                                              1.2. If age is not float or int data type, then ask user to input her/his age again (i.e. go back to step 1.)






                                                                                                                            Here is the code.



                                                                                                                            from ast import literal_eval

                                                                                                                            ''' This function is used to identify the data type of input data.'''
                                                                                                                            def input_type(input_data):
                                                                                                                            try:
                                                                                                                            return type(literal_eval(input_data))
                                                                                                                            except (ValueError, SyntaxError):
                                                                                                                            return str

                                                                                                                            flag = True

                                                                                                                            while(flag):
                                                                                                                            age = raw_input("Please enter your age: ")

                                                                                                                            if input_type(age)==float or input_type(age)==int:
                                                                                                                            if eval(age)>=18:
                                                                                                                            print("You are able to vote in the United States!")
                                                                                                                            flag = False
                                                                                                                            elif eval(age)>0 and eval(age)<18:
                                                                                                                            print("You are not able to vote in the United States.")
                                                                                                                            flag = False
                                                                                                                            else: print("Please enter a valid number as your age.")

                                                                                                                            else: print("Sorry, I didn't understand that.")





                                                                                                                            share|improve this answer






























                                                                                                                              0














                                                                                                                              Good question! You can try the following code for this. =)



                                                                                                                              This code uses ast.literal_eval() to find the data type of the input (age). Then it follows the following algorithm:






                                                                                                                              1. Ask user to input her/his age.



                                                                                                                                1.1. If age is float or int data type:




                                                                                                                                • Check if age>=18. If age>=18, print appropriate output and exit.


                                                                                                                                • Check if 0<age<18. If 0<age<18, print appropriate output and exit.


                                                                                                                                • If age<=0, ask the user to input a valid number for age again, (i.e. go back to step 1.)



                                                                                                                                1.2. If age is not float or int data type, then ask user to input her/his age again (i.e. go back to step 1.)






                                                                                                                              Here is the code.



                                                                                                                              from ast import literal_eval

                                                                                                                              ''' This function is used to identify the data type of input data.'''
                                                                                                                              def input_type(input_data):
                                                                                                                              try:
                                                                                                                              return type(literal_eval(input_data))
                                                                                                                              except (ValueError, SyntaxError):
                                                                                                                              return str

                                                                                                                              flag = True

                                                                                                                              while(flag):
                                                                                                                              age = raw_input("Please enter your age: ")

                                                                                                                              if input_type(age)==float or input_type(age)==int:
                                                                                                                              if eval(age)>=18:
                                                                                                                              print("You are able to vote in the United States!")
                                                                                                                              flag = False
                                                                                                                              elif eval(age)>0 and eval(age)<18:
                                                                                                                              print("You are not able to vote in the United States.")
                                                                                                                              flag = False
                                                                                                                              else: print("Please enter a valid number as your age.")

                                                                                                                              else: print("Sorry, I didn't understand that.")





                                                                                                                              share|improve this answer




























                                                                                                                                0












                                                                                                                                0








                                                                                                                                0







                                                                                                                                Good question! You can try the following code for this. =)



                                                                                                                                This code uses ast.literal_eval() to find the data type of the input (age). Then it follows the following algorithm:






                                                                                                                                1. Ask user to input her/his age.



                                                                                                                                  1.1. If age is float or int data type:




                                                                                                                                  • Check if age>=18. If age>=18, print appropriate output and exit.


                                                                                                                                  • Check if 0<age<18. If 0<age<18, print appropriate output and exit.


                                                                                                                                  • If age<=0, ask the user to input a valid number for age again, (i.e. go back to step 1.)



                                                                                                                                  1.2. If age is not float or int data type, then ask user to input her/his age again (i.e. go back to step 1.)






                                                                                                                                Here is the code.



                                                                                                                                from ast import literal_eval

                                                                                                                                ''' This function is used to identify the data type of input data.'''
                                                                                                                                def input_type(input_data):
                                                                                                                                try:
                                                                                                                                return type(literal_eval(input_data))
                                                                                                                                except (ValueError, SyntaxError):
                                                                                                                                return str

                                                                                                                                flag = True

                                                                                                                                while(flag):
                                                                                                                                age = raw_input("Please enter your age: ")

                                                                                                                                if input_type(age)==float or input_type(age)==int:
                                                                                                                                if eval(age)>=18:
                                                                                                                                print("You are able to vote in the United States!")
                                                                                                                                flag = False
                                                                                                                                elif eval(age)>0 and eval(age)<18:
                                                                                                                                print("You are not able to vote in the United States.")
                                                                                                                                flag = False
                                                                                                                                else: print("Please enter a valid number as your age.")

                                                                                                                                else: print("Sorry, I didn't understand that.")





                                                                                                                                share|improve this answer















                                                                                                                                Good question! You can try the following code for this. =)



                                                                                                                                This code uses ast.literal_eval() to find the data type of the input (age). Then it follows the following algorithm:






                                                                                                                                1. Ask user to input her/his age.



                                                                                                                                  1.1. If age is float or int data type:




                                                                                                                                  • Check if age>=18. If age>=18, print appropriate output and exit.


                                                                                                                                  • Check if 0<age<18. If 0<age<18, print appropriate output and exit.


                                                                                                                                  • If age<=0, ask the user to input a valid number for age again, (i.e. go back to step 1.)



                                                                                                                                  1.2. If age is not float or int data type, then ask user to input her/his age again (i.e. go back to step 1.)






                                                                                                                                Here is the code.



                                                                                                                                from ast import literal_eval

                                                                                                                                ''' This function is used to identify the data type of input data.'''
                                                                                                                                def input_type(input_data):
                                                                                                                                try:
                                                                                                                                return type(literal_eval(input_data))
                                                                                                                                except (ValueError, SyntaxError):
                                                                                                                                return str

                                                                                                                                flag = True

                                                                                                                                while(flag):
                                                                                                                                age = raw_input("Please enter your age: ")

                                                                                                                                if input_type(age)==float or input_type(age)==int:
                                                                                                                                if eval(age)>=18:
                                                                                                                                print("You are able to vote in the United States!")
                                                                                                                                flag = False
                                                                                                                                elif eval(age)>0 and eval(age)<18:
                                                                                                                                print("You are not able to vote in the United States.")
                                                                                                                                flag = False
                                                                                                                                else: print("Please enter a valid number as your age.")

                                                                                                                                else: print("Sorry, I didn't understand that.")






                                                                                                                                share|improve this answer














                                                                                                                                share|improve this answer



                                                                                                                                share|improve this answer








                                                                                                                                edited Dec 18 '18 at 6:54


























                                                                                                                                community wiki





                                                                                                                                4 revs
                                                                                                                                Siddharth Satpathy


















                                                                                                                                    protected by Robert Harvey Jan 14 '15 at 21:13



                                                                                                                                    Thank you for your interest in this question.
                                                                                                                                    Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).



                                                                                                                                    Would you like to answer one of these unanswered questions instead?



                                                                                                                                    Popular posts from this blog

                                                                                                                                    Different font size/position of beamer's navigation symbols template's content depending on regular/plain...

                                                                                                                                    Berounka

                                                                                                                                    I want to find a topological embedding $f : X rightarrow Y$ and $g: Y rightarrow X$, yet $X$ is not...