Python argparse同时设置nargs与action='store_true'触发'unexpected keyword nargs'报错的问题咨询
Python argparse同时设置nargs与action='store_true'触发'unexpected keyword nargs'报错的问题咨询
嗨,这个问题我之前也踩过一模一样的坑!咱们直接说核心问题:action='store_true' 和 nargs 是绝对不能同时用的,这是argparse的设计规则决定的。
你想啊,store_true 这个action是专门给「不需要参数的布尔开关」准备的——只要命令行里出现 -c/--create,它就自动把 args.create 设为 True,完全不需要处理额外参数。而 nargs='*' 是用来指定这个选项要接收0个或多个位置参数的,这俩的逻辑从根上就冲突,所以argparse直接给你抛错提示了。
接下来得看你的实际需求改代码,我分两种常见情况给你举例:
情况1:只想让 -c 当一个布尔开关(不需要任何参数)
直接删掉 nargs='*' 就搞定了,修改后的完整代码:
import argparse def parse_cmd_line(): parser = argparse.ArgumentParser() # 只保留store_true,去掉冲突的nargs设置 parser.add_argument('-c', '--create', action="store_true") args, flist = parser.parse_known_args() print(args) # 可以打印结果验证 if __name__ == "__main__" : parse_cmd_line()
测试一下:
- 跑
python3 parse.py -c,输出是Namespace(create=True) - 不加
-c直接跑,输出是Namespace(create=False),完全符合开关的预期。
情况2:想让 -c 可以接收0个或多个参数(对应你原本的nargs='*'需求)
这时候就不能用 store_true 了,改用argparse默认的store action(可以省略不写),还能给它设个默认值,比如空列表:
import argparse def parse_cmd_line(): parser = argparse.ArgumentParser() # 去掉store_true,保留nargs='*',设置默认空列表 parser.add_argument('-c', '--create', nargs='*', default=[]) args, flist = parser.parse_known_args() print(args) if __name__ == "__main__" : parse_cmd_line()
测试效果:
- 跑
python3 parse.py -c,输出是Namespace(create=[]) - 跑
python3 parse.py -c file1 file2 test,输出是Namespace(create=['file1', 'file2', 'test'])
最后再给你提个醒:argparse里的store_true/store_false是布尔开关的专属action,和任何需要接收参数的设置(比如nargs、type、metavar这些)都是互斥的,记住这个规则以后就不会再踩这个坑啦!




