【问题标题】:Python argpass: don't require positional arguments when certain options are specifiedPython argpass:指定某些选项时不需要位置参数
【发布时间】:2018-04-04 08:54:41
【问题描述】:

带有nargs='+'nargs=<integer> 的位置参数是必需的,这意味着如果至少没有指定一次参数,argparse 会出错。但是,如果用户使用-h|--help 选项调用程序,则无论是否指定了位置参数,都不会出错。

如何实现不需要设置位置参数的-h 等自定义选项,而所有其他选项仍需要位置参数?

例如,假设我的程序有以下(或类似的)用法文本:

usage: PROG [-h] [-o] [-u] positional

如何实现以下行为:

  • 在没有选项和位置的情况下调用 PROG 是错误的
  • -u 调用PROG 并且没有定位是错误的
  • 只允许使用位置调用PROG
  • 无论指定什么其他内容,都允许使用-h-o 调用PROG

我的代码

这样就满足了除最后一个之外的所有要求,即-o 仍然需要指定位置参数。

import argparse

parser = argparse.ArgumentParser()

parser.add_argument('positional', nargs=1)
parser.add_argument('-o', action='store_true')
parser.add_argument('-u', action='store_true')

args = parser.parse_args()

print(args)

argparse 是否有内置方式表示不需要 positional如果 指定了 -o,还是必须手动实现此行为?

【问题讨论】:

  • docs.python.org/3/library/argparse.html#mutual-exclusion 适用于一个位置(?或 *)。对于更高级的交互,您需要在解析后进行自己的测试。在对用户提出复杂要求之前,请考虑如何解释它们。理想情况下,单个 usage 行应编码所有此类要求。
  • 当使用 nargs='?' 或 '*' 作为定位时,最好指定 default 参数。
  • 考虑把'-u'变成一个普通的store,取一个值。这可以简化要求。

标签: python argparse


【解决方案1】:

手动方法

为位置参数设置nargs='?'nargs='*'(即使其可选),然后在args = parser.parse_args()之后立即添加以下行:

if not args.o and args.positional is None:
    parser.error("the following arguments are required: positional")

或添加这些行,由this answer提供:

if len(sys.argv) == 1:
    # display help message when no args are passed.
    parser.print_help()
    sys.exit(1)

如果没有指定选项或位置参数,这只会打印帮助消息。这种行为与许多命令行程序一致,例如git.

当然,将positional设为可选会影响使用消息:

usage: PROG [-h] [-o] [-u] [positional]

如果您真的不希望这种情况发生,您可以像这样覆盖使用方法:

parser = argparse.ArgumentParser(usage="%(prog)s [-h] [-o] [-u] positional")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-29
    • 2011-10-16
    • 2019-12-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    相关资源
    最近更新 更多