Custom help format for a choice argparse argument

Peter Otten __peter__ at web.de
Mon Jan 30 17:20:26 EST 2023


On 27/01/2023 21:31, Ivan "Rambius" Ivanov wrote:
> Hello,
>
> I am developing a script that accepts a time zone as an option. The
> time zone can be any from pytz.all_timezones. I have
>
> def main():
>      parser = argparse.ArgumentParser()
>      parser.add_argument("-z", "--zone", choices=pytz.all_timezones)
>      args = parser.parse_args()
>      print(args)
>      print(f"Specified timezone: {args.zone}")
>
> It works, but when I run it with the -h option it dumps all entries in
> pytz.all_timezones. I would like to modify the help format for just
> -z|--zone option. I read the docs about HelpFormatter and argparse.py
> and I ended up with
>
> class CustomHelpFormatter(argparse.HelpFormatter):
>      def _metavar_formatter(self, action, default_metavar):
>          if action.dest == 'zone':
>              result = 'zone from pytz.all_timezones'
>              def format(tuple_size):
>                  if isinstance(result, tuple):
>                      return result
>                  else:
>                      return (result, ) * tuple_size
>              return format
>          else:
>              return super(CustomHelpFormatter,
> self)._metavar_formatter(action, default_metavar)
>
>
> def main():
>      parser = argparse.ArgumentParser(formatter_class=CustomHelpFormatter)
>      parser.add_argument("-z", "--zone", choices=pytz.all_timezones)
>      args = parser.parse_args()
>      print(args)
>      print(f"Specified timezone: {args.zone}")
>
> This works, but is there a more elegant way to achieve it?

It may be sufficient to specify a metavar:

 >>> import argparse
 >>> p = argparse.ArgumentParser()
 >>> p.add_argument("--foo", choices="alpha beta gamma".split(),
metavar="<any greek letter>")
[...]
 >>> p.parse_args(["-h"])
usage: [-h] [--foo <any greek letter>]

optional arguments:
   -h, --help            show this help message and exit
   --foo <any greek letter>

While that helps with --help it doesn't always prevent the choices list
from being spelt out:

 >>> p.parse_args(["--foo", "whatever"])
usage: [-h] [--foo <any greek letter>]
: error: argument --foo: invalid choice: 'whatever' (choose from
'alpha', 'beta', 'gamma')



More information about the Python-list mailing list