一两个参数之间的argparse互斥

时间:2019-01-04 05:22:51

标签: python arguments 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)
onr.add_argument("-x")
onr2 = onr.add_argument_group("new")
onr2.add_argument("-y")
onr2.add_argument("-z")

所以我想要的是,用户必须提供x或同时提供yz,所以考虑添加一个互斥的一组参数和一组参数。并且它必须在子命令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

没有关于yz的信息,也同时给出了yz的信息

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实现此目的,或者甚至有可能吗?

1 个答案:

答案 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

有效。