argparse库 学习记录
- 初始化
- 始見(jiàn)參數(shù)
- name or flags
- action
- nargs
- default
- type
- choices
- required
- help
- dest
- metavar
- 總結(jié)
繼上次的optparser庫(kù)之后,才發(fā)現(xiàn)自己意外的out of time了。原來(lái)標(biāo)準(zhǔn)的argparse庫(kù)才是處理命令行參數(shù)的一劑良方。好記性不如爛筆頭,這里還是記錄一下,以便今后的復(fù)習(xí)。
初始化
import argparseparser = argparse.ArgumentParser()初始化這個(gè)類(lèi)的時(shí)候,還是有很多的可選參數(shù)的,但是相對(duì)而言比較重要的也就是description和version吧。添加的話(huà)可以給用戶(hù)一個(gè)更加友好的體驗(yàn),不加也沒(méi)啥大不了的。
始見(jiàn)參數(shù)
這也是這個(gè)庫(kù)的核心部分了。
# =======================# Adding argument actions# =======================def add_argument(self, *args, **kwargs):"""add_argument(dest, ..., name=value, ...)add_argument(option_string, option_string, ..., name=value, ...)"""# if no positional args are supplied or only one is supplied and# it doesn't look like an option string, parse a positional# argument··· ···對(duì)此有興趣的不妨研究一下源碼。那么,一般而言可以為這個(gè)方法添加什么參數(shù)呢?
ArgumentParser.add_argument(name or flags…[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])對(duì)應(yīng)add_argument方法的說(shuō)明:
如果該方法沒(méi)有設(shè)置位置參數(shù),或者設(shè)置了一個(gè)不像可選參數(shù)的字符串,就解析為一個(gè)位置參數(shù)。
什么意思咧,大概就是說(shuō)會(huì)默認(rèn)將這種情況設(shè)置為位置參數(shù),至于位置參數(shù)和可選參數(shù)的區(qū)別,屬額外知識(shí),此處略去。
下面就來(lái)簡(jiǎn)單的測(cè)試一下這幾個(gè)參數(shù),來(lái)加深一下記憶吧。
必須參數(shù)
name or flags
先來(lái)看一個(gè)不像可選參數(shù)的字符串被解析的例子。
再來(lái)看一個(gè)位置參數(shù)的實(shí)現(xiàn)。
可選參數(shù)
可選參數(shù)一定是前面有-號(hào)的,但是有-號(hào)的不一定是可選參數(shù)
action
action比較特殊一點(diǎn),針對(duì)不同的值,這個(gè)屬性也對(duì)應(yīng)著不同的情況。
- action='store_const',見(jiàn)名知意。就是指這個(gè)本參數(shù)對(duì)應(yīng)的值為常量,類(lèi)比在C++中,常量的值不能隨意的更改,一般會(huì)在初始化的時(shí)候確定下來(lái),這里同樣秉承了這個(gè)思想,于是這個(gè)參數(shù)的值便存儲(chǔ)在了一個(gè)叫const的屬性對(duì)應(yīng)的值中。
- action='store_true/store_false',有了上面的做示范,類(lèi)比這個(gè)也就不難理解了。是的,參數(shù)的值會(huì)被默認(rèn)的存儲(chǔ)為對(duì)應(yīng)的True或者False。
需要注意的是,以上兩個(gè)屬性值原理類(lèi)似。也就是說(shuō)我們不能再為其指定額外的命令行值了,否則就會(huì)報(bào)錯(cuò)的。
E:\Code\Python\DataStructor\temp>python argptest.py -f foo -b bar usage: argptest.py [-h] [-f] [-b] argptest.py: error: unrecognized arguments: foo barE:\Code\Python\DataStructor\temp>- action='append',這個(gè)時(shí)候,命令行中賦予的參數(shù)值可以為多個(gè)咯,多個(gè)參數(shù)值會(huì)被存儲(chǔ)為一個(gè)列表。
但是使用的時(shí)候確是 要十分的小心,因?yàn)檫@個(gè)庫(kù)不會(huì)自動(dòng)的幫助我們分割命令行參數(shù)來(lái)配對(duì),所以我們必須一次一個(gè)的為其賦值, 不然它就不能正常的工作了。
E:\Code\Python\DataStructor\temp>python argptest.py -l 1 Namespace(list=['1']) ['1']E:\Code\Python\DataStructor\temp>python argptest.py -l 1 -l 2 -l 3 Namespace(list=['1', '2', '3']) ['1', '2', '3']E:\Code\Python\DataStructor\temp>python argptest.py -l 1 Namespace(list=['1']) ['1']E:\Code\Python\DataStructor\temp>python argptest.py -l 1 -l 2 -l 3 Namespace(list=['1', '2', '3']) ['1', '2', '3']E:\Code\Python\DataStructor\temp>python argptest.py -l 1 2 3 usage: argptest.py [-h] [-l LIST] argptest.py: error: unrecognized arguments: 2 3- action='count',統(tǒng)計(jì)本參數(shù)出現(xiàn)的次數(shù),也就是說(shuō)add_argument方法內(nèi)沒(méi)有此屬性的話(huà)就不會(huì)統(tǒng)計(jì)該參數(shù)出現(xiàn)的次數(shù)了。
測(cè)試結(jié)果為:
E:\Code\Python\DataStructor\temp>python argptest.py -c Namespace(count=1) 1E:\Code\Python\DataStructor\temp>python argptest.py -c -c Namespace(count=2) 2E:\Code\Python\DataStructor\temp>python argptest.py -c -c -c Namespace(count=3) 3這個(gè)例子用處不大,但是在某些時(shí)候還是很有用的。
nargs
我的理解就是:numbers of arguments。其值為數(shù)值類(lèi)型,外加一個(gè)'+'(一個(gè)或多個(gè)), 一個(gè)'*'(零個(gè)或多個(gè),更加推薦*),下面就來(lái)看個(gè)例子吧。
import argparseparser = argparse.ArgumentParser(description='here we can add some desciptions') parser.add_argument('-f', '--foo', nargs=1) parser.add_argument('-b', '--bar', nargs=2) parser.add_argument('-m', '--many', nargs='+') args = parser.parse_args() print args測(cè)試的結(jié)果為:
E:\Code\Python\DataStructor\temp>python argptest.py -f 1 -b 1 2 -m 1 2 3 3 2 1 Namespace(bar=['1', '2'], foo=['1'], many=['1', '2', '3', '3', '2', '1']) E:\Code\Python\DataStructor\temp>python argptest.py -f 1 2 usage: argptest.py [-h] [-f FOO] [-b BAR BAR] [-m MANY [MANY ...]] argptest.py: error: unrecognized arguments: 2E:\Code\Python\DataStructor\temp>python argptest.py -f 1 -b 1 usage: argptest.py [-h] [-f FOO] [-b BAR BAR] [-m MANY [MANY ...]] argptest.py: error: argument -b/--bar: expected 2 argument(s)E:\Code\Python\DataStructor\temp>python argptest.py -f 1 -b 1 2 -m a s x c d e r f g tt r w d f f Namespace(bar=['1', '2'], foo=['1'], many=['a', 's', 'x', 'c', 'd', 'e', 'r', 'f', 'g', 'tt', 'r', 'w', 'd', 'f', 'f'])不難看出,設(shè)置了什么樣的約束,就必須按照規(guī)定使用了,否則這個(gè)庫(kù)就不能正常的工作了。實(shí)際中,需要什么樣的就設(shè)置成什么樣的參數(shù)即可。
default
默認(rèn)參數(shù),這個(gè)屬性比較的有意思了,而且很容易理解。就是說(shuō),如果我們沒(méi)有在命令行中輸入?yún)?shù)對(duì)應(yīng)的值,那么這個(gè)值就會(huì)使用default屬性中設(shè)置好的了。這一點(diǎn)看似簡(jiǎn)單,但意義非凡!
import argparseparser = argparse.ArgumentParser(description='here we can add some desciptions') parser.add_argument('-f1', '--foo1', default=1) parser.add_argument('-f2', '--foo2', default='string type') parser.add_argument('-f3', '--foo3', default=[1, 'a', 2, 'b'])args = parser.parse_args() print args測(cè)試結(jié)果:
E:\Code\Python\DataStructor\temp>python argptest.py Namespace(foo1=1, foo2='string type', foo3=[1, 'a', 2, 'b'])E:\Code\Python\DataStructor\temp>python argptest.py -f1 12 Namespace(foo1='12', foo2='string type', foo3=[1, 'a', 2, 'b'])E:\Code\Python\DataStructor\temp>python argptest.py -f2 funny Namespace(foo1=1, foo2='funny', foo3=[1, 'a', 2, 'b'])由此,我們可以得到另外一個(gè)比較重要的知識(shí)點(diǎn),那就是該庫(kù)默認(rèn)將從控制臺(tái)讀取的值轉(zhuǎn)成字符串類(lèi)型,即使我們預(yù)期的不是字符串。這一點(diǎn)引起足夠的注意即可。
type
類(lèi)型約束,有時(shí)候會(huì)起到畫(huà)龍點(diǎn)睛的作用。剛好可以完善上面那個(gè)類(lèi)型轉(zhuǎn)換的問(wèn)題。
import argparseparser = argparse.ArgumentParser(description='here we can add some desciptions') parser.add_argument('-f1', '--foo1', default=1) parser.add_argument('-f2', '--foo2', default='string type') parser.add_argument('-f3', '--foo3', default=[1, 'a', 2, 'b'])args = parser.parse_args() print args測(cè)試結(jié)果:
E:\Code\Python\DataStructor\temp>python argptest.py -f 12 Namespace(foo=12)E:\Code\Python\DataStructor\temp>python argptest.py -f '12' usage: argptest.py [-h] [-f FOO] argptest.py: error: argument -f/--foo: invalid int value: "'12'"輸入非int類(lèi)型的數(shù)據(jù),就會(huì)自動(dòng)的報(bào)錯(cuò)。由此也可見(jiàn)type和default相輔相成的搭配,會(huì)使得用戶(hù)輸入的約束更契合。
choices
這個(gè)屬性意蘊(yùn)更加明顯了吧,就是說(shuō)用戶(hù)輸入的參數(shù)只能是choices里面規(guī)定的,這就跟java中的枚舉類(lèi)的使用有點(diǎn)神似咯。剛好可以嚴(yán)格的控制用戶(hù)輸入,畢竟你用于不知道你的用戶(hù)會(huì)輸入什么,除非你不給他們?nèi)我廨斎氲臋?quán)限。而choices剛好幫你實(shí)現(xiàn)了這個(gè)需求。
import argparseparser = argparse.ArgumentParser(description='here we can add some desciptions') parser.add_argument('-f', '--foo', choices=[1, 2, 3, 'a', 'abc', 3.141592653589727])args = parser.parse_args() print args測(cè)試結(jié)果:
E:\Code\Python\DataStructor\temp>python argptest.py -f 1 usage: argptest.py [-h] [-f {1,2,3,a,abc,3.14159265359}] argptest.py: error: argument -f/--foo: invalid choice: '1' (choose from 1, 2, 3, 'a', 'abc', 3.141592653589727)E:\Code\Python\DataStructor\temp>python argptest.py -f a Namespace(foo='a')因此,我們要特別注意,從控制臺(tái)輸入的數(shù)據(jù)會(huì)自動(dòng)的轉(zhuǎn)換成字符串類(lèi)型,而choices里面的值就必須有點(diǎn)講究了。我們一定要仔細(xì)的思考需要什么類(lèi)型的數(shù)據(jù)。如果非要使用int類(lèi)型的話(huà),就需要搭配type屬性了。但是如果既要字符串,又要int的話(huà),這就不好辦了。所以,請(qǐng)三思而后行。
required
意指這個(gè)參數(shù)是必須的嗎?屬性值有True和False兩個(gè)取值,按需設(shè)置即可。
import argparseparser = argparse.ArgumentParser(description='here we can add some desciptions') parser.add_argument('-f', '--foo', required=True)args = parser.parse_args() print args測(cè)試結(jié)果:
E:\Code\Python\DataStructor\temp>python argptest.py -f foooof Namespace(foo='foooof')E:\Code\Python\DataStructor\temp>python argptest.py usage: argptest.py [-h] -f FOO所以說(shuō),加了這個(gè)屬性。對(duì)用戶(hù)的輸入的限制就更加的嚴(yán)格一點(diǎn)了。
help
如果說(shuō)這些屬性里面哪個(gè)最容易理解?博主想說(shuō)的就是help了。沒(méi)有之一。其作用就是在用戶(hù)輸入--help 或者-h的時(shí)候顯示的幫助信息。這一點(diǎn)非常的有用,因?yàn)橛脩?hù)第一次使用你的庫(kù)的時(shí)候?qū)?shù)的含義一無(wú)所知,而help就起到了一個(gè)幫助文檔的作用。
看起來(lái)很有感覺(jué)了吧。
dest
此為destination的縮寫(xiě),也就是說(shuō)該參數(shù)的值將被存儲(chǔ)于dest聲明的變量中。我們可以借助輸出來(lái)探查一二。
import argparseparser = argparse.ArgumentParser(description='here we can add some desciptions') parser.add_argument('-f', '--foo', dest='variable')args = parser.parse_args() print args.variable # 注意此時(shí)-f對(duì)應(yīng)的參數(shù)將變成variable,而不再是foo,所以下面的會(huì)報(bào)錯(cuò) print args.foo測(cè)試結(jié)果:
E:\Code\Python\DataStructor\temp>python argptest.py -f foo Namespace(variable='foo')E:\Code\Python\DataStructor\temp>python argptest.py -f foo fooE:\Code\Python\DataStructor\temp>python argptest.py -f foo Traceback (most recent call last):File "argptest.py", line 16, in <module>print args.foo AttributeError: 'Namespace' object has no attribute 'foo'metavar
這個(gè)參數(shù)用于help 信息輸出中,但是貌似基本上就沒(méi)人用到過(guò)它。所以這里為了不誤導(dǎo)自己,誤導(dǎo)他人,便不再敘述,有興趣的可以自行搜索一下。
總結(jié)
本文主要講解了argparse庫(kù)的使用,圖文并茂,代碼雨測(cè)試結(jié)果并行。應(yīng)該算是比較詳細(xì)了吧。O(∩_∩)O哈哈~
但是個(gè)人覺(jué)得貌似和optparser庫(kù)區(qū)別不是很大,大致的用法還是差不多的嘛。有興趣的話(huà),可以看看下面的這個(gè)關(guān)于optparser庫(kù)的講解的鏈接。
optparser使用詳見(jiàn):http://blog.csdn.net/Marksinoberg/article/details/51842197
總結(jié)
以上是生活随笔為你收集整理的argparse库 学习记录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: class文件简介
- 下一篇: 我也来说说js的事件机制