使用特定标志时如何允许省略所需的参数?

Posted

技术标签:

【中文标题】使用特定标志时如何允许省略所需的参数?【英文标题】:How to allow required arguments to be omitted when a specific flag is used? 【发布时间】:2021-07-09 15:23:21 【问题描述】:

我的代码如下。

__version__ = 'v10'

class MyHelpFormatter(argparse.ArgumentDefaultsHelpFormatter):
       def _get_help_string(self, action):
              return action.help

def main():
       parser = argparse.ArgumentParser(
              formatter_class=MyHelpFormatter,
              description=__version__
       )

       parser.print_usage = parser.print_help

       parser.add_argument("file", help="path to file/directory")

       parser.add_argument(
              "-t",
              "--type",
              type=str,
              default=False,
              help="file type",
       )

       parser.add_argument(
              "-c",
              "--config",
              action="store_true",
              help="change custom text",
       )

       parser.add_argument(
              "-v",
              "--version",
              action='version',
              version=__version__,
              help="thumb-gen version",
       )

在我的代码中,它总是需要“文件”参数。没关系。

现在我想在使用“--config”参数调用时调用一个函数。但是当我运行 main.py --config 时,它还需要 'file' 参数。

如何在不输入所需参数的情况下使用“-config”参数?

【问题讨论】:

这能回答你的问题吗? Require either of two arguments using argparse 您的代码从不调用parser.parse_args()main(),而且还有很多看起来与问题无关的东西。请提供minimal reproducible example。如果你想用,我写了一个here in a gist。 @MauriceMeyer 当我使用该解决方案时,“文件”参数需要一个标志。我的代码中不需要“文件”标志。有解决办法吗? 通常最干净的解决方案是使--file 具有良好默认值的可选。这样你就不用关心用户是否提供了值。 类似这样的:group.add_argument('--file', nargs='?') 或默认值。 【参考方案1】:

有两种方法可以解决这个问题。首先,您可以将文件参数设为可选。解析完成后,您的代码会检查 --config 标志是否存在——如果不存在,则检查是否给出了文件参数。如果不是,请退出并显示相应的错误消息。

您也可以使用 两个 解析器。第一个查找--config 并设置一个标志(例如do_config = True);它不需要文件参数。然后使用第二个解析器,如果 do_config 为 False,则该解析器只需要文件参数。

【讨论】:

以上是关于使用特定标志时如何允许省略所需的参数?的主要内容,如果未能解决你的问题,请参考以下文章

与 HTML Web 表单对话所需的参数

Python:兼容性所需的未使用参数。如何避免皮林特抱怨它

Argparse:制作所需的标志

如何设置单击特定单选按钮时所需的选择表单?

如何将三个选择查询合并为一个,以在 Oracle 中实现如下所需的结果?

如何使类工厂创建所需的派生类