Python argpass:在指定某些选项时不要求位置参数

时间:2018-04-04 00:54:42

标签: python argparse

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

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

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

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

如何实现以下行为:

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

我的代码

这符合除最后一项之外的所有要求,即-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不需要 iff -o,或者必须手动执行此行为?

1 个答案:

答案 0 :(得分:0)

手动方法

为位置参数设置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")