【问题标题】:Having a python arg set another flag as true in addition to itself让 python arg 将另一个标志设置为除自身之外的 true
【发布时间】:2015-10-17 23:23:57
【问题描述】:

使用 arg 解析,我有两个参数。我希望第二个自动使第一个为真,即使第一个未被调用。有没有办法做到这一点?

我想要的基本要点:

parser.add_argument('--verbose', action='store_true')
parser.add_argument('--verbose-with-bonus', action='store_true')

parser.parse_args('--verbose-with-bonus'.split())
Namespace(verbose=True, verbose_with_bonus=True) 

【问题讨论】:

  • 之后检查是否已设置任何一个,并相应地更新属性。我认为您不能直接在argparse 中进行操作。
  • 如果在没有verbose_with_bonus的情况下使用verbose,是否有可能让解析器抛出错误?
  • 再说一次,可能不是原生的,但你可以自己扔!您可以制作它们,例如mutually exclusive 也是。

标签: python arguments argparse


【解决方案1】:

尤其是store_true参数,解析后很容易实现自己的检查,例如

 if args.verbose_with_bonus:
     args.verbose = True

 if args.verbose_with_bonus and not args.verbose:
     parser.error('naughty user')

文档讨论了“计数”参数类型:

'count' - This counts the number of times a keyword argument occurs. For example, this is useful for increasing verbosity levels:

>>>
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--verbose', '-v', action='count')
>>> parser.parse_args('-vvv'.split())
Namespace(verbose=3)

因此,您可以将 verbose=1 视为普通冗长,将 verbose=2 视为 verbose_with_bonus。

也可以创建自定义动作类,例如,一个同时设置verbose_with_bonusverbose 的类。但我怀疑在你的情况下这太过分了。 (ps。有很多关于编写自定义 Action 类的 SO 答案)。

【讨论】:

  • 感谢您的帮助。我同意,如果我想做更复杂的事情,我应该走 Action 类路线。
【解决方案2】:
args = parse_args()
args.verbose = args.verbose or args.verbose_with_bonus

可能已经足够了

【讨论】:

    猜你喜欢
    • 2018-01-17
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 2014-07-09
    • 2019-01-05
    • 2020-01-31
    • 1970-01-01
    相关资源
    最近更新 更多