2015-02-05 123 views
3

如果我填充一個專門相互argparse組,然後parser.add_argument(其它項目)的使用給出了完全相互組內的參數爲互斥:argparse用法如何在中間顯示與parser.add_argument()相互排斥的選項?

import argparse 

parser1 = argparse.ArgumentParser() 
group1 = parser1.add_mutually_exclusive_group() 
group1.add_argument('--start') 
group1.add_argument('--stop') 
group1.add_argument('--restart') 
parser1.add_argument('--os') 
parser1.print_usage() 

輸出:

usage: arg_usage.py [-h] [--start START | --stop STOP | --restart RESTART] [--os OS] 

但是,如果我在組中間的解析器中添加非互斥參數,則使用輸出不再反映一些參數互斥的事實:

import argparse 

parser2 = argparse.ArgumentParser() 
group2 = parser2.add_mutually_exclusive_group() 
group2.add_argument('--start') 
group2.add_argument('--stop') 
parser2.add_argument('--os') 
group2.add_argument('--restart') 
parser2.print_usage() 

輸出:

usage: arg_usage.py [-h] [--start START] [--stop STOP] [--os OS] 
       [--restart RESTART] 

有什麼辦法來解決,而無需手動提供使用字符串或重新排序的電話?

其他注意事項 - 將混合類型添加到互斥組(位置&可選)時,發現相同的問題(使用不表示相互排斥的選項)。

其他?:這些錯誤是否應該提交到http://bugs.python.org/

回答

0

如果您不希望它們按usage的順序列出,爲什麼要將parser參數放在group參數的中間?由於optionals可以按任意順序解析,因此usage是以任何特定順序定義它們的唯一原因。

這是parser.format_usage如何生成usage行的結果。它按照您定義它們的順序列出參數,並進行一次修改 - 定位點在選項之後列出。只有當它們可以覆蓋在此定義的順序上時,它才包含互斥的組標記。

如果您的組包含可選項和位置組合(組中不能包含多個位置),那麼只有該位置緊隨可選項後纔會被標記。

有一個錯誤請求能夠將現有參數添加到新的互斥組。 http://bugs.python.org/issue10984。這很容易完成。但獲取使用權很困難。如果參數屬於多個組,則不可能在不重複參數的情況下顯示這兩個組。這促使我重寫使用格式化程序。在這個替代版本中,每個組都被格式化,根據需要重複參數。

總之,改變這種格式化行爲需要重新使用代碼。在修補之前,您必須先決定編寫自己的usage行。這樣你就可以給定組訂單的優先級而不是定義訂單。

看看http://bugs.python.org/issue11588當組可以嵌套並且包含「xor」以外的邏輯(例如相互包含的組)時,您是否想要對格式化使用的更復雜任務進行拼圖。