如何让Python的argparse接受未声明的命令行参数
解决argparse处理未声明参数的问题
方法一:使用parse_known_args()解析已知参数,手动处理未知参数
argparse默认会校验所有命令行参数,未声明的参数会直接报错。改用parse_known_args()可以分离已声明参数和未声明参数,之后将未声明参数转换为键值对添加到参数字典中:
parser = argparse.ArgumentParser() parser.add_argument( "--local", action="store_true", help="Write outputs to local disk." ) parser.add_argument( "--swe", action="store_true", help="Indicates 'staging' environment." ) # 解析已知参数,返回已知参数对象和未知参数列表 args, unknown = parser.parse_known_args() # 处理未知参数,转换为键值对添加到args中 for idx, arg in enumerate(unknown): if arg.startswith("--"): param_name = arg.lstrip("--") # 取当前参数的下一个元素作为值(仅当下一个元素不是新参数时) if idx + 1 < len(unknown) and not unknown[idx+1].startswith("--"): param_value = unknown[idx+1] setattr(args, param_name, param_value) # 如果是不带值的未知参数,默认设为True else: setattr(args, param_name, True) # 转换为字典查看最终参数 args_dict = vars(args) print(args_dict)
执行命令python runner.py --local --swe --undeclared_argument this_is_a_test后,参数字典会包含undeclared_argument: 'this_is_a_test'。
注意事项
- 你原本命令里的
--local true写法有误:store_true类型的参数不需要跟值,只要出现--local就会自动设为True,后面的true会被当成未知参数处理。如果需要通过传入值控制布尔状态,应该改用action="store"并指定type=bool。 - 上述逻辑支持两种未知参数形式:
--key value(带值)和--flag(不带值,默认设为True)。
内容的提问来源于stack exchange,提问作者HuLu ViCa
相关产品推荐
相关产品推荐

