3

这是我的 argparse 示例说 sample.py

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-p", nargs="+", help="Stuff")
args = parser.parse_args()
print args

蟒蛇 - 2.7.3

我希望用户在 -p 选项之后提供由空格分隔的参数列表。例如,如果您运行

$ sample.py -p x y 
Namespace(p=['x', 'y'])

但我的问题是当你跑步时

$ sample.py -p x -p y
Namespace(p=['y'])

这既不是这里也不是那里。我想要以下之一

  • 向用户抛出一个异常,要求他不要使用两次 -p 而只是将它们作为一个参数提供
  • 假设它是相同的选项并生成一个 ['x','y'] 列表。

我可以看到 python 2.7 没有做任何让我感到困惑的事情。我可以让 python 执行上面记录的两种行为之一吗?

4

2 回答 2

2

注意:python 3.8 添加了一个action="extend"将创建所需的 ['x','y'] 列表

要生成 ['x','y'] 的列表,请使用action='append'. 其实它给

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

对于每一个-p,它都会给出一个['x']由 指示的列表nargs='+',但append意味着将该值添加到命名空间已有的内容中。默认操作只是设置值,例如NS['p']=['x']. 我建议查看action文档中的段落。

optionals允许按设计重复使用。它启用了 和 之类append的操作count。通常用户不希望重复使用它们,或者对最后一个值感到满意。 positionals(没有-flag)不能重复(除非允许nargs)。

如何添加可选参数或一次参数? 关于如何创建“不重复”论点有一些建议。一种是创建自定义action类。

于 2013-10-07T15:31:48.177 回答
0

我遇到了同样的问题。我决定采用 mgilson 建议的自定义操作路线。

import argparse
class ExtendAction(argparse.Action):
  def __call__(self, parser, namespace, values, option_string=None):
    if getattr(namespace, self.dest, None) is None:
      setattr(namespace, self.dest, [])
    getattr(namespace, self.dest).extend(values)
parser = argparse.ArgumentParser()
parser.add_argument("-p", nargs="+", help="Stuff", action=ExtendAction)
args = parser.parse_args()
print args

这导致

$ ./sample.py -p x -p y -p z w
Namespace(p=['x', 'y', 'z', 'w'])

action='extend'尽管如此,如果库中默认有一个选项,它会更整洁。

于 2014-02-21T17:56:35.483 回答