3

現在、Python の argparse モジュールで {1, 2, 3, ... 65535} ではなく '1 - 65535' のみを出力するようにしたいのですが、ドキュメントにはその方法が記載されていないようです。助言がありますか?

4

1 に答える 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:TypeErrorValueError

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 に答える