argparse参数依赖问题:Python脚本参数互斥与关联需求实现
如何用argparse处理互斥的可选参数组?
我有一个测试场景,需要根据传入Python脚本的参数执行对应操作,具体需求如下:test.py -a a1 -b b1 [[[-c c1] [-d d1]] | [-e e1 -f f1]]
- 必须传入必填参数
-a和-b; -c和-d是可选参数,可单独传入;-e和-f是可选参数,必须同时传入;-c/-d与-e/-f不能同时出现,否则脚本报错。
我尝试用argparse.ArgumentParser的parents选项来实现,但读取参数时出错了。
尝试的代码
import argparse parent_parser = argparse.ArgumentParser(add_help=False) parent_parser.add_argument('-a', type=str, required=True) parent_parser.add_argument('-b', type=str, required=True) one_parser = argparse.ArgumentParser(parents=[parent_parser]) one_parser.add_argument('-c', type=str, default="test") one_parser.add_argument('-d', type=str, default="Default") multi_parser = argparse.ArgumentParser(parents=[parent_parser]) multi_parser.add_argument('-e', type=str) multi_parser.add_argument('-f', type=str) if str(one_parser.parse_args().c): print(one_parser.parse_args()) elif str(multi_parser.parse_args().e): print(multi_parser.parse_args())
遇到的错误
执行命令test.py -a a1 -b b1 -e e1 -f f1时,报错:
usage: test.py [-h] -a A -b B [-c C] [-d D] test.py: error: unrecognized arguments: -e e1 -f f1 Process finished with exit code 2
有没有更好的解决思路?感谢!
临时可行的解决方案
我自己摸索出一个临时方案,虽然不算最优雅但能满足需求:
import argparse parser = argparse.ArgumentParser(add_help=False) parser.add_argument('-a', type=str, required=True) parser.add_argument('-b', type=str, required=True) parser.add_argument('-c', type=str) parser.add_argument('-d', type=str) parser.add_argument('-e', type=str) parser.add_argument('-f', type=str) args = parser.parse_args() a = str(args.a) b = str(args.b) c = str(args.c) d = str(args.d) e = str(args.e) f = str(args.f) # 检查e和f是否同时存在 if (e != "None" and f == "None") or (e == "None" and f != "None"): if c == "None" and d == "None": raise argparse.ArgumentTypeError("Both e and f arguments are required") elif c != "None" or d != "None": raise argparse.ArgumentTypeError("e and f cannot be used with c or d") # 检查c/d和e/f是否同时存在 if (c != "None" or d != "None") and (e != "None" or f != "None"): raise argparse.ArgumentTypeError("c/d and e/f cannot be used together") # 设置c和d的默认值(当e/f未传入时) if e == "None" and f == "None": if c == "None": c = "test" if d == "None": d = "Default"
个人觉得argparser应该能更高效地处理这类参数依赖问题,期待社区能有更好的优化方案。
内容的提问来源于stack exchange,提问作者Nilesh Bhave
相关产品推荐
相关产品推荐

