这是我想要做的最少的代码,
import argparse
parser = argparse.ArgumentParser( prog="test")
subparsers = parser.add_subparsers(title='sub-commands')
num = subparsers.add_parser("num")
num.add_argument("-n")
numr = num.add_argument_group("Required arguments")
onr =numr.add_mutually_exclusive_group(required=True)
onr.add_argument("-x")
onr2 = onr.add_argument_group("new")
onr2.add_argument("-y")
onr2.add_argument("-z")
所以我想要的是,用户必须提供x
或同时提供y
,z
,所以考虑添加一个互斥的一组参数和一组参数。并且它必须在子命令num
下。这段代码给出了输出
usage: test num [-h] [-n N] -x X [-y Y] [-z Z]
optional arguments:
-h, --help show this help message and exit
-n N
Required arguments:
-x X
没有关于y
,z
的信息,也同时给出了y
,z
的信息
python test.py num -y 9 -z 10
usage: test num [-h] [-n N] -x X [-y Y] [-z Z]
test num: error: one of the arguments -x is required
如何使用argparse实现此目的,或者甚至有可能吗?
答案 0 :(得分:1)
我建议删除对x,y,z的幻想测试,并在解析后自行进行。在KILL {sid}
本身中尝试执行此操作的逻辑太复杂。测试虽然还不错,但是良好的用户界面却很难。
argparse
示例会话:
import argparse
parser = argparse.ArgumentParser( prog="test")
subparsers = parser.add_subparsers(title='sub-commands')
num = subparsers.add_parser("num")
num.add_argument("-n")
numr = num.add_argument_group("Required arguments")
#onr =numr.add_mutually_exclusive_group(required=True)
numr.add_argument("-x")
#onr2 = onr.add_argument_group("new")
numr.add_argument("-y")
numr.add_argument("-z")
args = parser.parse_args()
print(args)
if args.x is None:
if args.y is None or args.z is None:
parser.error('both y and z are required')
我探索了在https://bugs.python.org/issue11588中允许使用具有广义逻辑的嵌套组(向argparse添加“必需包含”组)。我当前的想法是,最好让您访问1122:~/mypy$ python3 stack54033455.py -h
usage: test [-h] {num} ...
optional arguments:
-h, --help show this help message and exit
sub-commands:
{num}
2212:~/mypy$ python3 stack54033455.py num -h
usage: test num [-h] [-n N] [-x X] [-y Y] [-z Z]
optional arguments:
-h, --help show this help message and exit
-n N
Required arguments:
-x X
-y Y
-z Z
2212:~/mypy$ python3 stack54033455.py num -x foo
Namespace(n=None, x='foo', y=None, z=None)
2212:~/mypy$ python3 stack54033455.py num -y foo
Namespace(n=None, x=None, y='foo', z=None)
usage: test [-h] {num} ...
test: error: both y and z are required
2212:~/mypy$ python3 stack54033455.py num -y foo -z bar
Namespace(n=None, x=None, y='foo', z='bar')
集,因此您可以进行使用情况测试,而不必依赖seen_actions
测试。当前的用法格式化程序过于脆弱,无法一概而论。
使用:
is None
有效。