argparse库 学习记录
- 初始化
- 始見參數
- name or flags
- action
- nargs
- default
- type
- choices
- required
- help
- dest
- metavar
- 總結
繼上次的optparser庫之后,才發現自己意外的out of time了。原來標準的argparse庫才是處理命令行參數的一劑良方。好記性不如爛筆頭,這里還是記錄一下,以便今后的復習。
初始化
import argparseparser = argparse.ArgumentParser()初始化這個類的時候,還是有很多的可選參數的,但是相對而言比較重要的也就是description和version吧。添加的話可以給用戶一個更加友好的體驗,不加也沒啥大不了的。
始見參數
這也是這個庫的核心部分了。
# =======================# 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··· ···對此有興趣的不妨研究一下源碼。那么,一般而言可以為這個方法添加什么參數呢?
ArgumentParser.add_argument(name or flags…[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])對應add_argument方法的說明:
如果該方法沒有設置位置參數,或者設置了一個不像可選參數的字符串,就解析為一個位置參數。
什么意思咧,大概就是說會默認將這種情況設置為位置參數,至于位置參數和可選參數的區別,屬額外知識,此處略去。
下面就來簡單的測試一下這幾個參數,來加深一下記憶吧。
必須參數
name or flags
先來看一個不像可選參數的字符串被解析的例子。
再來看一個位置參數的實現。
可選參數
可選參數一定是前面有-號的,但是有-號的不一定是可選參數
action
action比較特殊一點,針對不同的值,這個屬性也對應著不同的情況。
- action='store_const',見名知意。就是指這個本參數對應的值為常量,類比在C++中,常量的值不能隨意的更改,一般會在初始化的時候確定下來,這里同樣秉承了這個思想,于是這個參數的值便存儲在了一個叫const的屬性對應的值中。
- action='store_true/store_false',有了上面的做示范,類比這個也就不難理解了。是的,參數的值會被默認的存儲為對應的True或者False。
需要注意的是,以上兩個屬性值原理類似。也就是說我們不能再為其指定額外的命令行值了,否則就會報錯的。
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',這個時候,命令行中賦予的參數值可以為多個咯,多個參數值會被存儲為一個列表。
但是使用的時候確是 要十分的小心,因為這個庫不會自動的幫助我們分割命令行參數來配對,所以我們必須一次一個的為其賦值, 不然它就不能正常的工作了。
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',統計本參數出現的次數,也就是說add_argument方法內沒有此屬性的話就不會統計該參數出現的次數了。
測試結果為:
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這個例子用處不大,但是在某些時候還是很有用的。
nargs
我的理解就是:numbers of arguments。其值為數值類型,外加一個'+'(一個或多個), 一個'*'(零個或多個,更加推薦*),下面就來看個例子吧。
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測試的結果為:
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'])不難看出,設置了什么樣的約束,就必須按照規定使用了,否則這個庫就不能正常的工作了。實際中,需要什么樣的就設置成什么樣的參數即可。
default
默認參數,這個屬性比較的有意思了,而且很容易理解。就是說,如果我們沒有在命令行中輸入參數對應的值,那么這個值就會使用default屬性中設置好的了。這一點看似簡單,但意義非凡!
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測試結果:
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'])由此,我們可以得到另外一個比較重要的知識點,那就是該庫默認將從控制臺讀取的值轉成字符串類型,即使我們預期的不是字符串。這一點引起足夠的注意即可。
type
類型約束,有時候會起到畫龍點睛的作用。剛好可以完善上面那個類型轉換的問題。
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測試結果:
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類型的數據,就會自動的報錯。由此也可見type和default相輔相成的搭配,會使得用戶輸入的約束更契合。
choices
這個屬性意蘊更加明顯了吧,就是說用戶輸入的參數只能是choices里面規定的,這就跟java中的枚舉類的使用有點神似咯。剛好可以嚴格的控制用戶輸入,畢竟你用于不知道你的用戶會輸入什么,除非你不給他們任意輸入的權限。而choices剛好幫你實現了這個需求。
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測試結果:
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')因此,我們要特別注意,從控制臺輸入的數據會自動的轉換成字符串類型,而choices里面的值就必須有點講究了。我們一定要仔細的思考需要什么類型的數據。如果非要使用int類型的話,就需要搭配type屬性了。但是如果既要字符串,又要int的話,這就不好辦了。所以,請三思而后行。
required
意指這個參數是必須的嗎?屬性值有True和False兩個取值,按需設置即可。
import argparseparser = argparse.ArgumentParser(description='here we can add some desciptions') parser.add_argument('-f', '--foo', required=True)args = parser.parse_args() print args測試結果:
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所以說,加了這個屬性。對用戶的輸入的限制就更加的嚴格一點了。
help
如果說這些屬性里面哪個最容易理解?博主想說的就是help了。沒有之一。其作用就是在用戶輸入--help 或者-h的時候顯示的幫助信息。這一點非常的有用,因為用戶第一次使用你的庫的時候對參數的含義一無所知,而help就起到了一個幫助文檔的作用。
看起來很有感覺了吧。
dest
此為destination的縮寫,也就是說該參數的值將被存儲于dest聲明的變量中。我們可以借助輸出來探查一二。
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 # 注意此時-f對應的參數將變成variable,而不再是foo,所以下面的會報錯 print args.foo測試結果:
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
這個參數用于help 信息輸出中,但是貌似基本上就沒人用到過它。所以這里為了不誤導自己,誤導他人,便不再敘述,有興趣的可以自行搜索一下。
總結
本文主要講解了argparse庫的使用,圖文并茂,代碼雨測試結果并行。應該算是比較詳細了吧。O(∩_∩)O哈哈~
但是個人覺得貌似和optparser庫區別不是很大,大致的用法還是差不多的嘛。有興趣的話,可以看看下面的這個關于optparser庫的講解的鏈接。
optparser使用詳見:http://blog.csdn.net/Marksinoberg/article/details/51842197
總結
以上是生活随笔為你收集整理的argparse库 学习记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: class文件简介
- 下一篇: 我也来说说js的事件机制