【问题标题】:Argparse incorrect order of positional and optional parametersargparse 位置和可选参数的顺序不正确
【发布时间】:2011-08-16 19:55:00
【问题描述】:

为什么 argparse 不解析这些参数?

--foo 1 2 3 bar

使用

parser = argparse.ArgumentParser()
parser.add_argument('--foo', nargs='+')                  
parser.add_argument('bar')

这给出了以下错误:

错误:参数太少

如果我先传递 bar 参数,它会起作用:

bar --foo 1 2 3   

现在,这本身并不算太糟糕。我可以先使用位置参数,只是这种行为与 argparse 为我们创建的帮助不一致,后者指出 bar 应该是最后一个:

用法:argparsetest.py [-h] [--foo FOO [FOO ...]] 酒吧

那么如何使用一致的帮助文本来完成这项工作?

这是一个完整的test program

【问题讨论】:

  • 刚才遇到了同样的问题。可以使用-- 来结束nargs globbing,因此--foo 1 2 3 -- bar 应该可以在上面的示例中使用。在我看来,它确实应该自动解决,保留位置参数所需的参数数量。在bugs.python.org/issue9338bugs.python.org/issue9182 上有关于这个未决问题的讨论(至少应该清楚地记录在案)。
  • -- 停止列表真是太酷了。这是我最喜欢的答案。

标签: python command-line command-line-arguments argparse


【解决方案1】:

nargs='+' 告诉 argparse 将所有剩余的 args 收集在一起,因此包含 bar。它没有神奇的方式来猜测您打算将 bar 本身作为一个有意义的参数,而不是作为 --foo 的参数的一部分。

文档中的示例引用了一个简单的 --foo 参数,而不是带有 nargs='+' 的参数。请务必了解其中的区别。

【讨论】:

  • 很容易实现它,以便将最后 n 个参数视为 n 个强制位置参数。这不是魔术,我想这只是一个设计决定。
【解决方案2】:

也许尝试在 add_argument 中执行 --input --output 标志并将这些选项设置为 required=True?

http://docs.python.org/dev/library/argparse.html#the-add-argument-method

【讨论】:

  • 谢谢,这很有效,并为我提供了一致的帮助文本。唯一的缺点是额外的 --input 标志部分,但我可以忍受。干杯
  • 为了解决问题,建议的解决方案是使用 parser.add_argument('--bar', required=True)。然后可以传递以下参数:--foo 1 2 3 --bar bar
猜你喜欢
  • 2011-05-27
  • 2015-06-16
  • 2019-04-13
  • 2014-12-29
  • 2023-04-02
  • 2013-01-28
  • 2018-02-20
相关资源
最近更新 更多