如何让argparse检查互斥的参数组

时间:2013-04-04 07:18:16

标签: python python-2.7 argparse

我有一个如下测试代码,它应该使用位置参数file或所有可选参数timeexpressionname

import argparse
parser = argparse.ArgumentParser()

parser.add_argument("-t","--time")
parser.add_argument("-x","--expression")
parser.add_argument("-n","--name")
parser.add_argument("file")

print parser.parse_args()

以下组合应该有效

test.py filename
test.py -t 5 -x foo -n test

但不是这些:

test.py filename -t 5 # should raise error because the positional and the optional -t argument cannot be used together
test.py -t 5 -x foo # should raise an error because all three of the optional arguments are required

该问题的任何简单解决方案?

2 个答案:

答案 0 :(得分:3)

第一个问题是您已指定该文件是位置,这将使其成为必需。您可能需要将其转换为可选参数。

这是检查是否提供了正确参数的简单方法:

import argparse
parser = argparse.ArgumentParser()

parser.add_argument("-t","--time")
parser.add_argument("-x","--expression")
parser.add_argument("-n","--name")
parser.add_argument("-f", "--file")

args = parser.parse_args()

has_file = args.file is not None
has_txn = None not in frozenset([args.time, args.expression, args.name])
assert (has_file ^ has_txn), "File or time, expression and name must be provided"

答案 1 :(得分:0)

您可能会发现以下方法很有用。

import argparse, sys

print(sys.argv)
if len(sys.argv) == 2:
    sys.argv += ['-t', 'time', '-x', 'expression', '-n', 'name']
else:
    sys.argv.append('FILE')

parser = argparse.ArgumentParser()
group = parser.add_argument_group('Required Group', 'All 3 are required else provide "file" argument.')
group.add_argument("-t","--time", required=True)
group.add_argument("-x","--expression", required=True)
group.add_argument("-n","--name", required=True)
parser.add_argument("file", help='file name')
print(parser.parse_args())

以下是一些示例输出..

$ ./t.py -t 2 -x "a + b" -n George
['./t.py', '-t', '2', '-x', 'a + b', '-n', 'George']
Namespace(expression='a + b', file='FILE', name='George', time='2')

$ ./t.py FILE
['./t.py', 'FILE']
Namespace(expression='expression', file='FILE', name='name', time='time')

$ ./t.py -h
usage: t.py [-h] -t TIME -x EXPRESSION -n NAME file

positional arguments:
  file                  file name

optional arguments:
  -h, --help            show this help message and exit

Required Group:
  All 3 are required else provide "file" argument.

  -t TIME, --time TIME
  -x EXPRESSION, --expression EXPRESSION
  -n NAME, --name NAME