Python中的PyInputPlus模块详解

“输入验证”代码检查用户输入值,在Python中我们用的最多的是input()函数,但是有些情况下反复使用input()函数可能会遗漏某些场景,并且该函数允许无效输入通过检查。因此我们需要使用Python的第三方模块PyInputPlus进行输入验证。

PyInputPlus包含与input()类似的、用户多种数据(数字日期、E-mail地址等)的函数。如果用户输入了无效的内容,例如格式错误的日期或超出预期范围的数字,PyIputPlus会再次提示他们输入。PyInputPlus还包含其他有用的功能,例如提示用户的次数限制和时间限制(如果要求用户在时限内作出响应)。

安装PyInputPlus

PyInputPlus不是Python标准库的一部分,因此需要使用pip单独安装。命令如下:

pip install --user pyinputplus

PyInputPlus具有以下几种用于不同类型输入的函数:

  • inputStr()类似于内置的input()函数,但具有一般的PyInputPlus功能
  • inputNum()确保用户输入数字并返回int或float值,这取决于数字是否包含小数点
  • inputChoice()确保用户输入习题提供的选项之一
  • inputMenu()与inputChoice类似,但提供一个带有数字或字母选项的菜单
  • inputDatetime()确保用户输入日期和时间
  • inputYesNo()确保用户输入“yes”或“no”响应
  • inputBool()类似inputYesNo(),但接收“True”或“False”响应,并返回一个布尔值
  • inputEmail()确保用户输入有效的E-mail地址
  • inputFilepath()确保用户输入有效的文件路径和文件名,并可以选择检查是否存在具有该名称的文件
  • inputPassword()类似于内置的input(),但是在用户输入时显示*字符,因此不会在屏幕上显示密码或者其他敏感信息

只要输入了无效内容,以上函数就会自动提示用户:

>>> import pyinputplus as pyip
>>> response = pyip.inputNum()
five
'five' is not a number
10
>>> response
10

每次调用PyInputPlus模块的函数时,import语句中的as pyip代码让我们不必输入pyinputplus,而是可以使用较短的pyip名称。正如可以将字符串传递给input()以提供提示一样,也可以将字符串传递给PyInputPlus模块的函数的prompt关键字参数来显示提示:

>>> import pyinputplus as pyip
>>> response = pyip.inputInt(prompt='Enter a number')
Enter a number:cat
'cat' is not an Integer.
Enter a number:10
>>> response
10

关键字参数min、max、greaterThan和lessThan

接收int和float数的inputNum()、inputInt()和inputFloat()函数还具有min、max、greaterThan和lessThan关键字参数,用于指定有效值范围,例如如下例子:

>>> import pyinputplus as pyip
>>> response = pyip.inputNum('Enter num: ', min=4)
Enter num: 3
Input must be at minimum:4
Enter num: 4
>>> response
4
>>> response = pyip.inputNum('Enter num: ', greaterThan=4)
Enter num: 4
Input must be greater than 4.
Enter num: 5
>>> response
5
>>> response = pyip.inputNum('Enter num: ', min=4, lessThan=6)
Enter num: 6
Input must be less than 6.
Enter num: 3
Input must be at minimum 4.
Enter num: 4
>>> response
4

关键字参数blank

在默认情况下,除非将blank关键字参数设置为True,否则不允许输入空格字符:

>>> import pyinputplus as pyip
>>> response = pyip.inputNum('Enter num: ')
Enter num: (blank input entered here)
Blank values are not allowed.
Enter num: 40
>>> response
40
>>> response = pyip.inputNum(blank=True)
(blank input entered here)
>>> response
''

如果想使输入可选,使用blank=True,这样用户不需要输入任何内容。

关键字参数limit、timeout和default

在默认情况下,PyInputPlus模块的函数在程序运行时会一直要求用户提供有效输入,如果希望某个函数在经过一定次数的尝试或一定的时间后停止要求用户输入,就可以使用limit和timeout关键字参数。用limit关键字参数传递一个整数,以确定PyInputPlus的函数在放弃之前尝试接受有效输入多少次。用timeout关键字参数传递一个整数,以确定用户在多少秒之内必须提供有效输入,然后PyInputPlus模块的函数会放弃。

如果用户未能提供有效输入,那么这些关键字参数将分别导致函数引发RetryLimitException或TimeoutException异常。

当你使用这些关键字参数并传入default关键字参数时,该函数将返回默认值,而不是引发异常。例如:

response = pyip.inputNum(limit=2, default='N/A')
hello
'hello' is not a number
world
'world' is not a number
>>> response
'N/A'

inputNum()函数使用了default关键字参数后不会引发RetryLimitException,只会返回字符串‘N/A’.

关键字参数allowRegexes和blockRegexes

我们也可以使用正则表达式指定输入是否被接受。关键字参数allowRegexes和blockRegexes利用正则表达式字符串列表来确定PyInputPlus模块的函数将接受或拒绝哪些内容作为有效输入。例如,使用inputNum()函数将接收罗马数字以及常规数字作为有效输入:

import pyinputplus as pyip
>>> response = pyip.inputNum(allowRegexes=[r'(I|V|X|L|C|D|M)+', r'zero'])
XLII
>>> response
'XLII'

我们还可以用blockRegexes关键字参数指定PyInputPlus模块的函数不接收的正则表达式字符串列表:

import pyinputplus as pyip
>>> response = pyip.inputNum(blockRegexes=[r'[02468]$'])
42
This response is invalid.
43
>>> response
43

如果同时指定allowRegexes和blockRegexes参数,那么允许列表将优先于阻止列表。例如:

import pyinputplus as pyip
>>> response = pyip.inputStr(allowRegexes=[r'caterpillar', 'category'], blockRegexes=[r'cat'])
cat
This response is invalid
catastrophe
This response is invalid
category
>>> response
'category'

将自定义验证函数传递给inputCustom()

可以编写函数以执行自定义的验证逻辑,并将函数传递给inputCustom()。例如,我们可以创建自己的addsUpToTen()函数,然后将其传递给inputCustom()。注意,函数调用看起来像inputCustom(addsUpToTen),而不是inputCustom(addsUpToTen()),因为我们是将addsUpToTen()函数本身传递给inputCustom(),而不是调用addsUpToTen()函数并传递其返回值:

import pyinputplus as pyip
def addsUpToTen(numbers):
    numbersList = list(numbers)
    for i,digit in enumerate(numersList):
        numbersList[i] = int(digit)
    if sum(numbersList) != 10:
        raise Exception('The digits must add up to 10,not %s. ' %(sum(numbersList)))
    return int(number)


>>> response = pyip.inputCustom(addsUpToTen)
123
The digit must add up to 10,not 6.
55
>>> response
55

        

inputCustom()函数还支持常规的PyInputPlus功能,该功能可通过blank、limit、timeout、default、allowRegexes和blockRegexes关键字参数实现。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值