argparse - 禁用相同的参数出现

时间:2014-04-12 15:40:59

标签: python python-3.x argparse

我试图在一个命令行中使用argparse

禁用相同的参数出现
./python3 --argument1=something --argument2 --argument1=something_else

这意味着这应该引发一个错误,因为argument1的值被覆盖,默认情况下,argparse只是覆盖了值并且继续没有发生任何事情......有没有聪明的方法如何禁用这种行为?

2 个答案:

答案 0 :(得分:8)

我认为使用argparse无法使用原生方式,但幸运的是,argparse提供了报告自定义错误的方法。最优雅的方法可能是定义一个自定义操作来检查重复项(如果存在则退出)。

class UniqueStore(argparse.Action):
    def __call__(self, parser, namespace, values, option_string):
        if getattr(namespace, self.dest, self.default) is not None:
            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()

(阅读关于cutom行动的docs

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

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.")

答案 1 :(得分:2)

没有内置测试或约束。 positional参数只会处理一次,但标记的(或optional)参数可以重复。这样,您就可以使用appendcount操作收集多个匹配项。

大多数人都可以接受覆盖操作。为什么您的用户可能会多次使用该选项?为什么第一个应该优先考虑?

自定义动作可能是最佳选择。如果namespace[dest]已经具有非默认值,则可能引发错误。或者这个Action可以在命名空间中添加一些其他的'repeat'标志。