2014-04-25 27 views
0

我使用argparse在Python,我需要這樣做控制檯:是否有可能使用argparse(Python)在另一個內部創建一個互斥組?

python3 my_program.py (-a | -b) | (-c | -d) 

我看了幾個論壇,我想答案是否定的,但爲了以防萬一。可能嗎?

+1

可能相關的bug http://bugs.python.org/issue11588 – msvalkon

+0

好吧,目前來看,似乎不可能製作嵌套組。 – forvas

+1

這與由'-a','-b','-c'和'-d'組成的單個互斥組有什麼不同? – chepner

回答

1

你不需要聽任何人的話 - 嘗試一下。

import argparse 
parser=argparse.ArgumentParser() 
g = parser.add_mutually_exclusive_group() 
g1 = g.add_mutually_exclusive_group() 
g1.add_argument('-a') 
g1.add_argument('-b') 
g2 = g.add_mutually_exclusive_group() 
g2.add_argument('-c') 
g2.add_argument('-d') 
print [a.dest for a in g._group_actions] 
print [a.dest for a in g1._group_actions] 
print [a.dest for a in g2._group_actions] 
parser.print_help() 

生產:

['a', 'b', 'c', 'd'] # actions in group g 
['a', 'b'] 
['c', 'd'] 
usage: stack23292325.py [-h] [[-a A | -b B] [-c C | -d D] 

g1g2可在另一組g來定義,但淨效果是使4個動作相互排斥的。如果你仔細想想,這在邏輯上是正確的。

使用線不太正確。第一個'['來自g,但沒有'|'或']'。使用格式化程序沒有嵌套組的概念。儘管它們是獨立的,但它只是嘗試對這三組進行格式化。

但是你可以寫你自己的使用線。

這種嵌套更有意義的是gargument_group。然後,這些行爲將被放置在一個明確的幫助組中。這兩類組在功能上有很大不同。

http://bugs.python.org/issue17218使用此功能在argument_group中嵌套mutual_exclusive_group以向MXG添加「標題」和「描述」。這是一個argparse unittest文件Lib/test/test_argparse.py的例子。

+0

你好,非常感謝你。你是對的,這四項行動是相互獨立的。但我想有可能使用-a或-a和-d,另一邊使用-b,-c或-b和-d。但從來沒有-b或-c和-d。你用這段代碼做的事情幾乎是一樣的,只添加一個以-a,-b,-c和-d作爲參數的互斥組合,不是嗎? – forvas

+0

當前的「嵌套」,與將它們全部放在一個組中相同。你剛剛描述的看起來像2個沒有嵌套的MX組。但如果您有關於如何表達(和執行)複雜的混合與匹配約束的想法,請隨時爲issue11588做出貢獻。 – hpaulj

相關問題