我最初的灵感来自git。以下是我的闹钟应用程序的一部分:
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument(
'--time',
metavar="HH:MM:SS",
help='time in 24 hour format separated by colon'
)
group.add_argument(
'--show',
action='store_true',
help='show the list of set alarms'
)
alarm = parser.parse_args()
if alarm.time:
writeTimeToTheDatabase()
if alarm.show:
extractTimeFromDatabase()
只要我从两个参数中删除--
,这一点就非常有效。我得到一个ValueError
类似于:
Traceback (most recent call last):
File "./alarm.py", line 65, in <module>
help='time in 24 hour format separated by colon'
File "/usr/lib/python2.7/argparse.py", line 1295, in add_argument
return self._add_action(action)
File "/usr/lib/python2.7/argparse.py", line 1515, in _add_action
raise ValueError(msg)
ValueError: mutually exclusive arguments must be optional
它讨论了相互排斥的论点,但我认为追溯与实际问题无关。
答案 0 :(得分:1)
如果你想让你的程序以
的形式接受参数./yourprog time
或
./yourprog show
然后要么使用subparsers,要么只是让程序采用一个“命令”参数来确定它的作用。如果您希望time
和show
命令采用自己的参数,则需要subparsers;否则,“命令”参数会更容易。简单地删除连字符会使您的参数成为必需,位置参数而不是命名的可选参数。这不是你想要的,它与“互斥”不兼容。
答案 1 :(得分:1)
事实上,你似乎不想要两个独占的参数,而只需要一个“命令”。这是位置论证的情况。
parser.add_argument('command', choices=['time', 'show'],
help='one of \'time\' or \'show\'')
alarm = parser.parse_args()
if alarm.command == "time":
writeTimeToTheDatabase()
if alarm.command == "show":
extractTimeFromDatabase()
答案 2 :(得分:1)
在初始设置中,--time
和--show
都是可选参数,通过将它们放入组中,您告诉解析器它们不能同时使用。
删除--
后,您已将其转为定位。默认情况下,需要位置。将两者放在互斥的群体中是没有意义的。
您可以选择time
:
group.add_argument('time', nargs='?')
带有show
的 store_true
无法成为可选项,因为它需要0个参数。即使不在专属组中,store_true
位置也没有意义(尽管允许),因为其值始终为true
。所以它必须保持--show
。
具有optional
和可选positional
的群组(是的,我在这里使用“可选”两种方式)是可能的,并且在某些情况下可能有意义。
但正如其他人所说,你可以使用subparsers。
parser=argparse.ArgumentParser()
sp=parser.add_subparsers()
show=sp.add_parser('show')
show.add_argument('show',action='store_true')
time=sp.add_parser('time')
time.add_argument('time')
使用此show
生成Namespace(show=True)
,time 12:34:56
生成Namespace(time='12:34:56')
。