詳解Python中的PyInputPlus模塊
“輸入驗證”代碼檢查用戶輸入值,在Python中我們用的最多的是input()函數(shù),但是有些情況下反復(fù)使用input()函數(shù)可能會遺漏某些場景,并且該函數(shù)允許無效輸入通過檢查。因此我們需要使用Python的第三方模塊PyInputPlus進(jìn)行輸入驗證。
PyInputPlus包含與input()類似的、用戶多種數(shù)據(jù)(數(shù)字日期、E-mail地址等)的函數(shù)。如果用戶輸入了無效的內(nèi)容,例如格式錯誤的日期或超出預(yù)期范圍的數(shù)字,PyIputPlus會再次提示他們輸入。PyInputPlus還包含其他有用的功能,例如提示用戶的次數(shù)限制和時間限制(如果要求用戶在時限內(nèi)作出響應(yīng))。
安裝PyInputPlus
PyInputPlus不是Python標(biāo)準(zhǔn)庫的一部分,因此需要使用pip單獨安裝。命令如下:
pip install --user pyinputplus
PyInputPlus具有以下幾種用于不同類型輸入的函數(shù):
inputStr()類似于內(nèi)置的input()函數(shù),但具有一般的PyInputPlus功能inputNum()確保用戶輸入數(shù)字并返回int或float值,這取決于數(shù)字是否包含小數(shù)點inputChoice()確保用戶輸入習(xí)題提供的選項之一inputMenu()與inputChoice類似,但提供一個帶有數(shù)字或字母選項的菜單inputDatetime()確保用戶輸入日期和時間inputYesNo()確保用戶輸入“yes”或“no”響應(yīng)inputBool()類似inputYesNo(),但接收“True”或“False”響應(yīng),并返回一個布爾值inputEmail()確保用戶輸入有效的E-mail地址inputFilepath()確保用戶輸入有效的文件路徑和文件名,并可以選擇檢查是否存在具有該名稱的文件inputPassword()類似于內(nèi)置的input(),但是在用戶輸入時顯示*字符,因此不會在屏幕上顯示密碼或者其他敏感信息只要輸入了無效內(nèi)容,以上函數(shù)就會自動提示用戶:
>>> import pyinputplus as pyip >>> response = pyip.inputNum() five 'five' is not a number 10 >>> response 10
每次調(diào)用PyInputPlus模塊的函數(shù)時,import語句中的as pyip代碼讓我們不必輸入pyinputplus,而是可以使用較短的pyip名稱。正如可以將字符串傳遞給input()以提供提示一樣,也可以將字符串傳遞給PyInputPlus模塊的函數(shù)的prompt關(guān)鍵字參數(shù)來顯示提示:
>>> 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
關(guān)鍵字參數(shù)min、max、greaterThan和lessThan
接收int和float數(shù)的inputNum()、inputInt()和inputFloat()函數(shù)還具有min、max、greaterThan和lessThan關(guān)鍵字參數(shù),用于指定有效值范圍,例如如下例子:
>>> 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
關(guān)鍵字參數(shù)blank
在默認(rèn)情況下,除非將blank關(guān)鍵字參數(shù)設(shè)置為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,這樣用戶不需要輸入任何內(nèi)容。
關(guān)鍵字參數(shù)limit、timeout和default
在默認(rèn)情況下,PyInputPlus模塊的函數(shù)在程序運行時會一直要求用戶提供有效輸入,如果希望某個函數(shù)在經(jīng)過一定次數(shù)的嘗試或一定的時間后停止要求用戶輸入,就可以使用limit和timeout關(guān)鍵字參數(shù)。用limit關(guān)鍵字參數(shù)傳遞一個整數(shù),以確定PyInputPlus的函數(shù)在放棄之前嘗試接受有效輸入多少次。用timeout關(guān)鍵字參數(shù)傳遞一個整數(shù),以確定用戶在多少秒之內(nèi)必須提供有效輸入,然后PyInputPlus模塊的函數(shù)會放棄。
如果用戶未能提供有效輸入,那么這些關(guān)鍵字參數(shù)將分別導(dǎo)致函數(shù)引發(fā)RetryLimitException或TimeoutException異常。
當(dāng)你使用這些關(guān)鍵字參數(shù)并傳入default關(guān)鍵字參數(shù)時,該函數(shù)將返回默認(rèn)值,而不是引發(fā)異常。例如:
response = pyip.inputNum(limit=2, default='N/A') hello 'hello' is not a number world 'world' is not a number >>> response 'N/A'
inputNum()函數(shù)使用了default關(guān)鍵字參數(shù)后不會引發(fā)RetryLimitException,只會返回字符串‘N/A’.
關(guān)鍵字參數(shù)allowRegexes和blockRegexes
我們也可以使用正則表達(dá)式指定輸入是否被接受。關(guān)鍵字參數(shù)allowRegexes和blockRegexes利用正則表達(dá)式字符串列表來確定PyInputPlus模塊的函數(shù)將接受或拒絕哪些內(nèi)容作為有效輸入。例如,使用inputNum()函數(shù)將接收羅馬數(shù)字以及常規(guī)數(shù)字作為有效輸入:
import pyinputplus as pyip >>> response = pyip.inputNum(allowRegexes=[r'(I|V|X|L|C|D|M)+', r'zero']) XLII >>> response 'XLII'
我們還可以用blockRegexes關(guān)鍵字參數(shù)指定PyInputPlus模塊的函數(shù)不接收的正則表達(dá)式字符串列表:
import pyinputplus as pyip >>> response = pyip.inputNum(blockRegexes=[r'[02468]$']) 42 This response is invalid. 43 >>> response 43
如果同時指定allowRegexes和blockRegexes參數(shù),那么允許列表將優(yōu)先于阻止列表。例如:
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'
將自定義驗證函數(shù)傳遞給inputCustom()
可以編寫函數(shù)以執(zhí)行自定義的驗證邏輯,并將函數(shù)傳遞給inputCustom()。例如,我們可以創(chuàng)建自己的addsUpToTen()函數(shù),然后將其傳遞給inputCustom()。注意,函數(shù)調(diào)用看起來像inputCustom(addsUpToTen),而不是inputCustom(addsUpToTen()),因為我們是將addsUpToTen()函數(shù)本身傳遞給inputCustom(),而不是調(diào)用addsUpToTen()函數(shù)并傳遞其返回值:
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()函數(shù)還支持常規(guī)的PyInputPlus功能,該功能可通過blank、limit、timeout、default、allowRegexes和blockRegexes關(guān)鍵字參數(shù)實現(xiàn)。
到此這篇關(guān)于Python中的PyInputPlus模塊詳解的文章就介紹到這了,更多相關(guān)Python PyInputPlus模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實戰(zhàn)小項目之Mnist手寫數(shù)字識別
MNIST 數(shù)據(jù)集已經(jīng)是一個被”嚼爛”了的數(shù)據(jù)集, 很多教程都會對它”下手”, 幾乎成為一個 “典范”. 不過有些人可能對它還不是很了解, 下面通過一個小實例來帶你了解它2021-10-10python采用django框架實現(xiàn)支付寶即時到帳接口
這篇文章主要介紹了python采用django框架實現(xiàn)支付寶即時到帳接口的相關(guān)資料,需要的朋友可以參考下2016-05-05關(guān)于Python網(wǎng)絡(luò)爬蟲框架scrapy
這篇文章主要介紹了關(guān)于Python網(wǎng)絡(luò)爬蟲框架scrapy,爬蟲框架是實現(xiàn)爬蟲功能的一個軟件結(jié)構(gòu)和功能組件的集合,需要的朋友可以參考下2023-04-04