2011-03-03 47 views
23

我只注意到在argparse行爲一直困擾我(想我從來沒有使用過的文件的列表啞前):爲什麼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上做了些什麼傻事,還是這只是一個不可避免的怪癖?

回答

30

要調用

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

而且它把所有的參數和附加在多列表中的單個項目。

如果你想把它當作個人物品,只是不使用附加

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

從文檔

「追加」 - 它保存了一個列表,並追加每個參數值的列表。這對於允許多次指定選項很有用。用法示例:

>>> import argparse 
>>> parser = argparse.ArgumentParser() 
>>> parser.add_argument('--foo', action='append') 
>>> parser.parse_args('--foo 1 --foo 2'.split()) 
Namespace(foo=['1', '2']) 
+2

嗯,你是對的。我從文檔中得到了錯誤的印象。也許我應該看看我是否可以在一些事情上用更好的措辭發送補丁。 :) 謝謝! – 2011-03-03 05:18:22

+1

但是,請注意,如果沒有'action ='append'',如果多次指定該選項,以前的值將被丟棄。例如''argv = [' - foo','a','b',' - foo','c']'會給'命名空間(foo = ['c'])''add_argument(' foo',nargs ='+')'。 – 2016-05-19 11:21:30

相關問題