轉載自:http://www.cnblogs.com/fireflow/p/4841389.html(我去。。沒轉載功能,ctrl + c 和 ctrl + v 得來的,格式有點問題,可去原版看看)
add_argument()方法的定義了如何解析一個命令行參數,每個參數都有各自獨立的設置參數。
1.name or flags
add_argument()必須知道參數是可選的還是必須的位置參數,第一個傳遞給add_arguments的參數必須是可選參數或者是位置參數,例如,下面是可選參數。
-
>>> parser.add_argument('-f','--foo')
而位置參數如下設置:
-
>>> parser.add_argument('bar')
當調用parse_args()函數時,可選參數通過加上前綴-來明確,剩下的參數將被指定為位置參數。
-
>>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('-f','--foo') >>> parser.add_argument('bar') >>> parser.parse_args(['BAR']) Namespace(bar='BAR', foo=None) >>> parser.parse_args(['BAR','--foo','FOO']) Namespace(bar='BAR', foo='FOO') >>> parser.parse_args(['--foo','FOO']) usage: PROG [-h][-f FOO] bar PROG: error: too few arguments
2.action
action參數指定了參數是如何被處理的。支持額操作如下:
store:這個只是簡單的存儲這個參數值,這也是默認操作。
-
>>> parser=argparse.ArgumentParser() >>> parser.add_argument('--foo') >>> parser.parse_args('--foo 1'.split()) Namespace(foo='1')
store_const:存儲const指定的值。
-
>>> parser=argparse.ArgumentParser() >>> parser.add_argument('--foo',action='store_const',const=42) >>> parser.parse_args('--foo'.split()) Namespace(foo=42)
store_false和store_true:分別對應存儲True和False值。它們是store_const的特例。
-
>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='store_true') >>> parser.add_argument('--bar', action='store_false') >>> parser.parse_args('--foo --bar'.split()) Namespace(bar=False, foo=True)
append:保存為列表格式,將每個參數的值添加到這個列表。
-
>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='append') >>> parser.parse_args('--foo 1 --foo 2'.split()) Namespace(foo=['1','2'])
append_const:保存為列表,但是值必須是const指定參數的值。
-
>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--str', dest='types', action='append_const', const=str) >>> parser.add_argument('--int', dest='types', action='append_const', const=int) >>> parser.parse_args('--str --int'.split()) Namespace(types=[<type 'str'>,<type 'int'>])
version:需要指定version參數,當調用add_argument方法時,會打印版本信息並退出。
-
>>>import argparse >>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('--version', action='version', version='%(prog)s 2.0') >>> parser.parse_args(['--version']) PROG 2.0
你也可以通過繼承Action類來實現自定義action類型,通過繼承argparse.action,並提供__call__()方法,提供四個參數。
parser:ArgumentParser對象。
namespace:parse_args()返回的命名空間。
values:相關聯的命令行參數
option_string:可選字符串,用來觸發action,如果沒有指定,就通過位置參數來關聯。
-
>>> classFooAction(argparse.Action): ... def__call__(self,parser,namespace,values,option_string=None): ... print'%r%r%r'%(namespace,values,option_string) ... setattr(namespace,self.dest,values) ... >>> parser=argparse.ArgumentParser() >>> parser.add_argument('--foo',action=FooAction) >>> parser.add_argument('bar',action=FooAction) >>> args=parser.parse_args('1 --foo 2'.split()) Namespace(bar=None, foo=None)'1'None Namespace(bar='1', foo=None)'2''--foo' >>> args Namespace(bar='1', foo='2')
3.nargs
nargs參數將幾個不同的參數跟action關聯,支持的值如下:
N(一個整數):N個從命令行中獲取的參數將會組成一個列表。
-
>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', nargs=2) >>> parser.add_argument('bar', nargs=1) >>> parser.parse_args('c --foo a b'.split()) Namespace(bar=['c'], foo=['a','b']) Note that ``nargs=1`` produces a list of one item.Thisis different from the default,in which the item is produced by itself.
"?":從命令行參數中獲取一個值,如果沒有任何參數提供,則會使用default提供的默認值,注意對於可選參數的一種特殊情況,可選字符串提供了,但是后面沒有接參數,這時會使用const值。
-
>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', nargs='?', const='c', default='d') >>> parser.add_argument('bar', nargs='?', default='d') >>> parser.parse_args('XX --foo YY'.split()) Namespace(bar='XX', foo='YY') >>> parser.parse_args('XX --foo'.split()) Namespace(bar='XX', foo='c') >>> parser.parse_args(''.split()) Namespace(bar='d', foo='d')
另外一種情況是通過?來支持可選的輸入輸出文件。
-
>>> parser = argparse.ArgumentParser() >>> parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), default=sys.stdin) >>> parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'), default=sys.stdout) >>> parser.parse_args(['input.txt','output.txt']) Namespace(infile=<open file 'input.txt', mode 'r' at 0x...>, outfile=<open file 'output.txt', mode 'w' at 0x...>) >>> parser.parse_args([]) Namespace(infile=<open file '<stdin>', mode 'r' at 0x...>, outfile=<open file '<stdout>', mode 'w' at 0x...>)
"*":支持多個參數值。
-
>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', nargs='*') >>> parser.add_argument('--bar', nargs='*') >>> parser.add_argument('baz', nargs='*') >>> parser.parse_args('a b --foo x y --bar 1 2'.split()) Namespace(bar=['1','2'], baz=['a','b'], foo=['x','y'])
-
>>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('foo', nargs='+') >>> parser.parse_args('a b'.split()) Namespace(foo=['a','b']) >>> parser.parse_args(''.split()) usage: PROG [-h] foo [foo ...] PROG: error: too few arguments
如果沒有提供nargs參數的話,參數個數將由action來決定,默認情況下同單個參數。
4.const
const保存的值為不需要從命令行中讀取但是對於ArgumentParser對象的action操作來說又必須的值。一般用於以下兩個用途。
當action='store_const'或者action="append_const"的時候
當使用可選參數,並且narg=?的時候,並且命令行參數沒有給出可選字符串以及可選參數的時候。
5.default
default設置默認值。如果可選參數沒有提供可選字符串。則
-
>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', default=42) >>> parser.parse_args('--foo 2'.split()) Namespace(foo='2') >>> parser.parse_args(''.split()) Namespace(foo=42)
對於帶nargs=?或者*的位置參數,當命令行參數沒有提供的時候將使用默認值。
-
>>> parser = argparse.ArgumentParser() >>> parser.add_argument('foo', nargs='?', default=42) >>> parser.parse_args('a'.split()) Namespace(foo='a') >>> parser.parse_args(''.split()) Namespace(foo=42)
如果提供default=argparse.SUPPRESS的話,這時不會有任何屬性添加到命名空間。
6.type
默認情況下下,ArgumentParser將從命令行中讀取的參數視為string類型,但是有時候也可以指定為其他類型。
-
>>> parser = argparse.ArgumentParser() >>> parser.add_argument('foo', type=int) >>> parser.add_argument('bar', type=file) >>> parser.parse_args('2 temp.txt'.split()) Namespace(bar=<open file 'temp.txt', mode 'r' at 0x...>, foo=2)
為了簡便文件參數的使用,argparser模塊提供了FileType類工廠。
-
>>> parser = argparse.ArgumentParser() >>> parser.add_argument('bar', type=argparse.FileType('w')) >>> parser.parse_args(['out.txt']) Namespace(bar=<open file 'out.txt', mode 'w' at 0x...>)
type屬性還可以接收一個回調函數,這個回調函數接收一個命令行參數並返回轉換類型之后的值
-
>>>def perfect_square(string): ... value = int(string) ... sqrt = math.sqrt(value) ... if sqrt != int(sqrt): ... msg ="%r is not a perfect square"% string ... raise argparse.ArgumentTypeError(msg) ... return value ... >>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('foo', type=perfect_square) >>> parser.parse_args('9'.split()) Namespace(foo=9) >>> parser.parse_args('7'.split()) usage: PROG [-h] foo PROG: error: argument foo:'7'isnot a perfect square
如果提供choices參數的話,可以檢測值的范圍。
-
>>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('foo', type=int, choices=xrange(5,10)) >>> parser.parse_args('7'.split()) Namespace(foo=7) >>> parser.parse_args('11'.split()) usage: PROG [-h]{5,6,7,8,9} PROG: error: argument foo: invalid choice:11(choose from5,6,7,8,9)
7.choices
有時候需要限制參數在某個范圍之內,這時可以通過choices提供這個參數范圍,如果提供的參數值不在這個范圍之內,那么會報錯。
-
>>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('foo', choices='abc') >>> parser.parse_args('c'.split()) Namespace(foo='c') >>> parser.parse_args('X'.split()) usage: PROG [-h]{a,b,c} PROG: error: argument foo: invalid choice:'X'(choose from'a','b','c')
注意,如果包含type參數的話,只有type參數的條件滿足之后才會檢查給定的參數值是否在choices之內。
-
>>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('foo', type=complex, choices=[1,1j]) >>> parser.parse_args('1j'.split()) Namespace(foo=1j) >>> parser.parse_args('-- -4'.split()) usage: PROG [-h]{1,1j} PROG: error: argument foo: invalid choice:(-4+0j)(choose from1,1j)
所有支持in運算符的對象都可以賦給choices,所以dict、set、list都可以。
8.required
一般情況下,argparse模塊將帶"-"前綴(例如-f)或者帶"--"前綴的(例如--bar)的參數視為可選參數,,為了使可選參數變成必須參數,可以設置required值為True。
-
>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', required=True) >>> parser.parse_args(['--foo','BAR']) Namespace(foo='BAR') >>> parser.parse_args([]) usage: argparse.py [-h][--foo FOO] argparse.py: error: option --foo is required
如果設置了required為真,並且也沒有提供這個參數值,則報錯。
9.help
當用戶使用-h 或者--help參數時,顯示額幫助信息。
-
>>> parser = argparse.ArgumentParser(prog='frobble') >>> parser.add_argument('--foo', action='store_true', ... help='foo the bars before frobbling') >>> parser.add_argument('bar', nargs='+', ... help='one of the bars to be frobbled') >>> parser.parse_args('-h'.split()) usage: frobble [-h][--foo] bar [bar ...] positional arguments: bar one of the bars to be frobbled optional arguments: -h,--help show this help message and exit --foo foo the bars before frobbling
help中可以使用格式化信息。例如
-
>>> parser = argparse.ArgumentParser(prog='frobble') >>> parser.add_argument('bar', nargs='?', type=int, default=42, ... help='the bar to %(prog)s (default: %(default)s)') >>> parser.print_help() usage: frobble [-h][bar] positional arguments: bar the bar to frobble (default:42) optional arguments: -h,--help show this help message and exit
10.metavar
當ArgumentParser生成幫助信息的時候,它需要通過某種方式來引用參數,對於位置參數,參數直接引用,對於可選參數,將其轉換成大寫再引用。
-
>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo') >>> parser.add_argument('bar') >>> parser.parse_args('X --foo Y'.split()) Namespace(bar='X', foo='Y') >>> parser.print_help() usage:[-h][--foo FOO] bar positional arguments: bar optional arguments: -h,--help show this help message and exit --foo FOO
除此之外,還可以通過metavar指定別名。
-
>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', metavar='YYY') >>> parser.add_argument('bar', metavar='XXX') >>> parser.parse_args('X --foo Y'.split()) Namespace(bar='X', foo='Y') >>> parser.print_help() usage:[-h][--foo YYY] XXX positional arguments: XXX optional arguments: -h,--help show this help message and exit --foo YYY
注意metavar只改變顯示的名字,不同的nargs參數值,可能導致metavar參數需要使用多次,這時可以提供metavar參數來生成不同的顯示。
-
1 >>> parser = argparse.ArgumentParser(prog='PROG') 2 >>> parser.add_argument('-x', nargs=2) 3 >>> parser.add_argument('--foo', nargs=2, metavar=('bar','baz')) 4 >>> parser.print_help() 5 usage: PROG [-h][-x X X][--foo bar baz] 6 optional arguments: 7 -h,--help show this help message and exit 8 -x X X 9 --foo bar baz
11.dest
ArgumentParser對象通過dest來指定要傳入的參數值。
-
>>> parser = argparse.ArgumentParser() >>> parser.add_argument('bar') >>> parser.parse_args('XXX'.split()) Namespace(bar='XXX')
對於可選參數,dest的值根據可選參數的不同而相應改變,如果是完整字符串,使用去掉--前綴之后的字符串,如果是簡短名,則使用去除-前綴之后的字符串,如果字符串中間帶有-,則將-替換成_以使這個字符串合法。
-
>>> parser = argparse.ArgumentParser() >>> parser.add_argument('-f','--foo-bar','--foo') >>> parser.add_argument('-x','-y') >>> parser.parse_args('-f 1 -x 2'.split()) Namespace(foo_bar='1', x='2') >>> parser.parse_args('--foo 1 -y 2'.split()) Namespace(foo_bar='1', x='2')
dest允許設置自定義名字:
-
>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', dest='bar') >>> parser.parse_args('--foo XXX'.split()) Namespace(bar='XXX')