argparse - 禁用相同的参数出现

问题描述 投票:0回答:2

我正在尝试使用 argparse 禁用一个命令行中出现相同的参数

./python3 --argument1=something --argument2 --argument1=something_else

这意味着这应该会引发错误,因为 argument1 的值被覆盖,默认情况下,argparse 只是覆盖该值并像什么都没发生一样继续...是否有任何聪明的方法来禁用此行为?

python python-3.x argparse
2个回答
20
投票

我认为没有一种原生方法可以使用

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

这将产生答案

usage: prog.py [-h] [-f FOO]
prog.py: error: --foo appears several times.

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

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

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
投票

没有内置的测试或约束。

positional
参数将仅处理一次,但标记的(或
optional
)参数可以如您所说重复。 这使您可以通过
append
count
操作收集多个出现的情况。

覆盖动作对于大多数人来说是可以接受的。 为什么您的用户可能多次使用该选项? 为什么应该优先选择第一个而不是最后一个?

自定义操作可能是最好的选择。 如果

namespace[dest]
已经具有非默认值,则可能会引发错误。 或者此操作可以向命名空间添加一些其他“重复”标志。

© www.soinside.com 2019 - 2024. All rights reserved.