argparse學習筆記

ChebyshevTST發表於2024-08-02

argparse是 Python 的一個內建模組,用於編寫使用者友好的命令列介面。使用 argparse,你可以很容易地為 Python 指令碼新增引數解析功能,使得指令碼可以接受命令列選項和引數。學起來也比較簡單,接下來我會詳細講解。

在argparse裡面,有位置引數和可選引數。位置引數是必不可少的,在命令列裡面不可以缺少這個選項,並且這個選項前不需要加-或者--一類的符號;可選引數則可有可無,使用的時候需要在選項之前加上-或者--。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int,
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
    print(f"the square of {args.square} equals {answer}")
elif args.verbosity == 1:
    print(f"{args.square}^2 == {answer}")
else:
    print(answer)

在這個例子中,首先需要建立一個ArgumentParser的物件,然後可以透過add_argument新增需要的引數。"square"前面沒有帶-或者--,這是一個位置引數,而且-v或者--verbose則是可選引數。此外,還可以在add_argument當中設定type引數來指定引數的型別。在設定完引數之後,呼叫parse_args來完成引數的解析,之後就可以愉快地去解析具體引數的值了。

python demo.py 20 -v 1/python demo.py 20 --verbose 1/python demo.py -v 1 20/python demo.py --verbose 1 20
>>20^2 == 400
// 注意,位置引數的位置順序是可以調換的。

python demo.py 20 -v 2/python demo.py 20 --verbose 2/python demo.py -v 2 20/python demo.py --verbose 2 20
>>the square of 20 equals 400

也可以這樣玩。

parser.add_argument("-v", "--verbosity", action='count',
                    help="increase output verbosity")
python demo.py 20 -v/python demo.py 20 -vv

不少Linux的命令列都是可以透過這種方式來輸出更加詳細的資訊,這樣就不用手動指定引數了。不過這段程式碼依然有缺陷,來看看:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbosity", action='count',
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity >= 2:
    print(f"the square of {args.square} equals {answer}")
elif args.verbosity >= 1:
    print(f"{args.square}^2 == {answer}")
else:
    print(answer)

當我們指定引數-vvv或者-vvvv或者更多的v的時候,反而只能輸出一個最簡單的計算結果,所以程式碼的分支條件裡面"=="改為">=",這樣就大功告成啦。為了更加完美,還可以引入靜默模式。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbosity", action='store_true',
                    help="increase output verbosity")
parser.add_argument('-q', '--quiet', action='store_true')
args = parser.parse_args()
answer = args.square**2

if args.quiet:
    print(answer)
elif args.verbosity:
    print(f"the square of {args.square} equals {answer}")
else:
    print(f"{args.square}^2 == {answer}")

這樣就有模有樣了,命令列的基本功能也齊全了。還可以組合引數:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbosity", action='store_true',
                    help="increase output verbosity")
parser.add_argument('-q', '--quiet', action='store_true')
args = parser.parse_args()

if args.verbosity:
    print('v is enabled')
if args.quiet:
    print('q is enabled')
python demo.py -v/python demo.py -q/python demo.py -vq/python demo.py -qv

看到這裡的朋友可以點點贊或者分享給身邊的朋友,以後會繼續帶來更多有關C++或者Python語言的有趣知識。