2023-11-28|閱讀時間 ‧ 約 4 分鐘

【💊 Python的解憂錦囊】Click如何驗證參數?

raw-image


我們在「【🔒 Python 先修班】👆 打造友善的使用者互動CLI介面」有介紹Python的Click命令列參數設計介面的方式, 那我們除了設計出介面提供使用者互動之外, 有時候也需要一點驗證機制, 畢竟我們心裡都清楚「garbage in, garbage out」的後果, 為了減少這種狀況, 我們針對一些非常重要的參數就會需要來點驗證, 但Click可以怎麼做呢?

善用Callbacks來自訂驗證函數

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套件, 那麼我們會推薦您以下的文章進行學習:

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.