在使用argparse和'nargs = *'参数声明所需参数时断言

时间:2015-02-23 16:43:31

标签: python argparse assertions

以下是解析参数的当前代码:

parser = argparse.ArgumentParser()

parser.add_argument('-a', '--action', required=True, metavar='', nargs=1, help='{block|release|clear|show|show_extended|}')
parser.add_argument('-i', '--interface', required=True, metavar='', nargs=1, help='interface name')
parser.add_argument('-d', '--debug', action='store_true', help='debug prints')
parser.add_argument('--ips', metavar='ips', nargs='*', help='ip addresses to block')
parser.add_argument('--handles', metavar='handles', nargs='*', help='filters handles to delete (usually 800::xxx), run with [show] to see')
args = parser.parse_args()

当我尝试在不输入-a或-i的情况下执行它时,我得到一个断言:

Traceback (most recent call last):
  File "./block_traffic.py", line 112, in <module>
    args = parser.parse_args()
  File "/usr/lib/python2.7/argparse.py", line 1690, in parse_args
    args, argv = self.parse_known_args(args, namespace)
  File "/usr/lib/python2.7/argparse.py", line 1722, in parse_known_args
    namespace, args = self._parse_known_args(args, namespace)
  File "/usr/lib/python2.7/argparse.py", line 1946, in _parse_known_args
    self.error(_('argument %s is required') % name)
  File "/usr/lib/python2.7/argparse.py", line 2362, in error
    self.print_usage(_sys.stderr)
  File "/usr/lib/python2.7/argparse.py", line 2324, in print_usage
    self._print_message(self.format_usage(), file)
  File "/usr/lib/python2.7/argparse.py", line 2280, in format_usage
    return formatter.format_help()
  File "/usr/lib/python2.7/argparse.py", line 281, in format_help
    help = self._root_section.format_help()
  File "/usr/lib/python2.7/argparse.py", line 211, in format_help
    func(*args)
  File "/usr/lib/python2.7/argparse.py", line 332, in _format_usage
    assert ' '.join(opt_parts) == opt_usage
AssertionError

我注意到断言异常消失了,因为我删除了nargs='*'参数(两个中的一个)

我想要的是前2个参数是强制性的,最后2个是可选的(具有未确定的参数数量),-d是可选标志。

2 个答案:

答案 0 :(得分:6)

argparse不喜欢metavar=''

要么给他们一个名字或删除选项 - 但不要将它们留作空字符串。

答案 1 :(得分:1)

没有&#39; -a&#39;或者&#39; -i&#39;它会引发一个错误,因为你需要这些错误。

但在格式化&#39;用法&#39;部分错误消息:

usage: PROG [-h] -a act -i INTERFACE [-d] [--ips [ips [ips ...]]]
            [--handles [handles [handles ...]]]

将长时间使用包装到2行时遇到错误。正如gus42所指出的那样,由metavar=''个参数产生。这是使用格式中的已知错误。带有metavar的{​​{1}}也会产生此问题。

上述用法在第一种情况下使用[],在第二种情况下使用默认metavar='act'。所以你可以缩短None,但是你不能完全压制它,至少在使用线足够长的情况下不能包裹它。