argparse 中 nargs 与 store_true 或 count 冲突怎么办?
数据小许
结论
问题在于 argparse 的参数配置:action="store_true" 和 action="count" 都不支持 nargs。如果 -c 是布尔开关,去掉 nargs;如果 -c 后可以跟零个或多个值,则使用默认的 store action,并保留 nargs='*'。
布尔开关:使用 store_true
store_true 会在选项出现时把对应值设为 True,未出现时设为 False。它不读取参数值,因此不能设置 nargs:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-c', '--create', action='store_true')
args = parser.parse_args()
print(args.create)
运行 python3 parse.py -c 时,args.create 为 True;省略 -c 时为 False。
接收零个或多个值:使用 nargs='*'
如果 -c 后可以跟零个或多个值,使用默认的 store action,不要使用 store_true:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-c', '--create', nargs='*')
args = parser.parse_args()
print(args.create)
例如,运行 python3 parse.py -c one two,args.create 会得到 ['one', 'two']。使用 -c 但不跟值时,args.create 是空列表;省略该选项时则为 None。
计数参数:单独使用 count
action='count' 用来统计选项出现的次数,不能设置 nargs:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-c', '--create', action='count', default=0)
args = parser.parse_args()
print(args.create)
这里,-c -c 会得到计数 2。如果要统计开关被重复使用的次数,应使用 count。它和 store_true 用途不同。
原因
argparse 会根据 action 创建对应的 action 对象。store_true 对应 _StoreTrueAction,count 对应计数 action,这两种 action 都不接受 nargs。错误信息中的 unexpected keyword 'nargs' 就是由此产生的。调整关键字参数的排列顺序也无法解决问题,因为这组参数本身不受支持。
备注:内容仅供参考。
