我们经常会遇到很多解析器都会需要相同的参数,例如都需要输入用户名密码,这样我们可以定义一个父解析器定义common的规则,子解析器可以集成,并且扩展。如果定义了相同的参数便会产生冲突。argparse有两个内置的冲突处理器error(默认)和resolve,resolve会基于冲突选项的添加顺序来选择一个参数处理器,后添加覆盖老规则。我们应该尽量避免冲突,所以父解析器一般不定义帮助信息。下面举个简单的例子。
首先定义父解析器如下:
parser = argparse.ArgumentParser(description='parent 2', add_help=False) parser.add_argument('-p', '--password', help='What is your passwrd') parser.add_argument('-user', '--username', help='What is your username') parser.add_argument('-m', '--female', help='What is your female') args = parser.parse_args() print(args) # 结果 λ python arg_parent.py -h usage: arg_parent.py [-p PASSWORD] [-user USERNAME] [-m FEMALE] arg_parent.py: error: unrecognized arguments: -h λ python arg_parent.py -p 123 -user ling -m man Namespace(female='man', password='123', username='ling')子解析器:集成并且重写
import arg_parent parser = argparse.ArgumentParser(description='son 1', parents=[arg_parent.parser], conflict_handler='resolve') parser.add_argument('-w', '--weather', help="What's the weather") parser.add_argument('-m', '--female', action='store_const', const='TRUE', help='What is your female') args = parser.parse_args() print(args) # 结果 λ python arg_son.py -m -w cold -p 123 Namespace(female='TRUE', password='123', username=None, weather='cold') λ python arg_son.py -m man usage: arg_son.py [-h] [-p PASSWORD] [-user USERNAME] [-w WEATHER] [-m] arg_son.py: error: unrecognized arguments: man目前只用到了以上特性,还有一些特性就不一一介绍了,后续用到再补充。