parser.add_argument('-i', '--integers', nargs='?', const=100, type=int, help='input a number')
引數nargs:
nargs='*' 表示引數可設定0個或多個,引數是一個列表
nargs='+' 表示引數可設定1個或多個,引數是一個列表
nargs='?' 表示引數可設定0個或1個
1、引數名後面必須跟值的情況
1)沒有設定nargs
2)設定了nargs='+'
2、使用引數但不跟值的條件
使用nargs='?', 且新增const設定一個引數值。
3、使用時不顯式掉用引數但給引數賦預設值
新增default屬性即可。
例如:
import argparse
parser = argparse.ArgumentParser(description='This is a parse demo')
parser.add_argument('-i', '--integers', nargs='?', const=10, default=100, type=int, help='input a number')
args = parser.parse_args()
print(args.integers)
# 顯式呼叫
$ python t3.py -i 1
1
# 使用const屬性
$ python t3.py -i
10
# 使用引數的預設值
$ python t3.py
100
4、action--命令列引數與動作相關聯
action 命名引數指定了這個命令列引數應當如何處理。
parser.add_argument('--foo', action='store_true', default=False)
如果希望兩個或多個引數互斥。可以使用argparse.ArgumentParser.add_mutually_exclusive_group() 功能.
1、引陣列
瞭解互斥之前先看下引陣列(group),group功能可以把引數分為不同的組,以更加清晰的方式顯示引數資訊。
import argparse
parser = argparse.ArgumentParser(description='This is a parse demo')
group1 = parser.add_argument_group('group1', 'group1 description')
group1.add_argument('--foo', help='foo help')
group1.add_argument('--foo2', help='foo1 help')
group2 = parser.add_argument_group('group2', 'group2 description')
group2.add_argument('--bar', help='bar help')
group2.add_argument('--bar2', help='bar2 help')
args = parser.parse_args()
print(args)
# 測試
$ python t3.py -h
usage: t3.py [-h] [--foo FOO] [--foo2 FOO2] [--bar BAR] [--bar2 BAR2]
This is a parse demo
optional arguments:
-h, --help show this help message and exit
group1:
group1 description
--foo FOO foo help
--foo2 FOO2 foo1 help
group2:
group2 description
--bar BAR bar help
--bar2 BAR2 bar2 help
2、互斥組
建立一個互斥組。 argparse 將會確保互斥組中只有一個引數在命令列中可用。
import argparse
parser = argparse.ArgumentParser(description='This is a parse demo')
group = parser.add_mutually_exclusive_group()
group.add_argument('--foo', action='store_true')
group.add_argument('--bar', action='store_false')
args = parser.parse_args()
print(args)
# 測試互斥組
$ python t3.py --foo
Namespace(foo=True, bar=True)
$ python t3.py --bar
Namespace(foo=False, bar=False)
$ python t3.py --foo --bar
usage: t3.py [-h] [--foo | --bar]
t3.py: error: argument --bar: not allowed with argument --foo
在程式碼功能較多時,使用子命令可以把相關的小功能合併為一類命令,然後用二級引數進一步精細控制。這樣能讓程式碼更加模組化,提高可讀性同時也便利了使用者呼叫。例如git的commit就是一個子命令,commit是一個大類命令,而commit本身還有很多二級引數。
import argparse
def add(arguments):
print(f'{arguments.x} + {arguments.y} = {arguments.x + arguments.y}')
def sub(arguments):
print(f'{arguments.x} - {arguments.y} = {arguments.x - arguments.y}')
# create the top-level parser
parser = argparse.ArgumentParser(description='This is a parse demo')
subparsers = parser.add_subparsers()
# create the parser for command 'add'
add_parser = subparsers.add_parser('add', help='calc add')
add_parser.add_argument('-x', type=int, help='x value')
add_parser.add_argument('-y', type=int, help='y value')
add_parser.set_defaults(func=add)
# create the parser for command 'sub'
sub_parser = subparsers.add_parser('sub', help='calc sub')
sub_parser.add_argument('-x', type=int, help='x value')
sub_parser.add_argument('-y', type=int, help='y value')
sub_parser.set_defaults(func=sub)
args = parser.parse_args()
print(f"print the input: x={args.x}, y={args.y}")
args.func(args) # 跳轉到對應的函數
# 測試
$ python t2.py add -x 1 -y=2
print the input: x=1, y=2
1 + 2 = 3
$ python t2.py sub -x 1 -y 2
print the input: x=1, y=2
1 - 2 = -1
需要注意的是:parse_args只返回主解析器和子命令對應的子解析器的屬性,沒有其他子命令的解析器,因此上面例子add和sub不可同時呼叫。也就是說subparser不支援多個子命令同時使用。
argparse — Parser for command-line options, arguments and sub-commands — Python 3.8.14 documentation