【python3基礎】命令行參數及 argparse

  • 2019 年 11 月 4 日
  • 筆記

在使用 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 參數的值,可以通過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

Tags: