如何在没有`-`或`--`之前制作参数?

时间:2013-07-29 01:41:58

标签: python argparse

我最初的灵感来自。以下是我的闹钟应用程序的一部分:

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

它讨论了相互排斥的论点,但我认为追溯与实际问题无关。

3 个答案:

答案 0 :(得分:1)

如果你想让你的程序以

的形式接受参数
./yourprog time

./yourprog show

然后要么使用subparsers,要么只是让程序采用一个“命令”参数来确定它的作用。如果您希望timeshow命令采用自己的参数,则需要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')