2014-01-17 22 views
14

是否可以添加一个自定义'使用'功能,而不是由python argparse提供的默认使用信息。在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 ='关键字参数来做到这一点。例子是[here](http://docs.python.org/2.7/library/argparse.html#action)。看到我编辑的答案。 –

+1

你不需要使味精成为一个功能。由于它返回一个字符串,而usage =接受一个字符串,所以你可以剪掉中间人。 –

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