【问题标题】:argparse - disable same argument occurrencesargparse - 禁用相同的参数出现
【发布时间】:2014-05-26 18:50:29
【问题描述】:

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

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

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

【问题讨论】:

    标签: python python-3.x argparse


    【解决方案1】:

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

    (阅读docs 关于自定义操作)

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

    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)的参数可以重复。这使您可以使用appendcount 操作收集多个事件。

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

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

      【讨论】:

        猜你喜欢
        • 2021-06-05
        • 2022-01-07
        • 2015-12-24
        • 2020-04-05
        • 1970-01-01
        • 2015-06-16
        • 2018-10-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多