天天看點

快速上手 Python 指令行子產品 Click沒給id傳參,出現錯誤,提示缺少參數。

快速上手 Python 指令行子產品 Click

關于Click?

說下 Click 子產品是幹啥的,簡單說,它就是把我們的 Python 腳本的一些函數,通過

添加帶有 Click 關鍵字的裝飾器進行裝飾進而将函數調用的形式轉化為指令行傳參的形式然後執行。聽不懂也沒關系,我們會一步一步來,基本上按照我的實際應用情況來寫的。

本文不會涉及太多複雜的文法和理論,将會用通俗的語言和大家進行分享。

安裝

python3 -m pip install click

一個簡單的例子

首先我們建立一個demo.py

import click #(1)

@click.command() #(2)

def main():

click.echo("hello click") #(3)
           

if name == '__main__':

main()           

裝飾器@click.command()會将我們的函數包裝成 click 對象,然後我們可以在函數中調用 click 的一些方法,常用的是click.echo,它的作用類似我們的 print,輸出用的。

通過指令行我們可以這樣運作這行代碼

python3 demo.py

好了,我們的第一個例子完事了,我們發現此時的代碼使用不使用 click好像沒什麼差別。

接下來我們就要對它進行拓展了,如果我們需要傳入一個數字,然後列印這個時候,我們的代碼就可以這樣寫了。

傳入我們的第一個參數

import click

@click.command()

@click.option("-n", "--num", help="input a num")

def main(num):

click.echo(f"{num =}")
           
main()           

這裡我們前面代碼的基礎上給函數 main 增加了 @click.option 裝飾器。

接下來說下這幾個參數的含義

-n:表示我們在指令行指定參數名的時候使用它即可,注意是一個短'-'

--num:是第一個參數的完整名稱,我們在程式中接收值的時候使用它。注意是二個短'-'。

help:在指令行輸入 "python3 demo.py --help" 的時候,它可以提示我們這個程式有哪些指令可以用。和我們使用指令行一個道理的。

然後我們的函數main的參數名就是,我們要接收的參數的完整名稱,同時通過click.echo列印出來。,f"{num=}" 是 Python 3.8 以後的文法糖,如果 num=3 那麼它等價于 num = 3。

最後記得在 __main__ 裡執行我們的 main 方法。

好了,介紹完了代碼,我們可以運作了,運作示例:

首先假設我們不知道它有幾個參數。

python3 demo.py --help

通過help我們可以得到如下資訊

Usage: demo.py [OPTIONS]

Options:

-n, --num TEXT input a num #這是定義該字段help的提示内容

--help Show this message and exit.

Usage: 對應我們目前檔案名

Options: 是一行一個參數,一個參數分為-開頭的縮略參數,和--開頭的完整參數名。

然後我們後面可以看到它的類型是 TEXT。緊接着就是該參數的提示資訊,通過 help 我們可以設定。

python3 demo.py -n 3

#輸出

num ='3'

或者

python3 demo.py --num 3

上面兩者輸入方法是等價的使用哪個都行。

現在思考一個問題,如果我們需要 num 的值為數字類型的 3 怎麼弄呢?

聲明參數類型

這裡提供兩種方法(當然不僅兩種)

方法一:使用 type 關鍵字,type 就是 python 裡的類型

@click.option("-n", "--num",type=int,help="input a num")

再次執行代碼

python3 demo.py -n 4

num =4

同時檢視 help 資訊的時候 TEXT 變為了 INTEGER。

方法二:使用 default 關鍵字,指定預設值為 1

@click.option("-n", "--num",default=1,help="input a num")

将 default 的值設定為數字,我們的指令行就知道了我們的參數類型為 int,

這裡處理指定了參數類型,還設定了預設值。設定為預設值的參數,可以不指定其值,這時候會使用預設值。

如果我們使用 help 檢視資訊會發現和上面的方法一沒什麼差別的。這時候我們可以通過指定另外一個關鍵字,讓它在 help 資訊裡顯示預設值

@click.option("-n", "--num",default=1,help="input a num",show_default=True)

通過加入 show_default 我們可以讓 default 的值在 help 資訊中顯示了,内容格式如下:

-n, --num INTEGER input a num [default: 1]

--help Show this message and exit.

再加一個參數

在上面代碼的基礎上對代碼進行部分修改,主要是新添加一個參數 id。

@click.option("-i", "--id", required=True, help="input an id")

@click.option("-n", "--num", type=int, help="input a number", show_default=True)

def main(id, num):

click.echo(f"your {id=} {num=}")
           
main()           

給之前的函數再添加 @click.option裝飾器即可。

這裡我添加了的參數為 id ,因為一般情況下 id 是不能為空的,是以我們就可以通過required = True對它進行限制,表示該參數為必傳參數。如果不傳就出現錯誤

