記錄學(xué)習(xí)argparse模塊的一個(gè)產(chǎn)出盲泛,也防止自己忘記,多看看惯殊,溫故而知新诱咏。
下面分三個(gè)方面來講:定位參數(shù),可選參數(shù)以及add_argumentparser的參數(shù)使用既绕,所有記錄都配上最簡單的例子啄刹,更容易理解
- 定位參數(shù)
import argparse
parser = argparse.ArgumentParser(description = "give me a string")
parser.add_argument('str')
args = parser.parse_args()
print(args)
在命令窗口下執(zhí)行,參數(shù)選擇-h凄贩,會(huì)打印出str是定位參數(shù)誓军,-h是可選參數(shù),因此這里只帶上-h的參數(shù)是達(dá)不到代碼的目的疲扎,所以需要將str的值傳進(jìn)去昵时,如下圖捷雕,這里將兩個(gè)參數(shù)都帶上,可以看到str的值被打印壹甥,并且help信息也被打印救巷。但其實(shí)-h是默認(rèn)的可選參數(shù),我們使用的時(shí)候可以不帶句柠。
以上代碼就是定位參數(shù)的簡單使用
- 可選參數(shù)
import argparse
parser = argparse.ArgumentParser(description = "give me a string")
parser.add_argument('str')
parser.add_argument('-n')
args = parser.parse_args()
print(args)
print(args.n)
執(zhí)行argparse_use.py如下浦译,能看出如果不傳入n的值,默認(rèn)打印none溯职,所以可選參數(shù)的含義顧名思義精盅。
很多代碼中能看到parser.add_argument('-n', '--name')代碼中添加可選參數(shù)name,那n和name是什么關(guān)系缸榄,應(yīng)該怎么使用渤弛?這個(gè)比較簡單:如果n和name同時(shí)存在,那么在命令行中傳參的時(shí)候可以用n或者name甚带,但是代碼中調(diào)用的話只能用name她肯,比如說打印時(shí)需要修改成print(args.name)
其實(shí)大部分代碼都沒有那么簡單,add_argument這個(gè)函數(shù)的參數(shù)比較多鹰贵,以上是最簡單的使用方法晴氨,接下來會(huì)以最簡單的方式說明這個(gè)函數(shù)的用法。
- add_ArgumentParse
name or flag: 定位參數(shù)和可選參數(shù)的名稱碉输,注意如果-n和–name同時(shí)出現(xiàn)籽前,則認(rèn)為name為可選參數(shù)名稱。-n是–name的簡寫敷钾,因此解析時(shí)必須用全稱枝哄,但命令行執(zhí)行時(shí)簡稱、全稱都可以阻荒。這里的解析我理解成在代碼中調(diào)用挠锥,比如說args.name,命令執(zhí)行就是說在命令窗口輸入?yún)?shù)值的時(shí)候侨赡,比如上面的python argparse_use.py “I am the string” –n “Lisa”(這個(gè)上面已經(jīng)說到了)
下面看個(gè)簡單例子:
import argparse
parser = argparse.ArgumentParser(description = "give me a string")
parser.add_argument('str')
parser.add_argument('-n', '--name')
args = parser.parse_args()
print(args)
print(args.name)
add_argument中多加一個(gè)—name蓖租,咱們來執(zhí)行看看,
可以看到,在命令行里傳參用-n或者—name都行羊壹。另外蓖宦,在代碼里調(diào)用參數(shù)只能用name哦,可以嘗試將以上代碼最后一個(gè)打印修改成print(args.n)油猫,看看會(huì)出現(xiàn)什么結(jié)果稠茂!
default:對于可選參數(shù),如果命令行執(zhí)行時(shí)未指明可選參數(shù)的值情妖,則可選參數(shù)默認(rèn)為default的值主慰;如果命令行指定可選參數(shù)值嚣州,則可選參數(shù)即命令行指定的值。對于定位參數(shù)不適用共螺。
看明白了上面的,這個(gè)就很容易懂了情竹,還是舉個(gè)例子,
import argparse
parser = argparse.ArgumentParser(description = "give me a string")
parser.add_argument('str')
parser.add_argument('-n', '--name', default="Bob")
args = parser.parse_args()
print(args)
print(args.name)
help:無論可選參數(shù)還是定位參數(shù)藐不,都是在命令行執(zhí)行–help時(shí)顯示的提示內(nèi)容。
這個(gè)前面的例子中已經(jīng)用過了秦效。
type:指定傳入?yún)?shù)的類型雏蛮。在命令行執(zhí)行時(shí)傳入的參數(shù)也必須是type指定的類型。如果不寫阱州,則命令行傳入的參數(shù)無論寫2還是a都默認(rèn)為string挑秉。參數(shù)解析時(shí)會(huì)自動(dòng)將2和a轉(zhuǎn)換成string
還是拿剛剛那個(gè)例子來執(zhí)行,
添加一個(gè)int參數(shù)看看
import argparse
parser = argparse.ArgumentParser(description = "give me a string")
parser.add_argument('str')
parser.add_argument('-n', '--name', default="Bob")
parser.add_argument('-a', '--age', type=int)
args = parser.parse_args()
print(args)
print(args.name)
print(args.age/2)
nargs:
1) ‘*’:所有當(dāng)前命令行參數(shù)被聚集到一個(gè)列表中(定位參數(shù)一個(gè)列表苔货,可選參數(shù)一個(gè)列表)通過 nargs=’*'來實(shí)現(xiàn)多個(gè)位置參數(shù)通常沒有意義犀概,但是多個(gè)選項(xiàng)是可能的
import argparse
parser = argparse.ArgumentParser(description = "give me a string")
parser.add_argument('str', nargs='*')
parser.add_argument('-n', nargs='*')
args = parser.parse_args()
print(args)
print(args.n)
2) '+'和 ‘*’ 類似,所有當(dāng)前命令行參數(shù)被聚集到一個(gè)列表中夜惭。另外姻灶,如果定位參數(shù)在命令行沒有參數(shù)會(huì)產(chǎn)生一個(gè)錯(cuò)誤信息。當(dāng)“*”時(shí)诈茧,命令行沒有任何定位參數(shù)产喉,結(jié)果為一空列表;當(dāng)+時(shí)敢会,命令行沒有任何定位參數(shù)會(huì)報(bào)錯(cuò)曾沈。對于可選參數(shù),無論“*”還是“+”鸥昏,命令行沒有任何參數(shù)都是None塞俱,或者default指定的值。這個(gè)與我們的理解應(yīng)該是一致的互广。下面的例子能說明這些問題敛腌。
import argparse
parser = argparse.ArgumentParser(description = "give me a string")
parser.add_argument('str', nargs='*')
parser.add_argument('char', nargs='+')
parser.add_argument('-n', nargs='*')
parser.add_argument('-a', nargs='+')
args = parser.parse_args()
print(args.str)
print(args.char)
print(args.n)
print(args.a)
3) N:(一個(gè)整數(shù))。命令行中的 N 個(gè)參數(shù)會(huì)被聚集到一個(gè)列表中
import argparse
parser = argparse.ArgumentParser(description = "give me a string")
parser.add_argument('str', nargs=1)
parser.add_argument('char', nargs=2)
parser.add_argument('-n', nargs='*')
parser.add_argument('-a', nargs='+')
args = parser.parse_args()
print(args.str)
print(args.char)
print(args.n)
print(args.a)
上面多加了str4參數(shù)惫皱,代碼就報(bào)錯(cuò)了像樊,因?yàn)閟tr4已經(jīng)不能被分配了。
choice:用于界定參數(shù)的取值范圍旅敷。下例中生棍,age的范圍是25-35,傳入10這個(gè)值就會(huì)報(bào)錯(cuò)
import argparse
parser = argparse.ArgumentParser(description = "give me a string")
parser.add_argument('-a', '--age', type=int, choices=range(25,35))
args = parser.parse_args()
print(args.age)
dest: parse_arg()之后add_argument中返回的變量名稱媳谁。如下例涂滴,對于可選參數(shù)友酱,首先指定可選參數(shù)名為-s,parse_arg()之后柔纵,可選參數(shù)的名稱就會(huì)變?yōu)閟ex(此時(shí)嘗試將print(args.sex)修改成print(args.s)缔杉,執(zhí)行時(shí)會(huì)報(bào)錯(cuò)),故下面使用時(shí)為args.sex搁料。在命令窗口傳參時(shí)不能使用sex或详,執(zhí)行情況如下。
import argparse
parser = argparse.ArgumentParser(description = "give me a string")
parser.add_argument('-a', '--age', type=int)
parser.add_argument('-s', dest='sex')
args = parser.parse_args()
print(args.age)
print(args.sex)
required:用來設(shè)置必選參數(shù)郭计,設(shè)定后在命令行不使用會(huì)報(bào)錯(cuò)霸琴。以下代碼-a就必須傳參,否則會(huì)報(bào)錯(cuò)昭伸。
import argparse
parser = argparse.ArgumentParser(description = "give me a string")
parser.add_argument('-a', '--age', type=int, required=True)
parser.add_argument('-s', dest='sex')
args = parser.parse_args()
print(args.age)
print(args.sex)
metavar:在命令行所接參數(shù)的樣式的示例梧乘。初看這句話不是很明白,操作一遍就知道了庐杨。
import argparse
parser = argparse.ArgumentParser(description = "I am a test")
parser.add_argument('-s', dest='sex', metavar='FEMALE')
args = parser.parse_args()
print(args.sex)
輸入-h參數(shù)會(huì)顯示-s后面輸入的參數(shù)形式可以類似與FEMALE這樣选调,所以對于初次使用這個(gè)代碼的人來說,能夠幫助他們知道-s可以輸入什么類型的參數(shù)辑莫。
const:是針對于action中的’store_const’與’append_const’而出現(xiàn)学歧。其實(shí)對于那些需要接值的參數(shù),預(yù)先存儲(chǔ)一個(gè)值各吨,如果沒有則取用這個(gè)值
action:用來給ArgumenParser對象判斷如何處理命令行參數(shù)支持的操作如下:
1) ‘store’ - 默認(rèn)的操作枝笨,用來存儲(chǔ)參數(shù)的值。
2) ‘store_const’ - 適用于可選參數(shù)optional arguments揭蜒,用來存儲(chǔ)const關(guān)鍵字指定的值横浑。如下例,對于可選參數(shù)屉更,s存儲(chǔ)的值為female徙融,默認(rèn)為1,在命令行執(zhí)行時(shí)瑰谜,如果不寫–s則為默認(rèn)的1欺冀,如果寫上–s,則表示調(diào)用–s存儲(chǔ)的female萨脑,這時(shí)只需寫–s表示調(diào)用隐轩,后不跟任何參數(shù)。對于定位參數(shù)渤早,命令行執(zhí)行時(shí)什么都不寫职车,會(huì)自動(dòng)調(diào)用I am the string,因此default=you are right在這里無用。注意悴灵,這里const后接的值就代表了類型扛芽,如1表示int,如果是‘1’則表示string积瞒,無需再指定type川尖。
import argparse
parser = argparse.ArgumentParser(description = "I am a test")
parser.add_argument('str', action='store_const', const='i am the string', default='you are right')
parser.add_argument('-s', action='store_const', const='female', default=1)
args = parser.parse_args()
print(args.str)
print(args.s)
3) append:存儲(chǔ)一個(gè)列表,并且將每個(gè)參數(shù)值追加到列表中赡鲜。在允許多次使用選項(xiàng)時(shí)很有用空厌,僅適用于可選參數(shù)。
import argparse
parser = argparse.ArgumentParser(description = "I am a test")
parser.add_argument('-s', action='append')
args = parser.parse_args()
print(args.s)
4) append_const: 與store_const方法類似银酬,只是這里的const值被放到一個(gè)列表里。
import argparse
parser = argparse.ArgumentParser(description = "I am a test")
parser.add_argument('str', action='append_const', const='i am the string')
parser.add_argument('-s', action='append_const', const='female')
args = parser.parse_args()
print(args.str)
print(args.s)