現在、Python の argparse モジュールで {1, 2, 3, ... 65535} ではなく '1 - 65535' のみを出力するようにしたいのですが、ドキュメントにはその方法が記載されていないようです。助言がありますか?
1 に答える
5
formatter_class
オプションを設定することで、デフォルトのフォーマット方法を変更できます。
HelpFormatter クラスをサブクラス化して、値をフォーマットする方法を変更しchoices
ます。このクラスは公式には「実装の詳細」ですが、新しい python バージョンで大きく変わるとは思えません。
_metavar_formatter
メソッドは文字列をフォーマットし{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
もう 1 つのオプションは、そのような大きな範囲の引数を使用せず、代わりに新しい引数 typechoices
を定義することです。
これは単に呼び出し可能で、文字列を渡して を発生させるか、文字列をターゲットの型に変換できない場合、または変換された値をそれ以外の場合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))
ヘルプ メッセージを調整して、許容できる値を示します。
于 2012-06-30T08:51:56.207 に答える