为什么argparse给我一个列表清单?

Nic*_*ght 25 python argparse

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

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('multi', action='append', nargs='+')
print(parser.parse_args())
Run Code Online (Sandbox Code Playgroud)

这给了我输出:

~$ ./testargs.py foo bar baz
Namespace(multi=[['foo', 'bar', 'baz']])
~$ 
Run Code Online (Sandbox Code Playgroud)

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

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

Sen*_*ran 33

你在打电话

parser.add_argument('multi', action='append', nargs='+')
Run Code Online (Sandbox Code Playgroud)

它将所有参数和附加作为多列表中的单个项目.

如果您想将它作为单独的项目,请不要使用追加

parser.add_argument('multi', nargs='+')
Run Code Online (Sandbox Code Playgroud)

来自文档

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

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
Run Code Online (Sandbox Code Playgroud)

  • 但是,请注意,如果没有 `action='append'`,如果多次指定该选项,先前的值将被丢弃。例如 `argv=['--foo', 'a', 'b', '--foo', 'c']` 将为 `add_argument('- -foo', nargs='+')`。 (3认同)
  • 嗯,你说得对.我从文档中得到了错误的印象.也许我应该看看是否可以在一些事情上发送一个更好措辞的补丁.:) 谢谢! (2认同)