这是一个快速解决方案,一次解码一对参数列表(选项、位置参数)。
import argparse
class ExtendAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
items = getattr(namespace, self.dest, None)
if items is None:
items = []
items.extend(values)
setattr(namespace, self.dest, items)
parser = argparse.ArgumentParser()
parser.add_argument('files', nargs='*', action=ExtendAction)
parser.add_argument('-z', action='store_true')
parser.add_argument('-v', action='count')
parser.add_argument('args_tail', nargs=argparse.REMAINDER)
def interleaved_parse(argv=None):
opts = parser.parse_args(argv)
optargs = opts.args_tail
while optargs:
opts = parser.parse_args(optargs, opts)
optargs = opts.args_tail
return opts
print(interleaved_parse('-z bar foo'.split()))
print(interleaved_parse('bar foo -z'.split()))
print(interleaved_parse('bar -z foo'.split()))
print(interleaved_parse('-v a -zv b -z c -vz d -v'.split()))
Output:
Namespace(args_tail=[], files=['bar', 'foo'], v=None, z=True)
Namespace(args_tail=[], files=['bar', 'foo'], v=None, z=True)
Namespace(args_tail=[], files=['bar', 'foo'], v=None, z=True)
Namespace(args_tail=[], files=['a', 'b', 'c', 'd'], v=4, z=True)
注意:不要尝试将其与其他非标志参数一起使用(除了单个nargs='*'
论证和args_tail
争论)。解析器不会知道以前的调用parse_args
因此它将为这些非标志参数存储错误的值。作为解决方法,您可以解析nargs='*'
使用后手动参数interleaved_parse
.