我們在「【🔒 Python 先修班】👆 打造友善的使用者互動CLI介面」有介紹Python的Click命令列參數設計介面的方式, 那我們除了設計出介面提供使用者互動之外, 有時候也需要一點驗證機制, 畢竟我們心裡都清楚「garbage in, garbage out」的後果, 為了減少這種狀況, 我們針對一些非常重要的參數就會需要來點驗證, 但Click可以怎麼做呢?
click的@option參數中有一個參數是callback, 也就是當使用者輸入參數後進行呼叫的函數, 此時我們就可以在該函數進行驗證的邏輯檢查, 避免用戶輸入到有害的資料造成不必要的麻煩, 並且我們可以引發「BadParameter」來告知使用者哪裡錯了。
訊息的呈現會進行自動化格式, 大致如下:
Error: Invalid value for '--val': 錯誤訊息
那麼首先我們可以設計一個validate的函數來驗證輸入值必須小於100且為整數:
import click
def validate(ctx: click.Context, param: click.Parameter, value: int) -> int:
"""驗證整數必須小於100
"""
try:
if value > 100:
raise ValueError(f'您輸入的值為 {value} 必須小於等於 100')
return value
except ValueError as e:
raise click.BadParameter(
e,
ctx,
param,
)
接著我們在click.option可以掛入該函數:
@click.command()
@click.option(
"--val",
type=click.INT,
callback=validate,
)
def run(**options):
print(options)
run()
首先是輸入非整數的部份, 將出現以下的錯誤訊息:
python test.py --val str
# 出現的訊息如下:
Usage: test.py [OPTIONS]
Try 'test.py --help' for help.
Error: Invalid value for '--val': 'str' is not a valid integer.
再來是輸入101看看是否會出現我們預期的錯誤訊息:
python test.py --val 101
# 出現的訊息如下:
Usage: test.py [OPTIONS]
Try 'test.py --help' for help.
Error: Invalid value for '--val': 您輸入的值為 101 必須小於等於 100
最後測試一下合法的輸入值:
python test.py --val 5
# 出現以下參數訊息
{'val': 5}
Python的click套件對於設計CLI介面來說真的非常的方便, 除了提供基本的參數驗證機制之外, 也讓我們高度客製化我們的驗證機制, 讓我們面對於各種使用者時有一個統一的標準介面, 並且提供足夠的訊息來導引使用者填入正確的參數, 也避免我們後續作業上的資料錯誤與複雜度, 如果您還不知道Python的click套件, 那麼我們會推薦您以下的文章進行學習: