【问题标题】:Change argparse usage message argument order更改 argparse 使用消息参数顺序
【发布时间】:2015-07-25 07:35:30
【问题描述】:

我在 python3 中使用 argparse。在我的脚本中,我有一些子解析器、一个位置参数和一些可选参数。我有一个可选参数来传递任意数量的文件路径,它使用nargs='*'。我的脚本的使用消息显示如下:

usage: myprog.py subparser1 [-h] [--dir DIR] 
                            [--files [FILES [FILES ...]]]
                            positional_arg

但是,如果您实际上按照此用法消息的建议将positional_arg 放在--files 标志之后,我认为解析器最终会将其作为文件路径使用(因为nargs='*'),然后抛出一个错误,因为它没有找到所需的positional_arg

我认为使用信息的打印方式具有误导性。由于我有多个子解析器,我想找到一种方法来更改所有使用消息(无需使用 usage= 参数手动输入它们),以便首先显示位置参数,希望能消除混乱。

所以我的主要问题是如何更改参数在 argparse 消息的使用部分中的排序方式?

编辑以解决一种对我不起作用的可能解决方案。

我不想将--files 标志添加为nargs='*' 的位置参数。首先,因为这使它现在显示在帮助消息的“位置参数”部分,而不是与我的其余可选参数一起显示在“可选参数”部分,所以它看起来像是必需的,即使你可以传递 0 个参数。

其次,因为如果我想有另一个标志,除了--files(例如--folders)之外,它还接受任意数量的参数,并且如果我将它们都设为位置参数,我会遇到相同的情况第一个会一直使用参数直到结束的问题。如果我设置了一个位置和一个可选,那么误导性使用消息仍然是一个问题。

【问题讨论】:

  • 用 0 个参数指定 --files 真的有意义吗?您可能想改用nargs='+'
  • @chepner 谢谢,这很好,我会这样做!但我认为这不会解决使用消息问题。
  • 嗯,“位置”并不意味着“必需”。您还可以在 files 参数中添加一个 help 标记,说明它是可选的。
  • nargs='*' 的两个选项或参数总是会导致问题。他们不能都排在最后。

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


【解决方案1】:

这里有几个问题 - 如何解析参数,以及如何格式化用法。

几个快速修复:

使用-- 标记可选列表的结尾和位置列表的开头。

另一种可能性是将您的positional 变成optional。也就是说,给它一个简单的标志,如果需要,给它一个required 参数。然后它可以放在子解析器输入的任何地方。


https://stackoverflow.com/a/26986546/901925 解决了 * 可选后的位置问题。它提出了同样的快速建议。它还显示了如何更改帮助格式化程序以不将位置移动到使用结束。但它没有解决多行使用情况。

在最近的一个 SO question 中也讨论了使用顺序, https://stackoverflow.com/a/29619171/901925


如果您不喜欢默认的参数分组(位置和可选),您可以使用带有不同标题和描述的argument_groups。使用像“?”这样的参数和 '*' 和 'required' 参数,'optionals' 和 'positionals' 之类的名称可能会造成混淆。我正在尝试将“标记”用于“可选”,希望它不会造成混淆。

【讨论】:

  • 感谢您的精彩总结!我喜欢你在stackoverflow.com/a/26986546/901925 的回答,我认为这对我的具体情况最有效,但我也可能会考虑将位置转换为标志或再看看argument_group。谢谢!
【解决方案2】:

因为argparse 对选项在命令行中的使用位置没有任何限制,所以选项采用任意数量的参数实际上没有任何意义。另一方面,位置参数 do 具有强制顺序。我会做类似的事情

add_argument("positional_arg")
add_argument("files", nargs='*', help="Optional, one or more files")

相反,将--files 选项转换为纯可选位置参数的列表。那么无论是在帮助信息中还是在实际使用中,都不会混淆哪些参数应该是文件列表的一部分。

【讨论】:

  • 谢谢,但我认为这不是解决令人困惑的使用消息的好方法——我已经编辑了我的问题以详细说明。
  • argparse 用法将位置参数放在最后,不管定义顺序如何。
猜你喜欢
  • 2012-02-20
  • 2017-02-24
  • 2013-03-30
  • 2020-03-11
  • 2016-12-27
  • 2016-01-21
  • 2021-12-24
  • 2010-11-30
  • 2013-07-02
相关资源
最近更新 更多