2017-08-10 30 views
1

爲什麼我不能有​​與titledescription互斥的羣組,因此它在--help消息下顯示爲一個單獨的類別?在幫助信息中相互排斥羣組標題和說明

我有一個名稱和描述的選項組:

輸出 --help
import argparse 

parser = argparse.ArgumentParser() 

group = parser.add_argument_group(
    'foo options', 'various (mutually exclusive) ways to do foo') 
group.add_argument('--option_a', action='store_true', help='option a') 
group.add_argument('--option_b', action='store_true', help='option b') 

args = parser.parse_args() 

usage: foo.py [-h] [--option_a] [--option_b] 

optional arguments: 
    -h, --help show this help message and exit 

foo options: 
    various (mutually exclusive) ways to do foo 

    --option_a option a 
    --option_b option b 

但我要讓互斥組:

import argparse 

parser = argparse.ArgumentParser() 

group = parser.add_mutually_exclusive_group() # here 
group.add_argument('--option_a', action='store_true', help='option a') 
group.add_argument('--option_b', action='store_true', help='option b') 

args = parser.parse_args() 

--help的輸出:

usage: foo.py [-h] [--option_a | --option_b] 

optional arguments: 
    -h, --help show this help message and exit 
    --option_a option a 
    --option_b option b 

幫助消息中沒有區別這些選項是組的一部分,也不能指定標題/說明(add_mutually_exclusive_group不包含其他位置參數)。有沒有人有解決方法?

+0

你看過argparse子命令嗎?https://docs.python.org/dev/library/argparse.html#sub-commands –

回答

1

爲什麼?因爲這就是它的編碼!

互斥組是ArgumentGroups的子類,但接口是不同的。目的也很不相同。參數組控制幫助行的顯示。它沒有解析。一個互斥的組在分析過程中檢查參數,並在格式化使用行時使用。但它對幫助線沒有影響。

但是可以在一個參數組中嵌入一個互斥的組(但不能以其他方式)。這應該會產生你想要的。

In [2]: parser = argparse.ArgumentParser() 
In [3]: group = parser.add_argument_group(
    ...: 'foo options', 'various (mutually exclusive) ways to do foo') 
In [4]: mxg = group.add_mutually_exclusive_group() 
In [5]: mxg.add_argument('--option_a', action='store_true', help='option a'); 
In [6]: mxg.add_argument('--option_b', action='store_true', help='option b'); 

In [7]: parser.print_help() 
usage: ipython3 [-h] [--option_a | --option_b] 

optional arguments: 
    -h, --help show this help message and exit 

foo options: 
    various (mutually exclusive) ways to do foo 

    --option_a option a 
    --option_b option b 

代碼本身還有更多細節,還有一個bug或者兩個問題,但是這應該會讓你繼續。

+0

我在argparse中看到了一個可能的錯誤(或者我可能只是做錯了...)你的答案在頂層很好,但如果數據在父解析器中失敗... https://stackoverflow.com/questions/46066374/python-argparse-mutually-exclusive-group-and- add-argument-group-in-a-parent-proc –

+0

@Paul T.,是的父母機制不處理這種組嵌套。甚至可能有一個關於它的錯誤/問題。 – hpaulj