Выбор argparse в Python ограничивал печать

В настоящее время я хочу, чтобы модуль Python argparse распечатывал только «1 - 65535», а не {1, 2, 3,... 65535}, но документация, похоже, не предоставляет для этого никакого метода. Какие-либо предложения?


person atx    schedule 30.06.2012    source источник


Ответы (1)


Вы можете изменить способ форматирования значений по умолчанию, установив параметр 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

Другой вариант — не использовать аргумент choices для такого большого диапазона, а вместо этого определить новый тип аргумента.

Это просто вызываемый объект, которому передается строка, которая вызывает 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))

и измените свое справочное сообщение, чтобы указать, какие значения являются приемлемыми.

person Martijn Pieters    schedule 30.06.2012