3
目前我希望Python的argparse模塊只打印'1 - 65535'而不是{1,2,3,... 65535},但文檔似乎沒有提供任何方法這個。有什麼建議麼?Python的argparse選擇約束打印
目前我希望Python的argparse模塊只打印'1 - 65535'而不是{1,2,3,... 65535},但文檔似乎沒有提供任何方法這個。有什麼建議麼?Python的argparse選擇約束打印
您可以通過設置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.ArgumentTypeError
,TypeError
或ValueError
如果字符串不能轉換爲目標類型,或轉換後的值,否則:
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))
並調整您的幫助消息以指示可接受的值。