简体   繁体   中英

Python - Input Validation

I'm looking to create code which requires an integer greater than 2 to be input by a user before continuing. I'm using python 3.3. Here's what I have so far:

def is_integer(x):
    try:
        int(x)
        return False
    except ValueError:
        print('Please enter an integer above 2')
        return True

maximum_number_input = input("Maximum Number: ")

while is_integer(maximum_number_input):
    maximum_number_input = input("Maximum Number: ")

    print('You have successfully entered a valid number')

What I'm not sure about is how best to put in the condition that the integer must be greater than 2. I've only just started learning python but want to get into good habits.

This should do the job:

def valid_user_input(x):
    try:
        return int(x) > 2
    except ValueError:
        return False

maximum_number_input = input("Maximum Number: ")

while valid_user_input(maximum_number_input):
    maximum_number_input = input("Maximum Number: ")
    print("You have successfully entered a valid number")

Or even shorter:

def valid_user_input():
    try:
        return int(input("Maximum Number: ")) > 2
    except ValueError:
        return False

while valid_user_input():
    print('You have successfully entered a valid number')
def take_user_in():
    try:
        return int(raw_input("Enter a value greater than 2 -> "))  # Taking user input and converting to string
    except ValueError as e:  # Catching the exception, that possibly, a inconvertible string could be given
        print "Please enter a number as" + str(e) + " as a number"
        return None


if __name__ == '__main__':  # Somethign akin to having a main function in Python

    # Structure like a do-whole loop
    # func()
    # while()
    #     func()
    var = take_user_in()  # Taking user data
    while not isinstance(var, int) or var < 2:  # Making sure that data is an int and more than 2
        var = take_user_in()  # Taking user input again for invalid input

    print "Thank you"  # Success

My take:

from itertools import dropwhile
from numbers import Integral
from functools import partial
from ast import literal_eval

def value_if_type(obj, of_type=(Integral,)):
    try:
        value = literal_eval(obj)
        if isinstance(value, of_type):
            return value
    except ValueError:
        return None

inputs = map(partial(value_if_type), iter(lambda: input('Input int > 2'), object()))

gt2 = next(dropwhile(lambda L: L <= 2, inputs))
def check_value(some_value):
    try:
       y = int(some_value)
    except ValueError:
       return False
    return y > 2 

This verifies that the input is an integer, but does reject values that look like integers (like 3.0 ):

def is_valid(x):
    return isinstance(x,int) and x > 2

x = 0
while not is_valid(x):
    # In Python 2.x, use raw_input() instead of input()
    x = input("Please enter an integer greater than 2: ")
    try:
        x = int(x)
    except ValueError:
        continue

Hope this helps

import str
def validate(s):       
    return str.isdigit(s) and int(s) > 2
  • str.isdidig() will eliminate all strings containing non-integers, floats ('.') and negatives ('-') (which are less than 2)
  • int(user_input) confirms that it's an integer greater than 2
  • returns True if both are True

The problem with using the int() built-in shown in other answers is that it will convert float and booleans to integers, so it's not really a check that your argument was an integer.

It's tempting to use the built-in isinstance(value, int) method on its own, but unfortunately, it will return True if passed a boolean. So here's my short and sweet Python 3.7 solution if you want strict type checking:

def is_integer(value):
    if isinstance(value, bool):
        return False
    else:
        return isinstance(value, int)

Results:

is_integer(True)  --> False
is_integer(False) --> False
is_integer(0.0)   --> False
is_integer(0)     --> True
is_integer((12))  --> True
is_integer((12,)) --> False
is_integer([0])   --> False

etc...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM