Подтвердить что ты не робот

Python argparse: параметры имени

Я пишу программу, использующую argparse, для разбора некоторых аргументов, которые мне нужны.

теперь у меня есть это:

parser.add_argument('--rename', type=str, nargs=2, help='some help')

когда я запускаю этот script, я вижу это:

optional arguments:
  -h, --help            show this help message and exit
  --rename RENAME RENAME
                        some help

Как я могу изменить свой код таким образом, чтобы страница справки помогла мне показать:

--rename OLDFILE NEWFILE

Могу ли я использовать OLDFILE и NEWFILE таким образом?

args.rename.oldfile
args.rename.newfile
4b9b3361

Ответ 1

Если вы установите metavar=('OLDFILE', 'NEWFILE'):

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--rename', type=str, nargs=2, help='some help',
                    metavar=('OLDFILE', 'NEWFILE'))
args = parser.parse_args()
print(args)

Тогда test.py -h дает

usage: test.py [-h] [--rename OLDFILE NEWFILE]

optional arguments:
  -h, --help            show this help message and exit
  --rename OLDFILE NEWFILE
                        some help

Затем вы можете получить доступ к аргументам с помощью

oldfile, newfile = args.rename

Если вы действительно хотите получить доступ к oldfile с помощью args.rename.oldfile вы можете настроить собственное действие:

import argparse
class RenameAction(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        setattr(namespace, self.dest,
                argparse.Namespace(
                    **dict(zip(('oldfile', 'newfile'),
                               values))))

parser = argparse.ArgumentParser()
parser.add_argument('--rename', type=str, nargs=2, help='some help',
                    metavar=('OLDFILE', 'NEWFILE'),
                    action=RenameAction)
args = parser.parse_args()

print(args.rename.oldfile)

но этот дополнительный код на самом деле мне не подходит.

Ответ 2

Прочитайте документацию argparse (http://docs.python.org/2.7/library/argparse.html#metavar):

Различные значения nargs могут привести к тому, что метавар будет использоваться несколько раз. Предоставление кортежа metavar указывает другой дисплей для каждого из аргументов:

>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x', nargs=2)
>>> parser.add_argument('--foo', nargs=2, metavar=('bar', 'baz'))
>>> parser.print_help()
usage: PROG [-h] [-x X X] [--foo bar baz]

optional arguments:
 -h, --help     show this help message and exit
 -x X X
 --foo bar baz