Python Argparse" radio"标志默认?

时间:2014-12-05 01:56:45

标签: python argparse

例如:

example.py

parser = argparse.ArgumentParser(description="Will take arguments... or none")

parser.add_argument("-a", action="store_true")
parser.add_argument("-b", action="store_true")
parser.add_argument("-c", action="store_true")
parser.add_argument("-d", action="store_true")

args = parser.parse_args()
print args

我希望example.py将a设置为True,但前提是:

  • 使用-a标志
  • 没有使用任何标志

我试过搞乱

parser.set_defaults(a=True, b=False)

parser.add_argument("-a", action="store_true", default=True)

但即使我决定使用a标记,他们也会将True设置为b

3 个答案:

答案 0 :(得分:5)

是使用默认值将a设置为True,甚至指定其他参数。这将违反您的第二个要求,以下是一个简单的修复程序,具有天真的条件检查。

parser = argparse.ArgumentParser(description="Will take arguments... or none")

parser.add_argument("-a", action="store_true")
parser.add_argument("-b", action="store_true")
parser.add_argument("-c", action="store_true")
parser.add_argument("-d", action="store_true")

args = parser.parse_args()
if not (args.b or args.c or args.d):
    args.a=True
print args

答案 1 :(得分:2)

听起来你想要一个单选按钮'效果 - 只选择其中一种替代方案。一组标志的替代方案将是一个带有选择的参数。

parser.add_argument('flag', choices=['a','b','c','d'], default='a', nargs='?')

您可以在args.flag中查看结果,该结果将是4个字符串之一。

显然,位置参数被标志所取代,例如-f

答案 2 :(得分:1)

我选择了以下解决方案:

parser = argparse.ArgumentParser(description="Will take arguments... or none")

lettergroup = parser.add_mutually_exclusive_group()

lettergroup.add_argument("-a", action="store_const", dest="letter", const="a", default="a")
lettergroup.add_argument("-b", action="store_const", dest="letter", const="b")
lettergroup.add_argument("-c", action="store_const", dest="letter", const="c")
lettergroup.add_argument("-d", action="store_const", dest="letter", const="d")

args = parser.parse_args()

现在,该值存储在args.letter中。如果未调用任何标记,则args.letter将具有值a。如果同时调用两个标志,则解析器将抛出错误。

解决此问题的另一种方法。