Как сохранить автоматически добавленный аргумент argparse help, но удалить из него ключ -h, чтобы я мог использовать эту опцию для другого аргумента - PullRequest
4 голосов
/ 01 марта 2020

Автоматически добавленный аргумент справки содержит строки параметров -h и --help. Я хочу сохранить аргумент справки для --help, но удалить из него -h, чтобы я мог использовать эту строку параметров для другого аргумента.

Я думаю, что должен быть лучший способ, чем полное удаление Аргумент справки с add_help=False просто чтобы добавить его снова с --help и action="help" сразу после этого, верно? Может быть, я могу изменить строки параметров существующего аргумента справки?


Кстати, относительно "Не удалять -h, потому что пользователи ожидают, что это псевдоним для --help": это честно аргумент. Однако, просматривая мои локальные двоичные файлы, я не смог найти ни одной команды, использующей -h для отображения справочного сообщения, кроме fdisk. (Это, конечно, не означает, что их немного больше.) Еще больше: многие команды используют -h для чего-то совершенно другого, см. ls, cd, df и diff для назовите некоторые из них.

Ответы [ 2 ]

2 голосов
/ 01 марта 2020

Может быть, я могу изменить строки параметров существующего аргумента справки?

Просто упомянуть, очень хакерский способ изменить существующие аргументы:

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.print_help()
usage: [-h]

optional arguments:
  -h, --help  show this help message and exit
>>> parser._actions[0].option_strings.remove("-h")
>>> parser._option_string_actions.pop("-h")
_HelpAction(option_strings=['--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None)
>>> parser.print_help()
usage: [--help]

optional arguments:
  --help  show this help message and exit

By Кстати, вместо

parser._actions[0].option_strings.remove("-h")
parser._option_string_actions.pop("-h")

вы также можете использовать _handle_conflict_resolve:

parser._handle_conflict_resolve(None, [("-h", parser._actions[0])])

Я думаю, что должен быть лучший способ, чем полное удаление Аргумент справки с add_help=False просто чтобы добавить его снова с --help и action="help" сразу после этого

И просто для полноты, вот как это будет работать:

>>> from argparse import ArgumentParser, SUPPRESS
>>> parser = ArgumentParser(add_help=False)
>>> parser.add_argument("--help", action="help", default=SUPPRESS, help="show this help message and exit")
_HelpAction(option_strings=['--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None)
>>> parser.print_help()
usage: [--help]

optional arguments:
  --help  show this help message and exit
2 голосов
/ 01 марта 2020

Маршрут конфликта_обработчика:

In [5]: parser=argparse.ArgumentParser(conflict_handler='resolve')                             
In [6]: parser.add_argument('-h','--handle',help='handle foobar',default='foo');               

In [7]: parser.print_help()                                                                    
usage: ipython3 [--help] [-h HANDLE]

optional arguments:
  --help                show this help message and exit
  -h HANDLE, --handle HANDLE
                        handle foobar

resolve только что изменил '-h', а не '--help'.

Использование нового '-h':

In [8]: parser.parse_args('-h bar'.split())                                                    
Out[8]: Namespace(handle='bar')

Поскольку сокращения по-прежнему разрешены, «-help» с одним da sh дает неожиданные результаты:

In [9]: parser.parse_args('-help'.split())                                                     
Out[9]: Namespace(handle='elp')

Правильная помощь:

In [10]: parser.parse_args('--help'.split())                                                   
usage: ipython3 [--help] [-h HANDLE]

optional arguments:
  --help                show this help message and exit
  -h HANDLE, --handle HANDLE
                        handle foobar
An exception has occurred, use %tb to see the full traceback.

SystemExit: 0

/usr/local/lib/python3.6/dist-packages/IPython/core/interactiveshell.py:3327: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
  warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)

Посмотрите на код метода _handle_conflict_resolve, чтобы увидеть, что именно он делает.

...