-i
应该被配置为接受3个参数并使用 append
操作。
>>> p = argparse.ArgumentParser()
>>> p.add_argument("-i", nargs=3, action='append')
_AppendAction(...)
>>> p.parse_args("-i a b c -i d e f -i g h i".split())
Namespace(i=[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']])
为了处理可选值,您可以尝试使用简单的自定义类型。在这种情况下,-i
的参数是一个由逗号分隔的字符串,最多分割两次。您需要对值进行后处理,以确保至少指定了两个值。
>>> p.add_argument("-i", type=lambda x: x.split(",", 2), action='append')
>>> print p.parse_args("-i a,b,c -i d,e -i g,h,i,j".split())
Namespace(i=[['a', 'b', 'c'], ['d', 'e'], ['g', 'h', 'i,j']])
为了更加灵活控制,可以定义一个自定义操作。这个操作继承了内置的
_AppendAction
(由
action ='append'
使用),但只是对给定的
-i
参数数量进行一些范围检查。
为了更好地控制,请定义自定义操作。此示例扩展了内置操作 _AppendAction
(由 action ='append'
使用),但只是对给定参数 -i
的数量进行了一些范围检查。
class TwoOrThree(argparse._AppendAction):
def __call__(self, parser, namespace, values, option_string=None):
if not (2 <= len(values) <= 3):
raise argparse.ArgumentError(self, "%s takes 2 or 3 values, %d given" % (option_string, len(values)))
super(TwoOrThree, self).__call__(parser, namespace, values, option_string)
p.add_argument("-i", nargs='+', action=TwoOrThree)