【问题标题】:Accept exactly 0, 1 or 2 positional arguments [duplicate]完全接受 0、1 或 2 个位置参数 [重复]
【发布时间】:2016-08-23 16:46:51
【问题描述】:

我正在使用 argparse 包来解析命令行参数。现在我想准确地接受 0、1 或 2 个字符串并将它们放入一个列表中。

我目前的做法是这样的:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('strs', nargs='*')

print(parser.parse_args([]).strs)
print(parser.parse_args(['AAA']).strs)
print(parser.parse_args(['AAA', 'BBB']).strs)
print(parser.parse_args(['AAA', 'BBB', 'CCC']).strs)

对于第一个、第二个和第三个parse_args(),结果是预期的。对于最后一个,我目前的方法是if len(parse_args.strs) > 2: raise。有没有更好的方法可以让 argparse 为我检查?

【问题讨论】:

  • 该副本的答案提供了一个自定义的 Action 类,例如我建议的。但我不确定这是否比解析后测试有所改进。

标签: python argparse


【解决方案1】:

argparse 中没有办法接受nargs 的范围,只有12'+''*' 之类的值。

您可以编写一个自定义的Action 类来检查nargs='*' 传递的值的数量。但我认为在解析后执行该测试同样容易。

如果您真的想深入了解,我可以找到一个探索添加范围 nargs 选项的错误/问题。

如果您没有其他位置,您可以定义 3 个位置,其中 2 个使用 ?。您甚至可以将它们组合成一个具有通用名称和“附加”操作的列表。我会探索的。

In [573]: p=argparse.ArgumentParser()
In [574]: p.add_argument('str',action='append')
In [575]: p.add_argument('str',nargs='?',action='append')
In [576]: p.add_argument('str',nargs='?',action='append')

In [577]: p.print_help()
usage: ipython3 [-h] str [str] [str]

positional arguments:
  str
  str
  str

optional arguments:
  -h, --help  show this help message and exit

In [578]: p.parse_args('1 2 3'.split())
Out[578]: Namespace(str=['1', '2', '3'])
In [579]: p.parse_args('1 3'.split())
Out[579]: Namespace(str=['1', '3', None])
In [580]: p.parse_args('1'.split())
Out[580]: Namespace(str=['1', None, None])

得到default 无。我可以用

来纠正
p.add_argument('str', nargs='?', action='append', default=argparse.SUPPRESS)

In [586]: p.parse_args('1 2'.split())
Out[586]: Namespace(str=['1', '2'])
In [588]: p.parse_args('1 2 3 4'.split())
usage: ipython3 [-h] str [str] [str]
ipython3: error: unrecognized arguments: 4

(哎呀,这是为 1-3 参数编码的,但你明白了)。

【讨论】:

  • 我相信您指的是这个未解决的问题:bugs.python.org/issue11354。自 2013 年以来,它似乎没有任何活动。
  • 是的,有大量未解决的问题。这是一个低优先级的增强。与解析代码本身相比,它需要对帮助和使用格式进行更大的更改。
猜你喜欢
  • 2019-04-15
  • 2019-08-19
  • 2018-06-24
  • 2019-04-06
  • 2020-06-13
  • 1970-01-01
  • 2016-10-13
  • 2020-02-15
  • 2013-09-23
相关资源
最近更新 更多