argparse - 禁用相同的参数出现

12
我正在尝试使用argparse禁用同一命令行中的相同参数。
./python3 --argument1=something --argument2 --argument1=something_else

这意味着应该会引发错误,因为参数1的值被覆盖了。默认情况下,argparse只会覆盖该值并继续执行,就像什么都没有发生一样...有没有更聪明的方式来禁用这种行为?
2个回答

16

我认为使用argparse没有本地的方法来做到这一点,但是幸运的是,argparse提供了报告自定义错误的方法。最优雅的方式可能是定义一个自定义操作,检查是否有重复的内容(如果有则退出)。

class UniqueStore(argparse.Action):
    def __call__(self, parser, namespace, values, option_string):
        if getattr(namespace, self.dest, self.default) is not self.default:
            parser.error(option_string + " appears several times.")
        setattr(namespace, self.dest, values)

parser = argparse.ArgumentParser()
parser.add_argument('-f', '--foo', action=UniqueStore)

args = parser.parse_args()

(阅读关于自定义操作的文档)

另一种方法是使用追加操作并计算列表长度。

parser = argparse.ArgumentParser()
parser.add_argument('-f', '--foo', action='append')
args = parser.parse_args()

if len(args.foo) > 1:
    parser.error("--foo appears several times.")

2

没有内置的测试或约束条件。一个位置参数只会被处理一次,但是标记(或可选)的参数可以像你所说的那样重复。这让您可以使用appendcount操作收集多个出现次数。

覆盖操作对大多数人都是可接受的。为什么用户可能会多次使用该选项?为什么第一个选项应该优先于最后一个选项?

自定义操作可能是最佳选择。如果namespace[dest]已经具有非默认值,则它可以引发错误。或者此操作可以向命名空间添加其他“重复”标志。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接