我们通常会需要对用户输入的内容格式进行验证。例如,用户输入年龄,那么代码不应该接受无意义的答案,例如负数或单词。输入验证可以防止错误或者安全漏洞。
通常,我们执行输入验证的方式是要求用户反复进行输入,直到他们输入有效的文本。本书中举了一个例子:
while True:
try:
age = int(input('Enter your age: '))
except ValueError:
print('Please use numeric digits.')
else:
if age < 0:
print('Please enter a positive number.')
else:
break
print('Your age is {}.'.format(age))
如上面这个例子,我们没有输入或者输入错误回报错,一直循环等待,直到正确的格式进入运行后如下:
这样有个弊端,就是需要一直等待while循环的退出,很麻烦,所有引入了PyInputPlus 模块,学习其关键字的使用和自定义。
PyInputPlus 模块
PyInputPlus 模块包含与 input 函数类似的、用于多种数据的函数:数字、日期、邮箱等。如果用户输入了无效的数据,例如格式错误的日期或者超出预期范围的数字,那么 PyInputPlus 会提示输入者再次输入。此外 PyInputPlus 模块还支持其它功能,例如提示输入者输入次数和时间限制。
PyInputPlus 不是 Python 标准库的一部分,因此需要额外安装(pycharm64是在“Terminal”中进行),执行如下终端命令安装:
“pip3 install -U pip”检查安装条件;
“pip3 install pyinputplus”进行安装。
我尝试在pycharm64的设置中添加失败了,用上面的方法可以正确安装。
PyInputPlus 模块中的几种常用函数:
inputStr:类似于 input 函数,具有一般的 PyInputPlus 功能
inputNum:确保用户输入的是数值,并返回 int 或 float 类型的数据;
inputChoice:确保用户输入的是系统提供的选项之一
inputMenu:与inputChoice 类似,但它提供一个带有数字或字母选项的菜单;
inputDatetime:确保用户输入的是日期和时间;
inputYesNo:确保用户输入的是不分大小写的 yes 或者 no ( n 、N 、no 、NO 等字样看作 no ,把 y 、Y、yes 、YES 等字样看作 Yes),返回的是字符串 'yes' 或 'no'
inputBool:与 inputYesNo 类似,但输入值是不分大小写的 true 或 false ,返回的是对应的布尔值
inputEmail:确保用户输入有效的邮箱地址
inputFilepath:确保用户输入有效的文件路径和文件名,并且可以设置是否检查文件的存在
inputPassword:确保用户的输入内容不会显示在屏幕上
这些常用函数就相当于是一个打包好的固件,我们可以直接使用。
inputNum 、inputInt 、inputFloat 等这些可以把字符串转换为数值的函数,具有 min 、max 、greaterThan 、lessThan 等关键字参数用于指定有效范围。例如:
from pyinputplus import inputNum
num = inputNum('Enter a number: ', min=2, lessThan=15)
有一些关键字不能同时使用,例如max和lessThan,运行后会报错;
blank 参数设置为 True ,则可以包含空白字符;limit和timeout关键字允许用户在输入一定次数后停止尝试,或者一段时间后停止输入,达到限制后会提示异常并终止程序,或者可以使用default关键字触发后不提示异常,而是返回default关键字的值。例如:
from pyinputplus import inputNum
num1 = inputNum('Enter a number: ', max=10, limit=3, default='Over limit')
print(num1)
num2 = inputNum('Enter a number: ', max=10, timeout=10, default='Over time')
print(num2)
num3 = inputNum('Enter a number: ', max=10, blank=True)
print(num3)
关键字参数 allowRegexes 和 blockRegexes 可以利用正则表达式字符串来确定函数接收哪些输入作为有效输入或者将哪些输入视作无效输入。
更复杂的逻辑要求可以通过自定义验证函数实现,可以实现高度定制化。
|