Las opciones argparse de Python restringieron la impresión

Actualmente quiero que el módulo argparse de Python solo imprima ‘1 – 65535’ en lugar de {1, 2, 3, … 65535}, pero la documentación no parece proporcionar ningún método para esto. ¿Alguna sugerencia?

Puede modificar la forma en que se formatean los valores predeterminados configurando la opción formatter_class .

Subclasificaría la clase HelpFormatter para modificar la forma en que formatea los valores de sus choices . Esta clase es oficialmente un “detalle de implementación”, pero dudo que cambie mucho con las nuevas versiones de python.

El método _metavar_formatter formatea la _metavar_formatter {1, 2, ..., 65535} y su subclase podría anular eso:

 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 

Otra opción es no usar el argumento de choices para un rango tan grande, y en su lugar, definir un nuevo tipo de argumento .

Esto es solo una cadena llamable, pasada una cadena, que genera argparse.ArgumentTypeError , TypeError o ValueError si la cadena no puede convertirse al tipo de destino, o el valor convertido de lo contrario:

 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 

Puedes usar esto como el tipo de argumento así:

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

y ajuste su mensaje de ayuda para indicar qué valores son aceptables.