Помощь с помощью argparse без дублирования ALLCAPS
Я хотел бы отображать справку argparse для моих параметров так же, как по умолчанию -h
, --help
и -v
, --version
, без текста ALLCAPS после опции или, по крайней мере, без дублирования CAPS.
import argparse
p = argparse.ArgumentParser("a foo bar dustup")
p.add_argument('-i', '--ini', help="use alternate ini file")
print '\n', p.parse_args()
Это то, что я получаю в настоящее время с python foobar.py -h
:
usage: a foo bar dustup [-h] [-i INI]
optional arguments:
-h, --help show this help message and exit
-i INI, --ini INI use alternate ini
И это то, что я хочу:
usage: a foo bar dustup [-h] [-i INI]
optional arguments:
-h, --help show this help message and exit
-i, --ini INI use alternate ini
Это тоже будет приемлемо:
-i, --ini use alternate ini
Я использую python 2.7.
Ответы
Ответ 1
Вы можете настроить usage
и назначить metavar
пустой строке:
import argparse
p = argparse.ArgumentParser("a foo bar dustup", usage='%(prog)s [-h] [-i INI]')
p.add_argument('-i', '--ini', help="use alternate ini file", metavar='')
p.print_help()
Выход
usage: a foo bar dustup [-h] [-i INI]
optional arguments:
-h, --help show this help message and exit
-i , --ini use alternate ini file
Ответ 2
Хорошо, что я могу сказать, у вас есть два варианта:
import argparse
p = argparse.ArgumentParser(description="a foo bar dustup")
p.add_argument('-i', '--ini', metavar='', help="use alternate ini file")
print '\n', p.parse_args()
или вы можете написать собственный класс форматирования, я понимаю, что первый вариант может быть не идеальным решением, поскольку он избавляется от CAPS в строке использования. Если это важно здесь source для argparse, то из того, что я могу сказать, классы по умолчанию для форматирования не будут делать именно то, что вы хотите.
Edit:
Хорошо, я пошел вперед и построил вам свой собственный класс форматирования, так же, как и другие... не уверен, что я рекомендую вам использовать это в производственном коде, поскольку для него не будет официальной документации на python = р
import argparse
from argparse import HelpFormatter
class MyFormatter(HelpFormatter):
"""
for matt wilkie on SO
"""
def _format_action_invocation(self, action):
if not action.option_strings:
default = self._get_default_metavar_for_positional(action)
metavar, = self._metavar_formatter(action, default)(1)
return metavar
else:
parts = []
# if the Optional doesn't take a value, format is:
# -s, --long
if action.nargs == 0:
parts.extend(action.option_strings)
# if the Optional takes a value, format is:
# -s ARGS, --long ARGS
else:
default = self._get_default_metavar_for_optional(action)
args_string = self._format_args(action, default)
for option_string in action.option_strings:
parts.append(option_string)
return '%s %s' % (', '.join(parts), args_string)
return ', '.join(parts)
def _get_default_metavar_for_optional(self, action):
return action.dest.upper()
p = argparse.ArgumentParser("a foo bar dustup", formatter_class=MyFormatter)
p.add_argument('-i', '--ini', help="use alternate ini file")
p.print_help()