20220727Python学习

本篇文章代码来自《Python编程快速上手——让繁琐工作自动化》

第8章:输入验证

PyInputPlus模块

PyInputPlus包含与input()类似的、用于多种数据的函数。如果用户输入了无效的内容,例如格式错误的日期或超出预期范围的数据,那么PyInputPlus会再次提示他们输入。

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

inputStr():类似于内置的input()函数,但具有一般PyInputPlus功能。你还可以将自定义验证函数传递给它。

inputNum():确保用户输入数字并返回int或float值,这取决于数字是否包含小数点。

inputChoice():确保用户输入系统提供的选项之一。

inputMenu():与inputChoice()类似,但提供一个带有数字或字母选项的菜单

inputDatetime():确保用户输入日期和时间

inputYesNo():确保用户输入“yes”或"no"响应。

inputBool():类似inputYesNo(),但接受"True"或“False”响应,并返回一个布尔值。

inputEmail():确保用户输入有效的E-maile地址

inputFilePate():确保用户输入有效的文件路径和文件名,并可以选择检查是否存在具有该名称的文件

inputPassowrd():类似于内置的input(),但是在用户输入时显示*字符,因此不会在屏幕上显示口令或其他敏感信息。

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

使用Python的help()函数查找有关函数的更多信息。

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

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

关键字参数blank

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

>>> import pyinputplus as pyip 
>>> response = pyip.inputNum('Enter num: ') 
Enter num: 42 
>>> response 
42
>>> response = pyip.inputNum(blank = True)
*(blank inout entered here)*
>>> response
''

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

关键字参数limit、timeout和default

在默认情况下,PyInputPlus模块的函数会一直(或在程序运行时)要求用户提供有效输入。如果你希望某个函数在经过一定次数的尝试或一定的时间后提供要求用户输入,就可以使用limit或timeout关键字参数。

用limit关键字参数传递一个整数,以确定PyInputPlus的函数在放弃之前尝试接收有效输入多少次。用timeout关键字参数传递一个整数,以确定用户在多少秒之内必须提供有效输入,然后PyinpuPlus模块的函数会放弃。

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

>>> import pyinputplus as pyip
>>> response = pyip.inputNum(limit=2)
blank
'blank' is not a number.
>>> response = pyip.inputNum(timeout=10)
42

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

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

inputNum()函数不会引发RetryLimitException,只返回字符串“N/A”

关键字参数allowRegexex和blockRegexes

关键字参数allowRegexes和blockRegexes利用正则表达式字符串来确定PyInputPlus模块的函数将接收或拒绝哪些内容作为有效输入。

>>> import pyinputplus as pyip
>>> response = pyip.inputNum(allowRegexes=[r'(I|V|X|L|C|D|M)+', r'zero'])
XLII
>>> response
'XLII'
>>> response = pyip.inputNum(allowRegexes=[r'(i|v|x|l|c|d|m)+', r'zero'])
xlii
>>> response
'xlii'

当然,这个正则表达式仅影响inputNum()函数从用户那里接收的字符。

你还可以用blockRegexes关键字参数指定PyInputPlus模块的函数不接收的正则表达式字符串列表。在交互环境下输入以下内容,使得inputNum()不接收偶数作为有效输入:

>>> import pyinputplus as pyip
>>> response = pyip.inputNum(blockRegexes=[r'[02468]$'])
42
This response is invalid.
44
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'

PyInputPlus模块的函数可以避免你自己编写繁琐的输入验证代码。

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

>>> import pyinputplus as pyip
>>> def addsUpToTen(numbers):
... numbersList = list(numbers)
... for i, digit in enumerate(numbersList):
... numbersList[i] = int(digit)
... if sum(numbersList) != 10:
... raise Exception('The digits must add up to 10, not %s.' % (sum(numbersList)))
... return int(numbers) # Return an int form of numbers.
...
>>> response = pyip.inputCustom(addsUpToTen) # No parentheses after addsUp
ToTen here.
123
The digits must add up to 10, not 6.
1235
The digits must add up to 10, not 11.
1234
>>> response # inputStr() returned an int, not a string.
1234
>>> response = pyip.inputCustom(addsUpToTen)
hello
invalid literal for int() with base 10: 'h'
55
>>> response

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

posted @ 2022-07-28 20:57  Diligent_Maple  阅读(67)  评论(0编辑  收藏  举报