argparse - 可选参数需要2个值或none

xgo*_*ord 9 python argparse

我正在尝试为一个脚本创建一个可选参数,该脚本可以不采用任何值或2个值,而不是其他任何值.你能用argparse做到这一点吗?

# desired output:
# ./script.py -a --> works
# ./script.py -a val1 --> error
# ./script.py -a val1 val2 --> works
Run Code Online (Sandbox Code Playgroud)


版本1 - 接受0或1值:

parser = argparse.ArgumentParser()
parser.add_argument("-a", "--action", nargs="?", const=True, action="store", help="do some action")
args = parser.parse_args()

# output:
# ./script.py -a --> works
# ./script.py -a val1 --> works
# ./script.py -a val1 val2 --> error
Run Code Online (Sandbox Code Playgroud)


版本2 - 正好接受2个值:

parser = argparse.ArgumentParser()
parser.add_argument("-a", "--action", nargs=2, action="store", help="do some action")
args = parser.parse_args()

# output:
# ./script.py -a --> error
# ./script.py -a val1 --> error
# ./script.py -a val1 val2 --> works
Run Code Online (Sandbox Code Playgroud)


如何组合这两个不同的版本,以便脚本接受参数的0或2值,但当它只有1个值时拒绝它?

Mar*_*ers 10

你必须在这里做自己的错误检查.接受0或更多值,并拒绝0或2以外的任何值:

parser = argparse.ArgumentParser()
parser.add_argument("-a", "--action", nargs='*', action="store", help="do some action")
args = parser.parse_args()

if args.action is not None and len(args.action) not in (0, 2):
    parser.error('Either give no values for action, or two, not {}.'.format(len(args.action)))
Run Code Online (Sandbox Code Playgroud)

请注意,未使用开关时args.action设置为:None-a

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument("-a", "--action", nargs='*', action="store", help="do some action")
_StoreAction(option_strings=['-a', '--action'], dest='action', nargs='*', const=None, default=None, type=None, choices=None, help='do some action', metavar=None)
>>> args = parser.parse_args([])
>>> args.action is None
True
>>> args = parser.parse_args(['-a'])
>>> args.action
[]
Run Code Online (Sandbox Code Playgroud)