Python`argparse`:是否有一种干净的方法来添加一个设置多个标志的标志(例如`--all`“相当于`--x --y`)

时间:2018-02-16 20:52:40

标签: python python-2.7 argparse

我有一些Python argparse命令行处理代码,最初看起来像这样:

import argparse

ap = argparse.ArgumentParser()

ap.add_argument("--x", help = "Set `x`.", action = "store_true", default = False)
ap.add_argument("--y", help = "Set `y`.", action = "store_true", default = False)

ap.add_argument(
  "--all", help = "Equivalent to `--x --y`.",
  action = "store_true", default = False
)

args = ap.parse_args()

if args.all:
  args.x = True
  args.y = True

print "args.x", args.x
print "args.y", args.y

基本思路:我有一些布尔标志可以切换特定设置(--x--y等),我想添加一个方便的选项来切换多个设置 - 例如--all相当于--x --y

我想避免使用ArgumentParser中未包含且在parse_args中完成的任何命令行处理逻辑,因此我使用自定义argparse.Action来提出此解决方案:

import argparse

def store_const_multiple(const, *destinations):
  """Returns an `argparse.Action` class that sets multiple argument
  destinations (`destinations`) to `const`."""
  class store_const_multiple_action(argparse.Action):
    def __init__(self, *args, **kwargs):
      super(store_const_multiple_action, self).__init__(
        metavar = None, nargs = 0, const = const, *args, **kwargs
      )

    def __call__(self, parser, namespace, values, option_string = None):
      for destination in destinations:
        setattr(namespace, destination, const)

  return store_const_multiple_action

def store_true_multiple(*destinations):
  """Returns an `argparse.Action` class that sets multiple argument
  destinations (`destinations`) to `True`."""
  return store_const_multiple(True, *destinations)

ap = argparse.ArgumentParser()

ap.add_argument("--x", help = "Set `x`.", action = "store_true", default = False)
ap.add_argument("--y", help = "Set `y`.", action = "store_true", default = False)

ap.add_argument(
  "--all", help = "Equivalent to `--x --y`.",
  action = store_true_multiple("x", "y")
)

args = ap.parse_args()

print "args.x", args.x
print "args.y", args.y

argparse(第一个示例)或(2)编写自定义parse_args()之后,是否有argparse.Action实现我想要的任何干净方式,而没有(0)进行一些处理(第二个例子)?

1 个答案:

答案 0 :(得分:0)

这很晚了,不是您想要的,但是您可以尝试以下操作:

import argparse

myflags = ['x', 'y', 'z']

parser = argparse.ArgumentParser()
parser.add_argument('--flags', nargs="+", choices=myflags)
parser.add_argument('--all-flags', action='store_const', const=myflags, dest='flags')
args = parser.parse_args()
print(args)

然后调用python myscript.py --flags x y将其输出

Namespace(flags=['x', 'y'])

然后调用python myscript.py --all-flags会输出

Namespace(flags=['x', 'y', 'z'])

但是您必须通过'x' in args.flags而不是简单地args.x来检查标志