2017-01-10 7 views
2

У нас есть куча скриптов, которые используют стандартный набор параметров. Они определены в классе, который использует все сценарии. Каждый скрипт может добавлять дополнительные параметры по мере необходимости.python argparse: как переопределить все остальные параметры - например, --help делает в большинстве программ?

Я пытаюсь добавить новый параметр, который должен действовать как -help, если он присутствует, все остальные параметры игнорируются. Когда задан новый параметр (--doc_string), я хочу, чтобы все остальные параметры игнорировались, я напечатаю определенную строку и выйду. Есть ли способ сделать это с помощью argparse?

Я смотрел с помощью групп, как это:

parser = argparse.ArgumentParser(prog='PROG') 
group1 = parser.add_argument_group('docs', 'doc printing') 
group1.add_argument('--doc_string', action = 'store_true', help='print the doc string and exit') 
group2 = parser.add_argument_group('group2', 'group2 description') 
group2.add_argument('--bar', required=True, help='bar help') 
group2.add_argument('--blah',required=True, help='url used to test.') 
parser.parse_args() 

Но при запуске только с --doc_string, я все еще получаю сообщение --bar is required. Исключительные группы также не правы.

Я также рассмотрел подклассификацию argparse.RawDescriptionHelpFormatter или argparse.RawTextHelpFormatter или argparse.ArgumentDefaultsHelpFormatter, но не могу понять, как использовать их для выполнения того, что я пытаюсь сделать.

+0

Вы пробовали разбираться в args после определения своих аргументов group1? Тогда, если нет --doc-строки, добавьте другие аргументы и снова проанализируйте аргументы? –

+1

интересный подход. Просто попробовал. Если 'argparse' знает только о' --doc_string', но видит другие параметры, такие как '--bar', он жалуется на параметры:' error: unrecognized arguments: --bar --blah'. Мне нужен способ заглянуть в список аргументов, прежде чем argparse проверит их. – SecondGear

+0

Ты знаешь об этом: 'sys.argv'? https://docs.python.org/3.7/library/sys.html#sys.argv –

ответ

4

Зарегистрируйте собственное действие с помощью парсера. Тогда вы можете сделать это так же --help, --version и т. Д. Сделайте это, т. Е. Указав действие.

import argparse 

class DocstringAction(argparse.Action): 

    def __call__(self, parser, namespace, values, option_string=None): 
     print('see ya later alligator') 
     parser.exit() 

parser = argparse.ArgumentParser(prog='PROG') 
parser.register('action', 'docstring', DocstringAction) 
group1 = parser.add_argument_group('docs', 'doc printing') 
group1.add_argument('--doc_string', nargs=0, action='docstring', help='print the doc string and exit') 
group2 = parser.add_argument_group('group2', 'group2 description') 
group2.add_argument('--bar', required=True, help='bar help') 
group2.add_argument('--blah',required=True, help='url used to test.') 
parser.parse_args() 

Если вам не нужны какие-либо аргументы для действия строки документации, то вы можете (должны) нажать nargs=0 в DocstringAction.__init__ так что не нужно указывать, что.

+0

Спасибо, это именно то, что я искал. – SecondGear

+0

Правильно, ключ к переопределению 'help' - это' parser.exit() '. Это также делает класс action. – hpaulj

+0

Единственное, что касается этого решения, - это использование 'parser.register' недокументированных. Я вырыл перед отправкой и был удивлен, что я не раскрыл этот подход. Полагаю, это означает, что он может исчезнуть в будущем выпуске, но на данный момент он отлично функционирует. – SecondGear

 Смежные вопросы

  • Нет связанных вопросов^_^