Python argparse中nargs='?'搭配default不生效问题排查
为什么argparse中nargs='?'的参数default不生效?
你遇到的问题有两个核心原因,拆解如下:
1. nargs='?'的参数行为逻辑理解偏差
你给--json_output设置了nargs='?',这个参数的行为规则是:
- 当命令行**完全不写
--json_output/-j**时,才会触发你设置的default="s"; - 当命令行写了
--json_output/-j但没有跟任何值时,因为你没设置const参数,argparse会自动把它设为None——这就是你看到输出None的直接原因。
2. 位置参数host的default设置无效
argparse里的普通位置参数(未添加nargs='?'/nargs='*')是强制要求传入的,哪怕你写了default也不会生效。如果你想让host支持可选并使用默认值,必须给它加上nargs='?'。
修复方案
针对--json_output的需求调整
如果你希望不管指定不指定该参数,只要没传具体值就用s,可以同时设置const和default:
parser.add_argument('-j','--json_output', type=str, default="s", const="s", nargs='?', choices=["s", "l"], help="Print GET statement in json form.")
这样三种场景都会符合预期:
- 不写
-j→ 值为s; - 只写
-j不跟值 → 值为s; - 写
-j l→ 值为l。
如果只是希望完全不指定参数时用s,指定但不传值时保持None,就保留原default,按需添加const即可。
修复host的默认值生效问题
修改host参数的定义,加上nargs='?':
parser.add_argument('host', type=str, default="10.10.10.10", nargs='?', help="Device IP address or Hostname.")
你的原代码
from argparse import ArgumentParser, RawTextHelpFormatter example_text = "test" parser = ArgumentParser(description='my script.', epilog=example_text, formatter_class=RawTextHelpFormatter) parser.add_argument('host', type=str, default="10.10.10.10", help="Device IP address or Hostname.") parser.add_argument('-j','--json_output', type=str, default="s", nargs='?',choices=["s", "l"], help="Print GET statement in json form.") #mutally exclusive required settings supplying the key settingsgroup = parser.add_mutually_exclusive_group(required=True) settingsgroup.add_argument('-k', '--key', type=str, help="the api-key to use. WARNING take care when using this, the key specified will be in the user's history.") settingsgroup.add_argument('--config', type=str, help="yaml config file. All parameters can be placed in the yaml file. Parameters provided from form command line will take priority.") args = parser.parse_args() print(args.json_output)
运行输出
None
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

