這很可能超出了argparse模塊的範圍,但我會嘗試使用示例來描述我的問題。可變數量的narg參數Python Argparse
我有一些水果和一些文件歸因於每個水果。特別是蘋果,香蕉和橙子。蘋果有10個文件與它關聯,香蕉有7個,桔子有9個。我可以硬編碼-a
,-b
,-o
,每個都用nargs='+'
在Python命令行腳本中處理這個玩具示例。但是,說我有可變數量的水果,或者是一個非常大的數字(可能是50)。硬編碼每種類型的標誌會很瘋狂,這裏最好的解決方案是什麼?
這很可能超出了argparse模塊的範圍,但我會嘗試使用示例來描述我的問題。可變數量的narg參數Python Argparse
我有一些水果和一些文件歸因於每個水果。特別是蘋果,香蕉和橙子。蘋果有10個文件與它關聯,香蕉有7個,桔子有9個。我可以硬編碼-a
,-b
,-o
,每個都用nargs='+'
在Python命令行腳本中處理這個玩具示例。但是,說我有可變數量的水果,或者是一個非常大的數字(可能是50)。硬編碼每種類型的標誌會很瘋狂,這裏最好的解決方案是什麼?
我會給每個水果的說法,但我會做到這一點在我可以在DRYest方式:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-i", "--insecticide")
for fruit, nargs in (
('Apple', 10),
('Banana', 7),
('Orange', 9),
):
parser.add_argument(
"--" + fruit.lower(), nargs=nargs, metavar='FLIES',
help="specify {} species of {} pests".format(nargs, fruit))
args = parser.parse_args()
print(args)
這裏是產生幫助信息:
$ python x.py -h
usage: x.py [-h] [-i INSECTICIDE]
[--apple FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES]
[--banana FLIES FLIES FLIES FLIES FLIES FLIES FLIES]
[--orange FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES]
optional arguments:
-h, --help show this help message and exit
-i INSECTICIDE, --insecticide INSECTICIDE
--apple FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES
specify 10 species of Apple pests
--banana FLIES FLIES FLIES FLIES FLIES FLIES FLIES
specify 7 species of Banana pests
--orange FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES
specify 9 species of Orange pests
如果有可變數量的水果(例如由環境變量或存在配置文件控制),那麼我的循環將不會被硬編碼,而是可能是:
for config_section in config_data():
parser.add_argument("--" + config_section.name, ...)
如果我想命名參數順序,如OP的意見建議,我可能會編寫循環:
for i, fruit in enumerate(fruit_names, 1):
parser.add_argument("--x{}".format(i),
nargs="+",
help="{} files".format(fruit))
這裏是產生的幫助信息:
$ python x2.py -h
usage: x2.py [-h] [-i INSECTICIDE] [--x1 X1 [X1 ...]] [--x2 X2 [X2 ...]]
[--x3 X3 [X3 ...]]
optional arguments:
-h, --help show this help message and exit
-i INSECTICIDE, --insecticide INSECTICIDE
--x1 X1 [X1 ...] Apple files
--x2 X2 [X2 ...] Banana files
--x3 X3 [X3 ...] Orange files
我想從配置文件中讀取名稱,然後根據您的建議生成參數可以解決問題,好的解決方案 –
可以使用nargs=7
例如,它將只接受正好爲7(或返回None
如果沒有輸入標誌)
例如,添加
parser.add_argument('-x', nargs=7, help='testing')
到您的參數列表 和 print args.x
說你的文件是a.py
$ python a.py
> None
$ python a.py -x 1
> a.py: error: argument -x: expected 7 argument(s)
$ python a.py -x 1 2 3 4 5 6 7
> ['1', '2', '3', '4', '5', '6', '7'] `
抱歉,您誤解了我的問題。我知道如何指定我想要的參數的數量。我問是否有辦法指定可變數量的可變數量的參數 –
也許你可以寫一個配置文件(json格式?)並將它用作python命令行中的參數 – iFlo
您希望的接口的用法是什麼樣子? – user2357112
類似於'python script.py -x1 a b c -x2 d e f -x3 g h i'?除了我可以繼續下去,直到x100,x500,x10000000等。 –