我正在尝试使用 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()
这将产生答案
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.")
没有内置的测试或约束。
positional
参数将仅处理一次,但标记的(或 optional
)参数可以如您所说重复。 这使您可以通过 append
或 count
操作收集多个出现的情况。
覆盖动作对于大多数人来说是可以接受的。 为什么您的用户可能多次使用该选项? 为什么应该优先选择第一个而不是最后一个?
自定义操作可能是最好的选择。 如果
namespace[dest]
已经具有非默认值,则可能会引发错误。 或者此操作可以向命名空间添加一些其他“重复”标志。