[英]Argparse required options with variable parameters?
我正在編寫的程序需要3個輸入之一。
2個輸入需要一個附加參數。 1個輸入需要2個附加參數。 一次只能輸入其中之一。
如何使用argparse
模塊確保這一點?
請參閱下面的代碼,了解到目前為止我已經嘗試過的內容。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-d',
default='temp.file')
parser.add_argument('command',
choices=['g', 's', 'm'])
args = parser.parse_args()
>>> prog.py g # requires 1 param.
>>> prog.py s # requires 1 param.
>>> prog.py m # requires 2 params.
g
, s
和m
是子命令,可以使用子解析器實現。
p = ArgumentParser()
p.add_argument('-d', default='temp.file')
subparsers = p.add_subparsers()
g_parser = subparsers.add_parser('g')
g_parser.add_argument('g_foo')
s_parser = subparsers.add_parser('s')
s_parser.add_argument('s_foo')
m_parser = subparsers.add_parser('m')
m_parser.add_argument('m_foo')
m_parser.add_argument('m_bar')
當調用p.parse_args
,則g_foo
等。 僅在使用適當的子命令時才會出現在結果中。 例如:
>>> p.parse_args(['g', '3'])
Namespace(d='temp.file', g_foo='3')
>>> p.parse_args(['m', '4', '5'])
Namespace(d='temp.file', m_foo='4', m_bar='5')
看起來像是互斥組的好用法
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-d',
default='temp.file')
mx = parser.add_mutually_exclusive_group(required=True)
mx.add_argument('-g')
mx.add_argument('-s')
mx.add_argument('-m', nargs=2)
args = parser.parse_args()
print(args)
樣品運行:
1316:~/mypy$ python3 stack56926264.py -h
usage: stack56926264.py [-h] [-d D] (-g G | -s S | -m M M)
optional arguments:
-h, --help show this help message and exit
-d D
-g G
-s S
-m M M
1527:~/mypy$ python3 stack56926264.py -g foo
Namespace(d='temp.file', g='foo', m=None, s=None)
1528:~/mypy$ python3 stack56926264.py -s bar
Namespace(d='temp.file', g=None, m=None, s='bar')
1528:~/mypy$ python3 stack56926264.py -m 1 2
Namespace(d='temp.file', g=None, m=['1', '2'], s=None)
並捕獲一些錯誤:
1528:~/mypy$ python3 stack56926264.py -m 1 2 -s bar -d afile
usage: stack56926264.py [-h] [-d D] (-g G | -s S | -m M M)
stack56926264.py: error: argument -s: not allowed with argument -m
1528:~/mypy$ python3 stack56926264.py -m 1
usage: stack56926264.py [-h] [-d D] (-g G | -s S | -m M M)
stack56926264.py: error: argument -m: expected 2 arguments
1530:~/mypy$ python3 stack56926264.py -d afile
usage: stack56926264.py [-h] [-d D] (-g G | -s S | -m M M)
stack56926264.py: error: one of the arguments -g -s -m is required
您可以做的就是檢查一下自己是否符合您的邏輯:
parser = argparse.ArgumentParser()
parser.add_argument('-d',
default='temp.file')
parser.add_argument('command',
choices=['g', 's', 'm'])
parser.add_argument('additionals',
nargs='+')
args = parser.parse_args()
if args.command in ('g', 's') and len(args.additionals) != 1:
print("Commands g and s require 1 argument")
elif args.command == 'm' and len(args.additionals) != 2:
print("Command m require 2 arguments")
解決此問題的另一種方法是將這些命令分隔為不同的參數,並使用相應數量的所需其他參數:
parser = argparse.ArgumentParser()
parser.add_argument('-d',
default='temp.file')
parser.add_argument('-g',
nargs=1)
parser.add_argument('-s',
nargs=1)
parser.add_argument('-m',
nargs=2)
args = parser.parse_args()
閱讀有關nargs的信息 ,了解如何對一個動作使用多個參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.