2

为此,我主要受到的启发。这是我的闹钟应用程序的一部分:

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

它谈到了相互排斥的论点,但我认为追溯与实际问题不太相关。

4

3 回答 3

1

在您的初始设置中,--timeand--show都是可选参数,并且通过将它们放入组中,您告诉解析器它们不能同时使用。

通过删除--你已经把它们变成了位置。默认情况下,位置是必需的。将两者放在一个相互排斥的组中是没有意义的。

您可以time选择:

group.add_argument('time', nargs='?')

showwithstore_true不能设为可选,因为它需要 0 个参数。即使不在独占组中,store_true位置也没有意义(尽管允许),因为它的值将始终为true. 所以它必须保留--show

一个带有optional, 和一个可选的组positional(是的,我在这里在两种意义上使用“可选”)是可能的,并且在某些情况下可能是有意义的。

但正如其他人所建议的那样,您可以改用子解析器。

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')

于 2013-07-29T06:21:53.923 回答
1

如果你试图让你的程序接受表单中的参数

./yourprog time

或者

./yourprog show

那么要么你想使用subparsers,要么你应该让你的程序接受一个决定它做什么的“命令”参数。如果您希望timeandshow命令采用自己的参数,则需要子解析器;否则,“命令”参数会更容易。只需删除连字符即可使您的参数成为必需的位置参数,而不是命名的可选参数。这不是你想要的,它与“互斥”不兼容。

于 2013-07-29T02:01:29.907 回答
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()
于 2013-07-29T02:04:47.757 回答