使用 argparse 和 'nargs=*' 参数声明所需参数时的断言
Assertion when declaring required arguments with argparse and 'nargs=*' arguments
这是解析参数的当前代码:
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
是可选标志。
argparse
不喜欢 metavar=''
.
给它们命名或删除选项 - 但不要将它们保留为空字符串。
没有 '-a' 或 '-i' 会引发错误,因为它们是您创建的 'required'.
但是在格式化错误消息的 'usage' 部分时:
usage: PROG [-h] -a act -i INTERFACE [-d] [--ips [ips [ips ...]]]
[--handles [handles [handles ...]]]
将这么长的用法包装到 2 行时遇到错误。正如由 2 个 metavar=''
参数生成的 gus42
所指出的。这是使用格式中的一个已知错误。 metavar
和 []
也会产生这个问题。
上面的用法在第一种情况下使用metavar='act'
,在第二种情况下默认使用None
。所以你可以缩短 metavar
,但你不能完全抑制它,至少当使用行足够长可以换行时不能。
这是解析参数的当前代码:
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
是可选标志。
argparse
不喜欢 metavar=''
.
给它们命名或删除选项 - 但不要将它们保留为空字符串。
没有 '-a' 或 '-i' 会引发错误,因为它们是您创建的 'required'.
但是在格式化错误消息的 'usage' 部分时:
usage: PROG [-h] -a act -i INTERFACE [-d] [--ips [ips [ips ...]]]
[--handles [handles [handles ...]]]
将这么长的用法包装到 2 行时遇到错误。正如由 2 个 metavar=''
参数生成的 gus42
所指出的。这是使用格式中的一个已知错误。 metavar
和 []
也会产生这个问题。
上面的用法在第一种情况下使用metavar='act'
,在第二种情况下默认使用None
。所以你可以缩短 metavar
,但你不能完全抑制它,至少当使用行足够长可以换行时不能。