【发布时间】: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,取一个值。这可以简化要求。