python 參數定義庫argparse

這一塊的官方文檔在這裏

注意到這個庫是因爲argparse在IDE中和在ipython notebook中使用是有差異的,習慣了再IDE裏面用,轉到ipython中會報錯,究其原因,還是對庫的本質不夠理解。

打開argparse.py,裏面有很多class,但是,實際笨妞貌似只用過ArgumentParser。ArgumentParser是用來創建argparse類的。

一般的應用過程是這樣的:

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+', 
                    help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                    const=sum, default=max,
                    help='sum the integers (default: find the max)')

args = parser.parse_args()
print(args.accumulate(args.integers))

包含了創建參數類,添加參數,存儲和使用參數。

執行如下命令:

python xx.py 1 2 3 4

結果:

4


ArgumentParser可配置的參數很多,如下圖,但大多都沒必要配置的。



add_argument添加參數,這個方法配置參數來告訴系統命令行如何傳輸參數進來。可配置的參數如下:

* name or flags - 名稱或選項字符串列表, e.g. foo or -f, --foo.
* action - 參數如果定義了選項,表示這是一個操作參數,至於調用時做哪種操作由用戶輸入或者default決定。
* nargs - 應該使用的命令行參數數。.
* const - 某些動作或參數個數的常數值。.
* default - 如果命令行沒有對輸入這個參數相應的值,則此參數用default給出的值.
* type -將用戶輸入的值轉化爲哪種類型.
* choices - 參數可輸入值的範圍或選擇.
* required - 命令行輸入的值是否可以被忽略(布爾量).
* help - 參數的簡要描述.
* metavar - useage中顯示的參數的名稱.
* dest - 要添加到解析參數返回的對象中的屬性的名稱.

parser_args將解析參數傳遞到一個空間中,後續可以通過變量訪問。

* args - 要解析的字符串序列,默認值取自sys.argv。List of strings to parse. The default is taken from sys.argv.
* namespace -一個接受屬性的對象。默認是一個新的空命名空間對象。


通過IDE和ipython使用argparser的差異就在“args = parser.parse_args()”。IDE中parse_args()可以直接使用,只要在命令行執行時,要求必須設置的參數給都值了就沒有問題,如果所有參數都有默認值,py文件執行時,不給參數也不會出錯。而ipython 在parse_args()這句必須配置args,即便add_argument添加的參數都有默認值也要在配置args,不然執行會報如下錯誤:

ipykernel_launcher.py: error: unrecognized arguments: -f C:\Users\Administrator\AppData\Roaming\jupyter\runtime\kernel-eeea08d1-8918-441d-9352-59cae31c447e.json
An exception has occurred, use %tb to see the full traceback.

SystemExit: 2

對於含有必須輸入值的函數,這個問題是合理的,因爲ipython裏面讀參數不通過命令行,必須通過parse_args傳值。

但是,如下程序

import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('--a_para', default=2, type=int, required=False,
                    help='first parameter')
parser.add_argument('--b_para',  default=3,type=int, required=False,
                    help='second parameter')
args = parser.parse_args()
print(args.a_para, args.b_para)

直接在IDE中運行,不通過命令行,不傳參數便可以成功.

2 3

但在ipython中必須是這樣的

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('--a_para', default=2, type=int, required=False,
                    help='first parameter')
parser.add_argument('--b_para',  default=3,type=int, required=False,
                    help='second parameter')

args = parser.parse_args(['--a_para', '2'])  #至少輸入一個參數
print(args.a_para, args.b_para)

輸出:

2 3
是不是很無厘頭,然而就是這樣的。







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章