子命令后允许argparse全局标志

Tom*_*ime 12 python argparse

我正在使用argparse构建一个带有子命令的命令:

mycommand [GLOBAL FLAGS]子命令[FLAGS]

我希望全局标志能够工作,无论它们是在子命令之前还是之后.有没有一个干净的方法来做这个不涉及重复代码?

例如:

  parser = argparse.ArgumentParser()
  subparsers = parser.add_subparsers(dest='subparser_name')

  parser.add_argument('--disable')    # This flag...

  sp = subparsers.add_parser('compile')
  sp.add_argument('zones', nargs='*')
  sp.add_argument('--disable')        # Is repeated...

  sp = subparsers.add_parser('launch')
  sp.add_argument('zones', nargs='*')
  sp.add_argument('--disable')        # over and over...
Run Code Online (Sandbox Code Playgroud)

我想为许多旗帜做这件事,所以一遍又一遍地重复自己似乎...... unpythonic.

ale*_*cxe 11

这是parentsargparse功能的完美用例:

有时,几个解析器共享一组共同的参数.可以使用具有所有共享参数并传递给ArgumentParser的parents =参数的单个解析器,而不是重复这些参数的定义.

定义基本父级ArgumentParser,添加将在子级别之间共享的参数.然后,通过提供parents关键字参数添加子分析器并将基本分析器设置为父分析器:

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='subparser_name')

base_subparser = argparse.ArgumentParser(add_help=False)
# define common shared arguments
base_subparser.add_argument('--disable')

sp = subparsers.add_parser('compile', parents=[base_subparser])
# define custom arguments
sp = subparsers.add_parser('launch', parents=[base_subparser])
# define custom arguments
Run Code Online (Sandbox Code Playgroud)

请注意,add_help=False这有助于避免参数冲突的help问题.

另请参阅:Python argparse - 为多个子分析器添加参数.

  • "我希望全局标志能够工作*它们是在子命令之前还是之后.*"我相信当在命令行上的子命令之前提供标志时,此解决方案不起作用.我已尝试*也*将base_subparser作为父级应用于顶级解析器,但这对于required = True参数表现不佳. (4认同)