2013-08-02 73 views
13

如何設置argparse如下:Python的argparse條件要求

if -2 is on the command line, no other arguments are required 
if -2 is not on the command line, -3 and -4 arguments are required 

例如,

-2 [good] 
-3 a -4 b [good] 
-3 a [not good, -4 required] 
-2 -5 c [good] 
-2 -3 a [good] 

有許多的類似這裏的問題,但他們要麼沒有解決這個問題情況還是我不明白。

Python 2.7如果有問題。

+0

使鍵安裝在-2是複製其他命令可選一個子分析器。在頂層,將-3和-4鏈接在一起。 – Jiminion

+0

使用以「-'開頭的子分析器命令可能會非常棘手。 '-2'可能有效,但'-t'或'--two'不會因爲它們看起來像可選項。但是,如果'-3'被定義爲一個參數,那麼'-2'不再作爲子分析器命令(或選擇)。 – hpaulj

回答

13

子分析器(如評論中所建議的)可能有效。

另一種選擇(因爲mutually_exclusive_group不能完全做到這一點),是把它手工編碼,因爲它是:

import argparse 

def main(): 
    parser = argparse.ArgumentParser() 

    parser.add_argument('-2', dest='two', action='store_true') 
    parser.add_argument('-3', dest='three') 
    parser.add_argument('-4', dest='four') 
    parser.add_argument('-5', dest='five') 

    args = parser.parse_args() 

    if not args.two: 
     if args.three is None or args.four is None: 
      parser.error('without -2, *both* -3 <a> *and* -4 <b> are required') 

    print args 
    return 0 

加入少許司機這樣的:

import sys 
sys.exit(main()) 

和運行用你的例子,它似乎做對了;這裏有兩個運行:

$ python mxgroup.py -2; echo $? 
Namespace(five=None, four=None, three=None, two=True) 
0 
$ python mxgroup.py -3 a; echo $? 
usage: mxgroup.py [-h] [-2] [-3 THREE] [-4 FOUR] [-5 FIVE] 
mxgroup.py: error: without -2, *both* -3 <a> *and* -4 <b> are required 
2 
$ 
+0

在沒有更好的替代方案的情況下,手動做似乎最好的課程 – foosion

+0

在http://stackoverflow.com/questions/17917265/python-argparser-for-multiple-arguments-for-partial-choices/17982009#17982009我建議兩步解析。首先使用'parse_known_args'來檢查'-2'標誌,如果缺少,使用另一個分析器來查找'-3'和'-4'。 – hpaulj

+0

我不認爲有什麼方法可以影響--help會打印,而不是爲每個參數設置幫助... – Leonid

1

我認爲這是很難實現,包括一個很好的幫助消息,而只使用標準argparse函數。但是,您可以在解析參數後自行輕鬆地進行測試。你可以在結尾描述額外的需求。請注意,使用數字作爲選項是不尋常的,我必須使用dest ='two',因爲args.2不是有效的語法。

#!/usr/bin/env python 

import argparse 

parser = argparse.ArgumentParser(
    description='bla bla', 
    epilog='Note: arguments -3 and -4 are required when -2 is missing') 

parser.add_argument('-2', dest='two', action='store_true') 
parser.add_argument('-3', dest='three') 
parser.add_argument('-4', dest='four') 
parser.add_argument('-5', dest='five') 

args = parser.parse_args() 

if not args.two and (args.three is None or args.four is None): 
    parser.error('arguments -3 and -4 are required when -2 is missing') 

print 'Good:', args 

有了這些結果:

[~]: ./test.py -h 
usage: test.py [-h] [-2] [-3 THREE] [-4 FOUR] [-5 FIVE] 

bla bla 

optional arguments: 
    -h, --help show this help message and exit 
    -2 
    -3 THREE 
    -4 FOUR 
    -5 FIVE 

Note: arguments -3 and -4 are required when -2 is missing 

[~]: ./test.py -2 
Good: Namespace(five=None, four=None, three=None, two=True) 
[~]: ./test.py -3 a -4 b 
Good: Namespace(five=None, four='b', three='a', two=False) 
[~]: ./test.py -3 a 
usage: test.py [-h] [-2] [-3 THREE] [-4 FOUR] [-5 FIVE] 
test.py: error: arguments -3 and -4 are required when -2 is missing 
[~]: ./test.py -2 -5 c 
Good: Namespace(five='c', four=None, three=None, two=True) 
[~]: ./test.py -2 -3 a 
Good: Namespace(five=None, four=None, three='a', two=True) 
+0

雖然'args.2'不起作用,'getattr(args,'2')'做。像'-2'這樣的參數是允許的,但會增加不必要的複雜性。 – hpaulj