PAYATHON 2026

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' 就是由此产生的。调整关键字参数的排列顺序也无法解决问题,因为这组参数本身不受支持。

备注:内容仅供参考。