argparse-禁止出现相同的参数



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

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

这意味着这应该会引发一个错误,因为argument1的值被覆盖,默认情况下,argparse只是覆盖该值并像什么都没发生一样继续。。。有什么聪明的方法可以禁止这种行为吗?

我不认为有使用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()

(阅读有关割接操作的文档)

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

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

没有内置的测试或约束。positional参数将只处理一次,但正如您所说,标记的(或optional)参数可以重复。这使您可以使用appendcount操作收集多个事件。

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

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

相关内容

  • 没有找到相关文章

最新更新