python3 demo.py -n 1234

沒給id傳參,出現錯誤,提示缺少參數。

Try "demo.py --help" for help.

Error: Missing option "-i" / "--id".

正确的使用方法應該是

python3 demo.py -i 1 -n 1234

到目前為止一個簡答的指令行工具就生成了。接下來說下我用它做過什麼事情。

處理實際問題

現在我們有個需求,根據使用者名去 mongo 資料庫中查找對應的使用者登入資訊,最終的生成資訊格式如下:

不好意思人太多了,讓您久等了,您的資訊來了!

使用者名:lisa

密碼: 1234qwer

登入網站:

http://www.xxxx.com

目前密碼唯一的不要修改哦!

該條消息不用回複了,謝謝。

一開始我是通過在 python 腳本中加個配置檔案,然後通過配置檔案的形式進行使用者名的修改,但是這種方式不靈活,每次都需要重新運作 Python 代碼。或者我們還可以使用 fastapi搭建一個RESTful api的服務,但是我的懶得搭這個服務。最終我選擇使用指令行的形式去運作。使用的子產品就是今天說的這個 click 子產品。

接下來寫一段需要代碼:

@click.option('-u', '--user_name', type=str, help='search user_name')

def main(user_name):

click.echo(f'search user:{user_name}')
result = m.get_user_info(user_name) #資料庫查詢
try:
    info = f"不好意思人太多了,讓您久等了,您的資訊來了!\n{'*' * 50}\n使用者名: {result.get('user_name')}\n" \
        f"密碼: {result.get('user_pwd')}\n登入網站: {result.get('url')}\n{'*' * 50}️\n目前密碼唯一的不要修改哦!\n該條消息不用回複了,謝謝。"
except Exception as e:
    info = "Not Found"
click.echo(info)
           
main()           

通過上面的碼我們就可以通過指令行的形式進行查詢了。

python3 demo.py -u 1234

非常的友善。

如果這個時候,我需要一個臨時添加使用者的功能,就需要重新寫一個函數了,

然後我們在指令行中如何控制兩個函數的運作呢?這就是接下來要說的組。

建立組的形式

所謂的建立組,就是通過一個主入口函數,去關聯其他的函數,然後其他的函數名可以作為指令直接使用。

好了首先建立一個主入口函數

@click.group()

pass

這個時候我們發現 main 上面的裝飾器變為了@click.group()。

我們通過它準備建立一個指令行組。接下來我們開始建立組成員,所謂的組成員就是一個函數。

@main.command()

@click.option('-u', '--user_name', type=str, help='add user_name')

def get_user(user_name):

click.echo(f'search user:{user_name}')           

這個組成員的作用和它的函數名是一樣的就是查詢使用者資訊。

這裡需要注意的是組成員的裝飾器由原來的

@click.command變為了@main.command。

main 就是上面 main 方法名。然後同樣下面的 option 是聲明一些參數。

接下來我們建立第二個組成員,用來添加使用者資訊。

@click.option('-u', '--user_name', required=True, type=str, help="要添加的使用者名")

@click.option('-p', '--password', required=True, type=str, help="要添加的密碼")

@click.option('-t', '--id_type', required=True, default="phone", type=str, help="添加的賬戶類型",show_default=True)

def add_user(user_name, password, id_type):

#do something.....
 click.echo(f"{user_name=}  {password=} {id_type=}")           

首先通過@main.command()将它加入到組。然後就是 option 一系列添加參數的操作。這個具體的參數資訊上面都說了這裡就不提了。好了我們就建立這兩個成員,

如果需要其他的功能,比如說删除使用者,可以繼續添加一個 delete_user 函數,以此類推。

下面我就說下如何執行上面的兩個成員函數。

首先,先看下它的 help 指令,都有什麼内容,一般不知道一個指令行應用有什麼指令參數的我時候我們可以使用它。

python3 demo.py --help

輸出以下内容

Usage: demo.py [OPTIONS] COMMAND [ARGS]...

--help Show this message and exit.

Commands:

add-user

get-user

其中 Commands 就是我們的成員函數的調用指令,需要注意一下它将函數原來的"_"變為了“-”。

然後我們就可以調用查詢方法了

python3 demo.py get-user -u 123

然後我們就可以得到結果

search user:123

同樣的調用添加使用者資訊的方法。

python3 demo.py add-user -u 123 -p "1234qwer"

因為-t不是必傳參數是以我們可以忽略,使用預設值"phone"。

好了,這就是今天要說的内容,基本上夠日常操作了。

更多内容,感興趣的朋友可以參考官方文檔。

原文位址

https://www.cnblogs.com/c-x-a/p/12461646.html