2017-08-10 132 views
0

我有以下參數的程序:argparse蟒蛇2個自選單變量

  1. 文件
  2. 目錄
  3. 名1
  4. 名2

文件必須始終作爲傳遞參數,目錄可能與否,並且name1和name2必須同時傳遞它們中的任何一個或它們兩者。

這是我在這一刻:

parser = argparse.ArgumentParser() 
parser.add_argument("file", help="The file") 
parser.add_argument("resources_dir", default='.', nargs='?', help="The directory of media files") 
parser.add_argument("name", nargs=2, help="names") 

幫助正顯示出:

用法:wacv [-h]文件[resources_dir]名稱的名稱

而且我希望它是:

用法:wacv文件[res_dir] [name1 name2]

但是我希望'name'參數像我之前講的那樣。我怎樣才能做到這一點?

+0

假設'names'只是字符串,你如何期待解析器決定'name1'是不是可選'res_dir'(假設沒有提供'res_dir')?沒有辦法直接用'argparse'強制'0或2'語義,但是你可以接受'*'然後做你自己的錯誤檢查。 – AChampion

+0

最後,我決定接受*名稱和檢查後我自己如果是0或2,但我想知道是否有更好的方法來做到這一點 – xBlackout

回答

1

我認爲你應該使用

(`--names`, nargs=2) 

這使得他們可選的,但如果提供的,它需要2。此外,它的2串從可選一個`「resources_dir」分開。

您可以使用nargs='*',允許0,1或更多。但是2個字符串將分配給file,dir; 3表示文件,dir,另一個表示名稱等。換句話說,它不能通過內容告訴可選字符串是否屬於dirnames。它嚴格按照位置進行。

在任何情況下,不存在0 or 2 nargs,除非我如上所述。

+0

好的解決方案。我正在尋找那樣的東西。我仍然覺得這樣做有點奇怪,但它的工作原理。 – xBlackout