argparse -- 可选参数需要 2 个值或没有值 [英] argparse -- requiring either 2 values or none for an optional argument
问题描述
我正在尝试为脚本创建一个可选参数,该参数可以不带任何值,也可以带 2 个值,仅此而已.您可以使用 argparse 来完成此操作吗?
# 所需的输出:# ./script.py -a -->作品# ./script.py -a val1 -->错误# ./script.py -a val1 val2 -->作品
版本 1 -- 接受 0 或 1 个值:
parser = argparse.ArgumentParser()parser.add_argument("-a", "--action", nargs="?", const=True, action="store", help="do some action")args = parser.parse_args()# 输出:# ./script.py -a -->作品# ./script.py -a val1 -->作品# ./script.py -a val1 val2 -->错误
版本 2 - 只接受 2 个值:
parser = argparse.ArgumentParser()parser.add_argument("-a", "--action", nargs=2, action="store", help="do some action")args = parser.parse_args()# 输出:# ./script.py -a -->错误# ./script.py -a val1 -->错误# ./script.py -a val1 val2 -->作品
您如何组合这 2 个不同的版本,以便脚本接受 0 或 2 个参数值,但在它只有 1 个值时拒绝它?
您必须在此处进行自己的错误检查.接受 0 个或多个值,并拒绝 0 或 2 以外的任何值:
parser = argparse.ArgumentParser()parser.add_argument("-a", "--action", nargs='*', action="store", help="do some action")args = parser.parse_args()如果 args.action 不是 None 并且 len(args.action) 不在 (0, 2) 中:parser.error('要么不给动作值,要么不给两个值,而不是 {}.'.format(len(args.action)))
请注意,当没有使用 -a
开关时,args.action
设置为 None
:
I'm trying to make an optional argument for a script that can either take no values or 2 values, nothing else. Can you accomplish this using argparse?
# desired output:
# ./script.py -a --> works
# ./script.py -a val1 --> error
# ./script.py -a val1 val2 --> works
version 1 -- accepts 0 or 1 values:
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
version 2 - accepts exactly 2 values:
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
How do you combine these 2 different versions so that the script accepts 0 or 2 values for the argument, but rejects it when it only has 1 value?
You'll have to do your own error checking here. Accept 0 or more value, and reject anything other than 0 or 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)))
Note that args.action
is set to None
when no -a
switch was used:
>>> 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
[]
这篇关于argparse -- 可选参数需要 2 个值或没有值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!