Python argparse使用nargs='*'时如何为无值flag设置常量
解决方案
完全可以实现,不需要自定义action,你遇到的问题本质是两个:一是对nargs='*'的参数返回值特性不熟悉,二是原有代码的判断逻辑写得有问题,和const参数无关。
核心原理
使用nargs='*'定义的可选参数,argparse会天然返回三种不同的状态值,刚好匹配你的需求场景,不需要额外加const:
- 完全没有传入该参数时,参数值为默认的
None - 传入了参数但后面没有跟随任何取值时,参数值为空列表
[] - 传入了参数且后面跟随了若干取值时,参数值为所有输入取值组成的非空列表
注:
const参数仅在nargs='?'(单可选值)、store_const/append_const动作场景下生效,nargs='*'场景下本身就不需要用到它。
原有代码的问题
- 布尔判断逻辑错误:空列表
[]在Python中是假值,你原来写的if args.exp:会把「传了-e但没带值」的场景直接跳过,根本进不了实验分支。 - 分支绑定错误:最后一个
else是和最近的if 't' in args.exp绑定的,不是和前面三个实验项的判断整体绑定,只要传入的取值里不含t,就会额外打印do everything,逻辑完全错误。
修正后可直接运行的代码
import argparse def run(args): # 处理实验参数 if args.exp is not None: if len(args.exp) == 0: # 传了-e无取值,执行全量实验 print('do everything') else: # 有取值,逐个匹配对应实验项 for exp_item in args.exp: if exp_item == 'p': print('p') elif exp_item == 'q': print('q') elif exp_item == 't': print('t') else: print(f"跳过非法实验标识: {exp_item}") # 处理绘图参数 if args.plot is not None: if len(args.plot) == 0: # 传了-p无取值,绘制全量图表 print('plot everything') else: # 有取值,逐个匹配对应绘图项 for plot_item in args.plot: if plot_item == 'p': print('plot p') elif plot_item == 'q': print('plot q') elif plot_item == 't': print('plot t') else: print(f"跳过非法绘图标识: {plot_item}") if __name__=="__main__": parser = argparse.ArgumentParser(prog="test.py") parser.add_argument('-e', '--exp', nargs='*', help='传入p/q/t执行对应实验,不传值执行全量实验') parser.add_argument('-p', '--plot', nargs='*', help='传入p/q/t绘制对应图表,不传值绘制全量图表') args = parser.parse_args() run(args=args)
效果验证
不同输入对应的输出完全符合你的预期:
- 执行
python test.py -e:输出do everything - 执行
python test.py -e p t:逐行输出p、t - 执行
python test.py -p:输出plot everything - 执行
python test.py -p q:输出plot q - 执行
python test.py -e -p t:逐行输出do everything、plot t
内容的提问来源于stack exchange,提问作者vegiv
相关产品推荐
相关产品推荐

