Python校验处理用户输入的方法

Python处理用户输入需要考虑几个问题:

  1. 用户输入的数据是否合法
  2. 用户输入非法数据是否会抛出异常
  3. 用户输入非法数据后,给出友好提示并等待继续输入

在Python里比较简单的做法是使用一直循环,如果用户输入错误数据,执行continue继续等待用户输入,如果用户输入正确数据,执行break跳出循环。

用户输入可能会抛出异常

这里需要使用try-catch来捕获用户输入非法数据导致的异常。

python 3.x

while True:
    try:
        age = int(input("请输入您的年龄: "))
    except ValueError:
        print("您输入的不是年龄")
        #继续等待输入
        continue
    else:
        #输入正确的数据(年龄),跳出循环
        break
if age >= 18: 
    print("已满18岁")
else:
    print("未满18岁")

添加校验规则

如果需要对数据进行校验,可以添加自定义的校验规则,如只允许用户输入A,B,C和D,不区分大小写

while True:
    data = input("输入A到D之间的字母:")
    if data.lower() not in ('a', 'b', 'c', 'd'):
        print("输入错误字母")
    else:
        break

组合使用异常处理与自定义校验

有些情况既需要处理异常,也需要添加自定义的校验规则,如用户输入年龄要求为数字,并且不能为负数

while True:
    try:
        age = int(input("请输入您的年龄: "))
    except ValueError:
        print("您输入的不是年龄")
        continue

    if age < 0:
        print("年龄不能为负数")
        continue
    else:
        #输入正确的年龄,退出循环
        break
if age >= 18: 
    print("已满18岁")
else:
    print("未满18岁")

抽取处理用户输入的功能为函数

除了处理数字外,我们可能需要处理不同类型的用户输入,抽取出一个比较公用的处理用户输入的方法

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_必须小于或等于max_.")
    while True:
        ui = input(prompt)
        if type_ is not None:
            try:
                ui = type_(ui)
            except ValueError:
                print("输入类型必须是{0}。".format(type_.__name__))
                continue
        if max_ is not None and ui > max_:
            print("输入的值必须小于或等于0}。".format(max_))
        elif min_ is not None and ui < min_:
            print("输入的值必须大于或等于{0}。".format(min_))
        elif range_ is not None and ui not in range_:
            if isinstance(range_, range):
                template = "输入的值必须在{0.start}与{0.stop}之间。"
                print(template.format(range_))
            else:
                template = "输入的值必须为{0}。"
                if len(range_) == 1:
                    print(template.format(*range_))
                else:
                    print(template.format(" 或 ".join((", ".join(map(str,
                                                                     range_[:-1])),
                                                       str(range_[-1])))))
        else:
            return ui

使用示例:

age = sanitised_input("E请输入您的年龄 ", int, 1, 101)
answer = sanitised_input("请输入您的答案", str.lower, range_=('a', 'b', 'c', 'd'))

参考:Asking the user for input until they give a valid response

版权声明:著作权归作者所有。

相关推荐

Python安全创建目录的方法

在介绍Python安全创建目录之前,先举一个不安全创建目录的方式:if not os.path.exists(directory):     os.makedirs(directory) 在例子里,先判断目录是否存在,然后创建目录。这种方式是不安全的,它会导致竞争条件。在os.path.exists()和os.makedirs()之间的时

MySQL限定用户远程连接的ip(设置白名单)

出于安全考虑,有时我们需要限定MySQL用户连接ip。使用授权语法grant可以帮我们完成对ip设置白名单。允许所有的ip访问:mysql> grant all privileges on mydb.* to 'myaccount'@'%'; 其中'myaccount'@’%‘表示,允许账号myaccount在所有的ip上

Linux命令useradd添加用户的默认值说明

Linux添加用户的命令useradd会使用选项指定的值在加上默认文件/etc/default/useradd设置的值初始化新增的用户。这里将对useradd的默认值做下说明。查看默认值[root@xxx home]# useradd -D GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/e

Python合并多个字典的方法

示例x = {'a': 1, 'b': 2} y = {'b': 3, 'c': 4} 相同属性合并,后者覆盖前者的值。x和y合并后>>> z {'a': 1, 'b': 3, 'c': 4} Python 3.

Python判断文件是否存在的方法

方法一使用os.path.exists判断路径是否存在,包括文件夹和文件。import os.path os.path.exists(my_file) 方法二使用os.path.isfile检查路径是否为文件,如果文件存在返回True。import os.path os.path.isfile(my_file)  方法三面向对象文件系统路径操作包pathlib2,pa