【问题标题】:How to handle dependent arguments using argparse?如何使用 argparse 处理依赖参数?
【发布时间】:2020-03-04 09:39:35
【问题描述】:

我正在尝试配置argparse,以便只有以下参数组合有效:

--flagA --argument1 val1 --argument2 val2 --argument3 val3
--flagB --argument1 val1

到目前为止,我已经编写了以下代码,但它并不能解决问题,因为 --argument2--argument3 都是可选的:

required_args = arg_parser.add_argument_group()
required_args.add_argument('--argument1', required=True)

# Optional arguments
optional_args = arg_parser.add_argument_group()
optional_args.add_argument('--argument2', required=False)
optional_args.add_argument('--argument3', required=False)

# Flags
flag_group = arg_parser.add_mutually_exclusive_group(required=True)
flag_group.add_argument('--flagA', dest='flag', action='store_const', const="flagA")
flag_group.add_argument('--flagB', dest='flag', action='store_const', const="flagB")

args = vars(arg_parser.parse_args())

使用此设置,--flagA --argument1 val1 也是,但它不应该是。

我知道我可以处理调用.parse_args() 后生成的Namespace,并检查在传递--flagA 时是否提供了--argument2--argument3,但是我正在寻找一种更自然的方法来实现这一点。

基本上,定义应如下所示:

[-h] --argument1 ARGUMENT1 (--flagA --argument2 ARGUMENT2 --argument3 ARGUMENT3 | --flagB)

【问题讨论】:

  • 互斥组是argparse 中唯一的同现工具。这是一个简单的xor。如果这对您不起作用,请使用解析后测试。尝试将argparse 用于所有事情并不是什么“自然”的事情。

标签: python arguments argparse


【解决方案1】:

您是否考虑过为这两个标志使用子解析器?

类似的东西

arg_parser = argparse.ArgumentParser()

subparser = arg_parser.add_subparsers(dest="flag", required=True)

flag_a = subparser.add_parser('flagA')
flag_a.add_argument('--argument1', required=True)
flag_a.add_argument('--argument2', required=True)
flag_a.add_argument('--argument3', required=True)

flag_b = subparser.add_parser('flagB')
flag_b.add_argument('--argument1', required=True)

希望对你有帮助

【讨论】:

  • 这不能正常工作。甚至python myscript.py --flagB --argument1 val1 也没有通过。
  • flagAflagB 不再是选项:python myscript.py flagB --argument val1
  • 这个版本可以工作,但是当你调用它们时,标志没有“--”前缀,因为该前缀会导致 arg 解析器将参数识别为新参数,而不是子命令。现在正在寻找解决方法。
猜你喜欢
  • 2014-03-19
  • 1970-01-01
  • 2017-11-26
  • 2015-02-09
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
相关资源
最近更新 更多