python 命令行參數解析常用到 argparse 包,但是 argparse 包對 bool 值的傳遞可能和你想不太一樣,在傳遞 bool 的時候,命令行中只要出現了就取 True,不管你設置了該參數取 True 還是 False,這個有點反人類,正確的做法是使用 action='store_t... ...
目錄
在使用 argparse 解析 bool 參數時,需要設定 add_argument 的 action 參數為 'store_true' 或者 'store_false',而不是設定 type 參數為 bool,具體原因是,如果設定 type=bool,那麼無論該參數傳 True 還是 False,最後都只能得到 True。【這設定反人類】
命令行參數及 argparse 包
在我們需要控制不同分支代碼的執行時,命令行參數最適用了,代碼寫好後只需在命令行設定不同的參數運行即可。
在命令行參數的解析中,可以用到 argparse 包。
入門 argparse 可以參考教程 https://docs.python.org/zh-cn/3.6/howto/argparse.html
給出一個最簡單的 argparse 解析命令行參數的例子:(以下代碼保存在 tmp.py 文件中)
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--seed',
dest='seed', type=int, default=0)
args = parser.parse_args()
print(args)
通過在命令行執行python3 tmp.py --seed 1
來改變 seed 參數的值,seed 參數的值可以通過args.seed
獲取。
argparse 解析 bool 參數錯誤做法
argparse 對 bool 類型數據的傳遞,和其它類型如 int、float、str 不一樣,如下所示:
import argparse
parser = argparse.ArgumentParser()
# 這種寫法是錯的,結果不是你所想象的
parser.add_argument('--test',
dest='test', type=bool, default=False)
args = parser.parse_args()
print(args)
如果我們在命令行執行python3 tmp.py --test False
和python3 tmp.py --test True
,我們會得到同樣的結果,args.test
都會是 True。這有點反人類了。
argparse 解析 bool 參數正確做法 1
在傳遞 bool 值時,正確的做法是:
import argparse
parser = argparse.ArgumentParser()
# action 的取值可以是 'store_true'、'store_false',都是小寫
parser.add_argument('--test',
dest='test', action='store_true', default=False)
parser.parse_args()
print(args)
之後如果需要 test 參數為真,那麼就在命令行執行python3 tmp.py --test
,否則,就不要帶上 test 參數,如python3 tmp.py
。
argparse 解析 bool 參數正確做法 2
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--test',
dest="test", action='store_true')
parser.add_argument('--no_test',
dest="test", action='store_false')
parser.set_defaults(test=False)
args = parser.parse_args()
print(args)
如果需要設置args.test
為 True,那麼執行python3 tmp.py --test
;如果需要設置args.test
為 False,執行 python3 tmp.py --no_test
。
References
Parsing boolean values with argparse - Stack Overflow