【问题标题】:Python(argparse): required arguments in one branch of mutually exlusive groupPython(argparse):互斥组的一个分支中的必需参数
【发布时间】:2021-08-08 04:05:16
【问题描述】:

我有以下代码:

import argparse

parser = argparse.ArgumentParser(description='do stuff')

TOP = parser.add_mutually_exclusive_group(required=True)
#
TOP.add_argument('--interactive', action="store_true")
noninteractive = TOP.add_argument_group()
##
noninteractive.add_argument('--required1', required=True, type=float)
noninteractive.add_argument('--required2', required=True, type=float)
##
noninteractive_excl = noninteractive.add_mutually_exclusive_group(required=True)
noninteractive_excl.add_argument('--mutuallyexcl1', default=None, type=float)
noninteractive_excl.add_argument('--mutuallyexcl2', default=None, type=float)

args = parser.parse_args()

我的程序应该是这样工作的:

您可以使用选项--interactive(然后会要求用户逐步输入数据)或一组包含运行程序所需的所有选项的参数来调用它。该组和--interactive 应互斥。

然后该组有两个必需的选项和两个相互排斥的选项。

我的期望是,当使用--interactive 调用时,程序不会要求任何其他参数,因为它们属于第一个互斥组的一部分。 相反,当我用

调用程序时
python dostuff.py --interactive

我收到以下消息:

dostuff.py: error: the following arguments are required: --required1, --required2

我做错了什么,我该如何解决? 非常感谢。

【问题讨论】:

  • 我认为它被抛弃是因为您的互斥组包含一个参数和另一个组。建议使用子解析器。也许这会有所帮助:stackoverflow.com/a/52865331/843953
  • 子解析器是我研究过的东西,但如果我理解正确,这意味着我已经用dostuff.py interactive --somearg 调用了这个函数。相反,我希望能够简单地使用dostuff.py --interactive

标签: python python-3.x command-line-arguments argparse


【解决方案1】:

您对组的了解超出了文档或代码的支持范围。 argument_group 只是一个“帮助”显示工具。 mutually_exclusive_group 是一个简单的xor,没有任何嵌套。

parser = argparse.ArgumentParser(description='do stuff')

TOP = parser.add_mutually_exclusive_group(required=True)
#
TOP.add_argument('--interactive', action="store_true")

添加到noninteractive 的所有内容也是TOP 组的一部分。它们都不是必需的。

noninteractive = TOP.add_argument_group()
##
noninteractive.add_argument('--required1', required=True, type=float)
noninteractive.add_argument('--required2', required=True, type=float)
##

这两个参数是required。他们在 argument_group 中的事实没有任何区别。这不是一个合乎逻辑的“任何”组。

这包括这个组 - xor 是扁平的。

noninteractive_excl = noninteractive.add_mutually_exclusive_group(required=True)
noninteractive_excl.add_argument('--mutuallyexcl1', default=None, type=float)
noninteractive_excl.add_argument('--mutuallyexcl2', default=None, type=float)

args = parser.parse_args()

mutually_exclusive_group 不会缩短解析时间。这不是一个分支机制。这只是对发生率的测试。如果您提供--iteractive,如果您提供组中的任何其他参数,它将引发错误。您的示例没有导致该错误,但它仍然测试 required 参数。换句话说,这些只是测试;他们不会改变解析顺序。

subparsers 机制确实创建了替代解析路径。仅使用其中一个子解析器,根据自己的设置解析剩余的参数。

【讨论】:

    猜你喜欢
    • 2016-05-24
    • 2014-07-29
    • 2011-06-13
    • 1970-01-01
    • 2020-07-29
    • 2021-12-20
    • 2012-12-04
    • 2013-12-28
    相关资源
    最近更新 更多