26

我刚刚注意到 argparse 中的一个行为让我感到困惑(我猜我以前从未将它用于愚蠢的文件列表):

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('multi', action='append', nargs='+')
print(parser.parse_args())

这给了我输出:

~$ ./testargs.py foo bar baz
Namespace(multi=[['foo', 'bar', 'baz']])
~$ 

我希望multi['foo', 'bar', 'baz'],而不是列表中的列表。照原样,我必须在处理之前抓住args.multi[0],这没什么大不了的,但感觉就像一个丑陋的疣,我想了解它为什么在那里。

我是在做一些愚蠢的事情add_argument,还是这只是一个不可避免的怪癖?

4

1 回答 1

34

你在打电话

parser.add_argument('multi', action='append', nargs='+')

它采用所有参数并将其作为单个项目附加到多列表中。

如果您希望将其作为单个项目,请不要使用 append

parser.add_argument('multi', nargs='+')

从文档

'append' - 这会存储一个列表,并将每个参数值附加到列表中。这对于允许多次指定选项很有用。示例用法:

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
于 2011-03-03T05:10:48.863 回答