【问题标题】:Python argparse mutually exclusive with optional arguments [duplicate]Python argparse与可选参数互斥[重复]
【发布时间】:2017-01-17 06:09:51
【问题描述】:

我的要求是使用 argparse 实现以下目标:

script.py <command> (-a|--first-name [--middle-name] [--last-name])

所以基本上,脚本会接受一个强制参数,它可以有不同的值。然后是另一个参数,它应该是 -a 或 --first-name。 那么 first-name 可以有更多的参数。

我正在探索子解析器和互斥组,但不知道如何实现这一点

我处理这个问题的一种粗略方式是

parser = argparse.ArgumentParser(prog='myscript', usage='%(prog)s <command> (-a|--first-name [--middle-name] [--last-name])')
parser.add_argument('command')

mxgroup = parser.add_mutually_exclusive_group(required=True)
mxgroup.add_argument('-a', action='store_true', help='Choose all')
mxgroup.add_argument('--first-name', dest='fname')

parser.add_argument('--middle-name', dest='mname')
parser.add_argument('--last-name', dest='lname')

args = parser.parse_args()

if (args.mname or args.lname) and not args.fname:
    parser.error('middle and last names may be specified with first name only')

但我在想,如果这些检查可以由 argparse 固有地处理,那么随着脚本的增长,我就不必重做

任何帮助将不胜感激

【问题讨论】:

  • 所以你想让用户指定--middle-name--last-name如果他们还指定--first-name--middle-name--last-name 之间是否存在依赖关系?或者用户可以只指定名字+姓氏还是名字+中间名?
  • 中间名和姓氏之间没有依赖关系。但用户必须指定 -a 或 --first-name 以及强制
  • &lt;command&gt; 是固定字符串吗?如果是这样,您可以使用 add_subparsers 并简单地将 --first-name 指定为子解析器的 required=True 参数。
  • 不固定。它可以取不同的值
  • 那是个问题。我认为没有任何方法可以使用内置方法来执行此操作,您必须指定所需的参数,然后手动检查用户是否提供了正确的设置,如果没有手动打印错误并显示帮助消息。

标签: python argparse


【解决方案1】:

解析后测试值没有什么粗糙的。所有mutually exclusive group 所做的就是格式化usage(您可能已经见过),并针对一组“已经见过”的动作测试组中的每个参数。没有嵌套或复合逻辑测试,只有一个简单、扁平的xor

我建议使用('--name', nargs='+', help='name - first [last [middle]]') 类型的论点。也就是说,接受name 的一个或多个字符串。结果将是一个列表,您可以轻松地将其解析为 3 个部分。它甚至可以让您指定一个 4 部分名称,或那些贵族 10 部分名称之一。

一些侧边栏问题更详细地探讨了这一点,例如

Python argparse mutual exclusive group

【讨论】:

    猜你喜欢
    • 2020-07-29
    • 1970-01-01
    • 2018-08-18
    • 2013-05-23
    • 2021-12-20
    • 2011-06-09
    • 2011-06-13
    • 1970-01-01
    相关资源
    最近更新 更多