2014-01-17 2 views
14

Возможно ли добавить пользовательскую функцию «использование» вместо сообщения об использовании по умолчанию, предоставляемого python argparse.Пользовательская функция 'use' в argparse?

Пример кода:

parser = argparse.ArgumentParser(description='Sample argparse py') 
parser.add_argument('-arg_1',type=int, custom_usage_funct('with_some_message')) 
output = parser.parse_args() 

def custom_usage_funct(str): 
    print str 
    print ''' 
     Usage: program.py 
     [-a, Pass argument a] 
     [-b, Pass argument b] 
     [-c, Pass argument c] 
     [-d, Pass argument d] 
     comment 
     more comment 
     ''' 

Если переданный аргумент строку значение, вместо целого числа, то программа должна вызвать функцию пользовательского использования с сообщением об ошибке «Просьба целочисленное значение»

Действительный аргумент

program.py -arg_1 123 

Недопустимый аргумент

program.py -arg_1 abc 

     Please provide an integer value 
     Usage: program.py 
     [-a, Pass argument a] 
     [-b, Pass argument b] 
     [-c, Pass argument c] 
     [-d, Pass argument d] 
     comment 
     more comment 

ответ

7

Да, сообщение по умолчанию может быть изменено с использованием = именованного аргумента, как это,

def msg(name=None):                
    return '''program.py 
     [-a, Pass argument a] 
     [-b, Pass argument b] 
     [-c, Pass argument c] 
     [-d, Pass argument d] 
     comment 
     more comment 
     ''' 

и используя

import argparse 
parser = argparse.ArgumentParser(description='Sample argparse py', usage=msg()) 
parser.add_argument("-arg_1", help='with_some_message') 
parser.print_help() 

выше выход, как это,

usage: program.py 
     [-a, Pass argument a] 
     [-b, Pass argument b] 
     [-c, Pass argument c] 
     [-d, Pass argument d] 
     comment 
     more comment 


Sample argparse py 

optional arguments: 
    -h, --help show this help message and exit 
    -arg_1 ARG_1 with_some_message 

Примечание: см. here

Usingaction= ключевое слово аргумент

>>> class FooAction(argparse.Action): 
...  def __call__(self, parser, namespace, values, option_string=None): 
...   print '%r %r %r' % (namespace, values, option_string) 
...   setattr(namespace, self.dest, values) 
... 
>>> parser = argparse.ArgumentParser() 
>>> parser.add_argument('--foo', action=FooAction) 
>>> parser.add_argument('bar', action=FooAction) 
>>> args = parser.parse_args('1 --foo 2'.split()) 
Namespace(bar=None, foo=None) '1' None 
Namespace(bar='1', foo=None) '2' '--foo' 
>>> args 
Namespace(bar='1', foo='2') 
+1

Можно ли вызвать пользовательскую функцию на основе ввода аргументов? Предположим, что аргумент ожидает только целочисленное значение, и если пользователь вводит строковое значение. Затем пользовательская функция использования должна вызываться с сообщением «Аргумент принимает только целочисленное значение» – devav2

+1

Да, вы можете сделать это с помощью аргумента action = 'keyword. Пример [здесь] (http://docs.python.org/2.7/library/argparse.html#action). См. Мой отредактированный ответ. –

+1

Вам не нужно создавать функцию msg. Так как он возвращает строку, а use = принимает строку, вы можете вырезать среднего человека. –

2

Да, используйте опцию usage. Из документов:

>>> parser = argparse.ArgumentParser(prog='PROG', usage='%(prog)s [options]') 
>>> parser.add_argument('--foo', nargs='?', help='foo help') 
>>> parser.add_argument('bar', nargs='+', help='bar help') 
>>> parser.print_help() 
usage: PROG [options] 

positional arguments: 
bar   bar help 

optional arguments: 
-h, --help show this help message and exit 
--foo [FOO] foo help 
Смежные вопросы