2012-06-30 90 views
3

目前我希望Python的argparse模塊只打印'1 - 65535'而不是{1,2,3,... 65535},但文檔似乎沒有提供任何方法這個。有什麼建議麼?Python的argparse選擇約束打印

回答

5

您可以通過設置formatter_class option來改變默認值的格式。

我想繼承HelpFormatter class來改變它格式化你的choices值的方式。這個類正式是一個「實現細節」,但我懷疑它會隨着更新的Python版本發生很大變化。

_metavar_formatter method格式化字符串{1, 2, ..., 65535}和你的子類可以重寫:

class RangeChoiceHelpFormatter(HelpFormatter): 
    def _metavar_formatter(self, action, default_metavar): 
     if action.metavar is not None: 
      result = action.metavar 
     elif action.choices is not None: 
      result = '{%s .. %s}' % (min(action.choices), max(action.choices]) 
     else: 
      result = default_metavar 

      def format(tuple_size): 
       if isinstance(result, tuple): 
        return result 
       else: 
        return (result,) * tuple_size 
      return format 

另一種選擇是使用choices論據如此大範圍,而是定義新的argument type

這僅僅是一個可調用,通過一個字符串,提高argparse.ArgumentTypeErrorTypeErrorValueError如果字符串不能轉換爲目標類型,或轉換後的值,否則:

class IntRange(object): 
    def __init__(self, start, stop=None): 
     if stop is None: 
      start, stop = 0, start 
     self.start, self.stop = start, stop 

    def __call__(self, value): 
     value = int(value) 
     if value < self.start or value >= self.stop: 
      raise argparse.ArgumentTypeError('value outside of range') 
     return value 

您可以使用此作爲像這樣的參數類型:

parser.add_argument('foo', type=IntRange(1, 65536)) 

並調整您的幫助消息以指示可接受的值。