argparse 做命令列解析
衝突的選項
以相同的引數名字為一個解析器新增兩個引數處理器會引發一個異常。可以通過傳遞一個conflict_handler
來改變衝突消除行為。argparse有兩個內建的衝突處理器error
(預設)和resolve
,resolve
會基於衝突選項的新增順序來選擇一個引數處理器。
import argparse
parser = argparse.ArgumentParser(conflict_handler='resolve')
parser.add_argument('-a', action="store")
parser.add_argument('-b', action="store" , help="Short alone")
parser.add_argument('--long-b', '-b', action="store", help="Long and short together")
print parser.parse_args(['-h'])
由於最後一個處理器所給定的引數名已被使用,那麼本例中獨立選項-b將被–long-b的別名所覆蓋。
輸出:
$ python argparse_conflict_handler_resolve.py
usage: argparse_conflict_handler_resolve.py [-h] [-a A] [--long -b LONG_B]
optional arguments:
-h, --help show this help message and exit
-a A
--long-b LONG_B, -b LONG_B
Long and short together
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
每個引數解釋如下:
name or flags
- 選項字串的名字或者列表,例如 foo 或者 -f, –foo。
action
- 命令列遇到引數時的動作,預設值是 store。
store_const
,表示賦值為const;
append
,將遇到的值儲存成列表,也就是如果引數重複則會儲存多個值;
append_const
,將引數規範中定義的一個值儲存到一個列表;
count
,儲存遇到的次數;此外,也可以繼承 argparse.Action 自定義引數解析;
nargs
- 應該讀取的命令列引數個數,可以是具體的數字,或者是?號,當不指定值時對於 Positional argument 使用 default,對於 Optional argument
使用 const;或者是 * 號,表示 0 或多個引數;或者是 + 號表示 1 或多個引數。
const - action
和 nargs 所需要的常量值。
default
- 不指定引數時的預設值。
type
- 命令列引數應該被轉換成的型別。
choices
- 引數可允許的值的一個容器。
required
- 可選引數是否可以省略 (僅針對可選引數)。
help
- 引數的幫助資訊,當指定為 argparse.SUPPRESS 時表示不顯示該引數的幫助資訊.
metavar
- 在 usage 說明中的引數名稱,對於必選引數預設就是引數名稱,對於可選引數預設是全大寫的引數名稱.
dest
- 解析後的引數名稱,預設情況下,對於可選引數選取最長的名稱,中劃線轉換為下劃線.
action引數動作
argparse內建6種動作可以在解析到一個引數時進行觸發:
store
儲存引數值,可能會先將引數值轉換成另一個數據型別。若沒有顯式指定動作,則預設為該動作。
store_const
儲存一個被定義為引數規格一部分的值,而不是一個來自引數解析而來的值。這通常用於實現非布林值的命令列標記。
store_ture/store_false
儲存相應的布林值。這兩個動作被用於實現布林開關。
append
將值儲存到一個列表中。若引數重複出現,則儲存多個值。
append_const
將一個定義在引數規格中的值儲存到一個列表中。
version
列印關於程式的版本資訊,然後退出
步驟
- 1.建立
ArgumentParser()
物件
parser = argparse.ArgumentParser(description= "caculate X to the power of Y")
- 2.呼叫
add_argument()
方法新增引數
parser.add_argumen
- 使用
parse_args()
獲取已新增引數handler
- 使用
args = parser.parse_args()
import argparse
parser = argparse.ArgumentParser(description= "caculate X to the power of Y")
group = parser.add_mutually_exclusive_group()
#新增可選引數optional arguments
group.add_argument("-v", "--verbose",action="store_true")
group.add_argument("-q", "--quiet",action="store_true")
#新增位置引數positional arguments
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer =args.x ** args.y
if args.quiet:
print(answer)
elif args.verbose:
print("{} to the power {} equals {}".format(args.x, args.y, answer))
else:
print("{}^ {} = {}".format(args.x, args.y, answer))
使用:
In [100]: %run rl.py 2 6 -v
2 to the power 6 equals 64
In [101]: %run rl.py 2 6 -q
64
In [102]: %run rl.py -h
usage: rl.py [-h] [-v | -q] x y
caculate X to the power of Y
positional arguments:
x the base
y the exponent
optional arguments:
-h, --help show this help message and exit
-v, --verbose
-q, --quiet