2016-08-19 75 views
2

我使用的是​​,我有一個自定義參數組required arguments。有什麼方法可以改變幫助信息中參數組的順序嗎?我認爲在可選參數前面有必要的參數更合乎邏輯,但沒有找到任何文檔或問題來幫助。重新排序Python argparse參數組

例如,改變這一點:

usage: foo.py [-h] -i INPUT [-o OUTPUT] 

Foo 

optional arguments: 
    -h, --help   show this help message and exit 
    -o OUTPUT, --output OUTPUT 
         Output file name 

required arguments: 
    -i INPUT, --input INPUT 
         Input file name 

這樣:

usage: foo.py [-h] -i INPUT [-o OUTPUT] 

Foo 

required arguments: 
    -i INPUT, --input INPUT 
         Input file name 

optional arguments: 
    -h, --help   show this help message and exit 
    -o OUTPUT, --output OUTPUT 
         Output file name 

(例如,從this question拍攝)

回答

4

,可以考慮添加一個明確的可選參數組:

import argparse 

parser = argparse.ArgumentParser(description='Foo', add_help=False) 

required = parser.add_argument_group('required arguments') 
required.add_argument('-i', '--input', help='Input file name', required=True) 

optional = parser.add_argument_group('optional arguments') 
optional.add_argument("-h", "--help", action="help", help="show this help message and exit") 
optional.add_argument('-o', '--output', help='Output file name', default='stdout') 

parser.parse_args(['-h']) 

可以幫助動作移動到這裏所描述的可選組作爲 : Move "help" to a different Argument Group in python argparse

正如你看到的,代碼生成所需的輸出:

usage: code.py -i INPUT [-h] [-o OUTPUT] 

Foo 

required arguments: 
    -i INPUT, --input INPUT 
         Input file name 

optional arguments: 
    -h, --help   show this help message and exit 
    -o OUTPUT, --output OUTPUT 
         Output file name 
2

分析器開始了與2個參數組,通常的positionaloptionals-h幫助已添加到optionals。當您做add_argument_group時,會創建一個組(並返回給您)。它也附在parser._action_groups列表中。

當您尋求幫助(-hparser.format_help()被調用(您也可以在測試中做到這一點)。在argparse.py中查找該方法。 ,設置了幫助消息,和一個步驟是:

# positionals, optionals and user-defined groups 
    for action_group in self._action_groups: 
     formatter.start_section(action_group.title) 
     formatter.add_text(action_group.description) 
     formatter.add_arguments(action_group._group_actions) 
     formatter.end_section() 

因此,如果我們重新排序parser._action_groups列表中的項目,我們將重新排序組在顯示屏上。由於這是_action_groups的唯一用途,它應該是安全和容易的。但有些人不允許在封面下達到頂峯(查看或更改._屬性)。

建議的解決方案是按照您想要查看它們的順序創建自己的組,並確保默認組爲空(參數add_help=False)。如果你堅持使用公共API,那麼這是唯一的方法。

演示:

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('foo') 
g1 = parser.add_argument_group('REQUIRED') 
g1.add_argument('--bar', required=True) 
g1.add_argument('baz', nargs=2) 

print(parser._action_groups) 
print([group.title for group in parser._action_groups]) 
print(parser.format_help()) 

parser._action_groups.reverse() # easy inplace change 
parser.print_help() 

運行結果:

1504:~/mypy$ python stack39047075.py 

_actions_group名單和頭銜:

[<argparse._ArgumentGroup object at 0xb7247fac>, 
<argparse._ArgumentGroup object at 0xb7247f6c>, 
<argparse._ArgumentGroup object at 0xb721de0c>] 
['positional arguments', 'optional arguments', 'REQUIRED'] 

默認的幫助:

usage: stack39047075.py [-h] --bar BAR foo baz baz 

positional arguments: 
    foo 

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

REQUIRED: 
    --bar BAR 
    baz 

反向後:

usage: stack39047075.py [-h] --bar BAR foo baz baz 

REQUIRED: 
    --bar BAR 
    baz 

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

positional arguments: 
    foo 
1504:~/mypy$ 

實現此的另一種方式是定義一個新的format_help方法的ArgumentParser子類。在該方法中,重新排序for action_group...循環中使用的列表。

0

這是無可否認的一個黑客,並且是在多變的內部實現依賴,但添加的參數後,你可以簡單地做:

parser._action_groups.reverse() 

這將有效地使上述的可選參數必需的參數組顯示組。請注意,這個答案只是描述性的,而不是說明性的


信用:answer by hpaulj