2016-01-09 66 views
1

我有一個問題,我試圖找到解決方案。我不確定我是否可以用argparse做到這一點。在Python中解析參數

我希望能夠指定一個選項

myprog -a 1 
myprog -a 2 

現在,當我有一個= 1,我希望能夠指定bÇ。但是當a = 2,我只能指定d

myprog -a 1 -b 3 -c 0 
myprog -a 2 -d 3 

而且一個必須始終指定

回答

1

你不能切換值作爲一個單一的parse_args調用做到這一點,但你可以做的一個:

  1. 使用sub-commands/sub-parsers
  2. 做部分解析之前完全配置解析器和完整運行命令行,首先只檢查a,然後根據第一次調用的結果選擇附加的解析器參數進行解析。訣竅是在第一次調用時使用parse_known_args,所以它處理a(它承認)並忽略其他所有內容。

例如,對於方法#2,你可以這樣做:

​​

缺點這種方法是,使用信息吐出來,不正確的使用將是不完整的;您必須手動在基本解析器中包含指定「真實」用法的文本,這並不好玩。 Subparsers不能基於值切換進行切換,但它們具有統一的一致用法顯示。

1

最簡單的解決方案是讓'-a'一個required=True說法,並與未所需的默認離開他人。然後解析執行args.a和其他值(我假設你可以編寫這種Python邏輯)的測試。

您可以提出自己的錯誤,或者您可以使用parser.error("I don't like your input")呼叫。

你需要編寫一個自定義usage行。鑑於這些要求,什麼是有意義的用法?

有一個mutually exclusive argument group方法,但它不使用特定的值,只是存在或不存在參數。

您也可以將測試合併到自定義Action類中。但通常這比解析後執行測試更復雜(因爲argparse處理以任何順序出現的參數)。

-a參數轉換爲子分析器的另一種可能性。這允許您爲一個「解析器」值定義一組參數,併爲另一個值定義另一組參數。我認爲,這些argparse文檔已經足夠清晰。