2014-01-17 52 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