【问题标题】:Python Argparse "radio" flags with default?Python Argparse“无线电”标志默认?
【发布时间】:2015-02-03 03:08:38
【问题描述】:

例如:

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)

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

【问题讨论】:

    标签: python argparse


    【解决方案1】:

    是的,即使指定了其他参数,使用默认值也会将 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
    

    【讨论】:

      【解决方案2】:

      听起来您想要一个“单选按钮”效果 - 只选择几个备选方案之一。一组标志的替代方案是带有选项的参数。

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

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

      显然,位置参数对被标志替换,例如-f.

      【讨论】:

      • 是的,非常正确。我最终找到了另一个解决方案,我很快就会在这里发布。
      【解决方案3】:

      我选择了以下解决方案:

      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。如果同时调用两个标志,解析器会抛出错误。

      解决这个问题的另一种方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-15
        • 1970-01-01
        • 2017-08-30
        • 2016-04-16
        • 2022-08-05
        • 2022-11-24
        • 2019-11-20
        相关资源
        最近更新 更多