我希望在脚本中定义不同的子解析器,并且这些子解析器都继承自一个通用的父级选项,但是它们具有不同的默认值。然而,它并没有按照预期工作。
以下是我的操作:
import argparse
# this is the top level parser
parser = argparse.ArgumentParser(description='bla bla')
# this serves as a parent parser
base_parser = argparse.ArgumentParser(add_help=False)
base_parser.add_argument('-n', help='number', type=int)
# subparsers
subparsers = parser.add_subparsers()
subparser1= subparsers.add_parser('a', help='subparser 1',
parents=[base_parser])
subparser1.set_defaults(n=50)
subparser2 = subparsers.add_parser('b', help='subparser 2',
parents=[base_parser])
subparser2.set_defaults(n=20)
args = parser.parse_args()
print args
当我从命令行运行脚本时,我得到了这个结果:
$ python subparse.py b
Namespace(n=20)
$ python subparse.py a
Namespace(n=20)
显然,第二个set_defaults
会覆盖父级中的第一个set_defaults
。由于argparse文档中没有任何相关内容(其非常详细),我认为这可能是一个bug。
有没有简单的解决方案?我可以在检查完args
变量后,将None
值替换为每个子解析器的预期默认值,但我本来希望argparse能够自动完成这个任务。
顺便说一下,这是Python 2.7。