2013-10-21 53 views
2

我試圖做一個腳本用法如下:argparse mutually_exclusive_group與子組

my_script [-p parg -l larg] | [-s sarg] 

即腳本或者需要-p-l參數OR-s說法。如果指定了-p-s這是錯誤的。我嘗試以下,但似乎並不工作

import argparse 
parser = argparse.ArgumentParser(description='Some Desc') 
gp = parser.add_mutually_exclusive_group() 
num_gp = gp.add_argument_group() 
num_gp.add_argument('-p') 
num_gp.add_argument('-l') 
gp.add_argument('-s') 
In [18]: parser.parse_args(['-p blahp', '-l blahl', '-s blahs']) 
Out[18]: Namespace(l=' blahl', p=' blahp', s=' blahs') #ERROR Should have failed as I specify both `-p` and `-s` which belong to a mutually_exclusive_group 
+0

嘿,如果你有自由,試試'docopt'而不是argparse。 – Murph

+0

相關問題:http://stackoverflow.com/questions/16769409/using-mutually-exclusive-between-groups/ – hpaulj

+0

'-l'是否需要'-p'? – hpaulj

回答

0

我認爲你濫用互相排斥的組。團體與其他團體並不相互排斥,團體成員互相排斥。另外,據docs可知,標準組不會影響解析邏輯,它們只能幫助組織由解析器生成的幫助消息。

這裏是你如何可以使兩個選項,-p-s例如,互斥:

import argparse 

parser = argparse.ArgumentParser(description='Some Desc') 
group1 = parser.add_mutually_exclusive_group() 
group1.add_argument("-p") 
group1.add_argument("-s") 

# This works 
args = parser.parse_args(["-p", "argForP"]) 
# This will throw an error 
args = parser.parse_args(["-p", "argForP", "-s", "argForS"]) 

但我不知道這功能將讓你實現你的使用情況,因爲我不確定參數可以屬於兩個互斥的組。但是,您始終可以自行執行錯誤檢查,並使用parser.error。這看起來像這樣:

message = "invalid options" 

# Tells us p is used without l or vise versa 
if (args.p is None) != (args.l is None): 
    parser.error(message) 

# Tells is if p-l is used with s 
if (args.p is None) == (args.s is None): 
    # Either both are used or neigher 
    parser.error(message) 
+0

http://bugs.python.org/issue10984有一個修補程序,允許您將參數放在兩個不同的互斥組中。向第二組添加參數並不難,但獲取有意義的使用行需要重寫很多幫助格式代碼。 – hpaulj

+0

你說得對。常規組會影響幫助顯示,但在解析時不起作用。 – hpaulj

+0

@hpaulj,不錯的工作,它似乎即使當我運行一個錯誤或蟒蛇蟒有人已經在修復它。很高興看到社區如此活躍。爲了澄清OP(對我而言),你在評論中鏈接到的補丁還沒有成爲最新版本的權利?如果有人想使用這個新功能,他們需要將補丁應用到他們的python安裝中。那是對的嗎? –