2015-04-22 30 views
3

所以我試圖想出一個使用argparse庫的策略。如何最有效地解析python中的這些參數?

以下是我想和我的程序接口:

$ program list [<number>] 
$ program check <name> 
$ program watch <name> [<quality>] 

現在我有一個參數解析器類似如下:

parser = argparse.ArgumentParser() 
group = parser.add_mutually_exclusive_group() 
group.add_argument('list') 
group.add_argument('check') 
group.add_argument('watch') 

但我怎麼可以添加一個可選的參數,說的整數,到一個現有的參數?

意味着用戶可以調用在以下方面list命令:

program list 

凡列表行動將用默認值調用,或者:

program list 10 

凡列表行動將被稱爲10的參數。

我看到了文檔中的子命令選項,但我遇到了問題,我將有一個列表參數的子解析器,但是我必須添加一個標誌,例如-n,然後提供數字。也許這是一個更好的方法呢?但是我喜歡只提供號碼的想法,如果你不想的話,或者省略它。

我試圖達到良好的做法嗎? argparse可能嗎?

+0

你看了[這裏](http://stackoverflow.com/questions/4575747/get-selected-subcommand-with-argparse)呢? –

+0

和[這裏](http://stackoverflow.com/questions/10448200/how-to-parse-multiple-sub-commands-using-python-argparse)。 –

+0

我不認爲他想要一次處理多個子分析器。 – hpaulj

回答

2

這個例子讓我錯誤的方向。我在最後草擬了一個subparser實現,我認爲這是個竅門。

parser = argparse.ArgumentParser() 
group = parser.add_mutually_exclusive_group() 
group.add_argument('list') 
group.add_argument('check') 
group.add_argument('watch') 

它期望3個字符串,並將它們分配給3個屬性。

但是,您不能在一個互斥組中放置3個「位置」參數。一個可選的位置(是的術語是混淆)可以在這樣一個組,但其餘的必須'可選'(標記)。


回到您的初始列表。這些是你願意接受不同的圖案

program list [integer] 
program check name 
program watch name [quality] 

其中「名單」,「檢查」,「看」是文字字符串,而「整」,「名」,「質量」是變量名。

如果是這樣的話,那麼subparsers可能是最好的選擇。可以使用nargs='?'來使位置參數'可選'。

parser = argparse.ArgumentParser() 
sp = parser.add_subparsers(dest='cmd') # put the command string in `cmd` attribute 
p1 = sp.add_parser('list') 
p2 = sp.add_parser('check') 
p3 = sp.add_parser('watch') 
p1.add_argument('value',dtype=int, nargs='?') # ok with 0 or 1 values 
p2.add_argument('name') 
p3.add_argument('name') 
p3.add_argument('quality',nargs='?') 

valuequality會得到默認值,如果沒有明確給出。默認defaultNone。但是你可以定義一個有意義的選擇,例如整數值爲default=0


你也可以定義諸如解析器:

parser = ... 
parser.add_argument('command', choices=['list','check','watch']) 
parser.add_argument('rest', nargs='*') 

這將預計3「命令」字符串中的一個,並把什麼都在「休息」屬性(如字符串列表)。然後,您可以根據需要解釋這些字符串。

+0

這是完美的謝謝。學到了一些新的東西。 –