2015-12-16 42 views
1

我創建的下一個「父」解析器:python 2.7 argparse:如何在普通參數組中創建互斥組?

parent_parser = argparse.ArgumentParser(add_help=False) 
base_group = parser.add_argument_group(title = "global arguments")              
base_group.add_argument("-l", "--log-file", metavar="FILE", help="set log file (default no log)")      
base_group.add_argument("-c", "--clear-log", action="store_true", default=False, help="clear log file before logging") 

mutex_group = base_group.add_mutually_exclusive_group()                 
mutex_group.add_argument("-v", "--verbose", action="store_true", default=False, help="print logs verbosity")   
mutex_group.add_argument("-q", "--quiet", action="store_true", default=False, help="suppress every normal output") 

如果我在另外一個使用這個解析器父母,那麼我想在幫助下一看:

usage: my_program.py [-h] [-l FILE] [-c] [-v | -q ] [<the parent arguments ...>] 

Desc... 

optional arguments: 
    <the my_program.py arguments> 

global arguments: 
    -l FILE, --log-file FILE 
        set log file (default no log) 
    -c, --clear-log  clear log file before logging 
    -v, --verbose   print logs verbosity 
    -q, --quiet   suppress every normal output 

但不幸的是,來自互斥組(-v和-q)的參數顯示在「可選參數」部分。爲什麼?這是一個錯誤嗎?或者我做錯了什麼?

UPDATE:

我創建了一個錯誤的這個問題:http://bugs.python.org/issue25882。 看到這個錯誤爲我的簡單代碼和它的輸出這種情況。

+0

相互排斥的參數組未被命名,它們總是顯示在它們的父組中(這裏是「全局參數」)(參見,例如[this]中的輸出(http://stackoverflow.com/questions/7869345)/how-to-make-python-argparse-mutual-exclusive-group-arguments-without-prefix) – hlt

+0

@hlt但是在這種情況下,父組是「base_group」,是不是? – Regisz

+0

我想你誤解了我: )。我的問題中的輸出對我來說是很好的解決方案,但不會發生這種情況。 -v和-q顯示在「可選參數」部分中,顯示了子分析器的參數。我想如果-v和-q可以在「全局參數」中看到,父解析器的參數是什麼。 – Regisz

回答

1

parent_parser表現得如你所願,但當作爲parents使用時則不會。

如果我添加到您的代碼(修正使用parser):在 '_add_container_actions' 的方法

parent_parser.print_help() 

print('-------------') 
parser=argparse.ArgumentParser(parents=[parent_parser]) 
parser.print_help() 

我得到(所有版本)

1317:~/mypy$ python3.5 stack34308904.py 
usage: stack34308904.py [-l FILE] [-c] [-v | -q] 

global arguments: 
    -l FILE, --log-file FILE 
         set log file (default no log) 
    -c, --clear-log  clear log file before logging 
    -v, --verbose   print logs verbosity 
    -q, --quiet   suppress every normal output 
------------- 
usage: stack34308904.py [-h] [-l FILE] [-c] [-v | -q] 

optional arguments: 
    -h, --help   show this help message and exit 
    -v, --verbose   print logs verbosity 
    -q, --quiet   suppress every normal output 

global arguments: 
    -l FILE, --log-file FILE 
         set log file (default no log) 
    -c, --clear-log  clear log file before logging 

這是顯而易見的評論(將組和參數從父項複製到子項的方法),開發人員預期這種情況,即mutual_clusive_group嵌入在argument_group中,但尚未試圖使其正常工作。

最簡單的即時修復方法是跳過parents位,然後在主分析器中定義組和參數。 parents在某些情況下是方便的(並且在其他情況下令人討厭),但很少有必要。


現在有一個bug /問題;

的初步解決方法是2行添加到 argparse._ActionsContainer._add_container_actions

.... 
# add container's mutually exclusive groups 
# NOTE: if add_mutually_exclusive_group ever gains title= and 
# description= then this code will need to be expanded as above 
for group in container._mutually_exclusive_groups: 
    #print('container title',group._container.title) 
    mutex_group = self.add_mutually_exclusive_group(
     required=group.required) 
    # new lines - updates the `_container attribute of the new mx group 
    mx_container = title_group_map[group._container.title] 
    mutex_group._container = mx_container 

http://bugs.python.org/issue25882 - 問題與猴子補丁文件。

相關問題