为何argparse允许通过nargs='?'定义可选位置参数?
问题解答
核心原因很直接:nargs='?' 会自动覆盖位置参数的 required 默认行为
虽然argparse里位置参数默认是required=True,但当你给位置参数设置nargs='?'时,等于明确告诉解析器:这个参数可以传0次或1次,也就是可选的。此时解析器会自动把该参数的required属性设为False,不需要你手动配置也能实现不传值的效果。
对应到你的代码里:
action参数没设nargs,保持默认的required=True,所以必须传list这个值;query参数用了nargs='?',变成可选参数,传或不传都合法——不传时它的值会是None(如果没指定default的话),刚好匹配你需要的两种调用场景。
额外提个小技巧:如果给nargs='?'的参数加上default,不传值时就会用你指定的默认值,比如:
parser.add_argument("query", type=str, nargs='?', default="")
这样不传query时,它的值就是空字符串,可能更方便你处理筛选逻辑。
内容的提问来源于stack exchange,提问作者Bloop
相关产品推荐
相关产品推荐

