使用打印sys.argv 的简单脚本我得到
1014:~/mypy$ python echoargv.py -m ['fizz','bazz']
['echoargv.py', '-m', '[fizz,bazz]']
1014:~/mypy$ python echoargv.py -m fizz,bazz
['echoargv.py', '-m', 'fizz,bazz']
1015:~/mypy$ python echoargv.py -m fizz, bazz
['echoargv.py', '-m', 'fizz,', 'bazz']
1016:~/mypy$ python echoargv.py -m ['fizz', 'bazz']
['echoargv.py', '-m', '[fizz,', 'bazz]']
1016:~/mypy$ python echoargv.py -m fizz bazz
['echoargv.py', '-m', 'fizz', 'bazz']
这就是您的parser 必须使用的。
最后一种情况,每个字符串都是sys.argv 中的一个单独项目,这是最简单的,也是您的nargs='*' 旨在处理的。它应该返回Namespace(mode = ['fizz','bazz'])
您有 2 个选项。您可以在将sys.argv 传递给parser 之前对其进行清理。或者你可以在解析后查看args.mode属性,并根据需要进行清理。
例如,'fizz,bazz' 可以在 , 上拆分。 '[fizz,bazz]' 需要先剥离 []。其他需要删除额外的,'。
您可以在自定义 Action 类中进行这种拆分和清理,但这不会为您节省任何工作。
自定义type 也可用于拆分字符串
In [170]: def foolist(astring):
alist=astring.strip('[').strip(']').split(',')
alist = [a.strip() for a in alist if len(a)]
return alist
In [171]: p=argparse.ArgumentParser()
In [172]: p.add_argument('-m',type=foolist,nargs='*')
Out[172]: _StoreAction(option_strings=['-m'], dest='m',...
In [173]: p.parse_args(['-m','one','two'])
Out[173]: Namespace(m=[['one'], ['two']])
In [174]: p.parse_args(['-m','one,two'])
Out[174]: Namespace(m=[['one', 'two']])
In [175]: p.parse_args(['-m','[one, two]'])
Out[175]: Namespace(m=[['one', 'two']])
列表是嵌套的。可以使用默认的nargs,但它不允许常规的空格分隔列表。但是有一些标准的 Python 方法可以展平嵌套列表。