2013-04-04 76 views
4

我有一个测试的代码如下相互排斥的群体,即应采取要么位置参数file或全部可选参数timeexpressionname如何让argparse检查参数

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

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

这里有一个简单的方法来检查正确的论点提供了:

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" 
+0

@Mathan:我想出了执行所提供的参数的手动检查类似的解决方案。我希望有一个(i)argparse独立解决方案和(ii)解决方案,当提供文件时不指定'--file' <后一个要求在我的方法中解决>。 – Alex 2013-04-04 08:04:43

+0

我不认为'argparse'是那么复杂。它确实有一个'add_mutually_exclusive_group'函数,但它确保提供了一组参数中最多一个参数。 – 2013-04-04 08:12:59

+0

我担心是这样。但是我想给这个问题一个改变,无论如何...感谢你的方法。 – Alex 2013-04-04 08:14:55

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