2016-11-17 72 views
0

我在同一個代碼庫中混合了一些庫,有些使用argparse,另一些使用optparse。容易包裝的optparse來argparse?

我想將所有選項集成到主配置工具中 - 理想情況下,不需要進入和編輯各種庫和工具。

是否可以將optparse選項對象包裝(或以其他方式集成)到argparse解析器中,從而使解析器可以使用optparse選項進行擴展(並且衝突被突出顯示等等)?

+1

簡短的回答是,不,'argparse'沒有任何接受'OptionParser'實例作爲參數並返回一個等價的'ArgumentParser'實例的函數。任何更長的答案只是針對*提供這種功能的第三方庫的建議。 – chepner

+0

哼。對於argparse來說,看起來不太難,除非我錯過了一些東西? – blueberryfields

+0

只需自己寫一個 - 最大的任務就是從optparse解析器中提取相關參數。一旦你有一組兼容的參數,你可以很容易地創建一個新的argparse參數。在argparse文檔的結尾處有指導將optparse參數轉換爲argparse參數。舉一個具體的例子,如果你想要更多的討論。 – hpaulj

回答

1

我剛做了一個簡單的optparse解析器;這裏有對象

In [229]: parser = OptionParser() 
In [230]: parser 
Out[230]: <optparse.OptionParser at 0xaf912a4c> 
In [231]: parser.add_option("-f", "--file", dest="filename", 
    ...:     help="write report to FILE", metavar="FILE") 
Out[231]: <Option at 0xaf919b2c: -f/--file> 
In [232]: parser.option_list 
Out[232]: [<Option at 0xaf91232c: -h/--help>, <Option at 0xaf919b2c: -f/--file>] 

In [233]: vars(parser.option_list[1]) 
Out[233]: 
{'_long_opts': ['--file'], 
'_short_opts': ['-f'], 
'action': 'store', 
'callback': None, 
'callback_args': None, 
'callback_kwargs': None, 
'choices': None, 
'const': None, 
'container': <optparse.OptionParser at 0xaf912a4c>, 
'default': ('NO', 'DEFAULT'), 
'dest': 'filename', 
'help': 'write report to FILE', 
'metavar': 'FILE', 
'nargs': 1 
'type': 'string'} 

In [234]: vars(parser) 
Out[234]: 
{'_long_opt': {'--file': <Option at 0xaf919b2c: -f/--file>, 
    '--help': <Option at 0xaf91232c: -h/--help>}, 
'_short_opt': {'-f': <Option at 0xaf919b2c: -f/--file>, 
    '-h': <Option at 0xaf91232c: -h/--help>}, 
'allow_interspersed_args': True, 
'conflict_handler': 'error', 
'defaults': {'filename': None}, 
'description': None, 
'epilog': None, 
'formatter': <optparse.IndentedHelpFormatter at 0xaf8feb0c>, 
'largs': None, 
'option_class': optparse.Option, 
'option_groups': [], 
'option_list': [<Option at 0xaf91232c: -h/--help>, 
    <Option at 0xaf919b2c: -f/--file>], 
'process_default_values': True, 
'prog': None, 
'rargs': None, 
'usage': '%prog [options]', 
'values': None, 
'version': None} 

的「包裝」的屬性,就必須這樣做:

In [252]: pa = argparse.ArgumentParser() 

In [253]: a1=parser.option_list[1] 
In [254]: assert(a1.action=='store') 
In [255]: ostrings=[] 
In [256]: ostrings.extend(a1._short_opts) 
In [257]: ostrings.extend(a1._long_opts) 
In [259]: assert(a1.const is None) 
In [260]: ohelp=a1.help 
In [261]: odest=a1.dest 
In [262]: ometa=a1.metavar 

In [264]: pa.add_argument(*ostrings, dest=odest, metavar=ometa, help=ohelp) 
Out[264]: _StoreAction(option_strings=['-f', '--file'], 
    dest='filename', nargs=None, const=None, default=None, type=None, 
    choices=None, help='write report to FILE', metavar='FILE') 

比較的幫助:

In [265]: pa.print_help() 
usage: ipython3 [-h] [-f FILE] 

optional arguments: 
    -h, --help   show this help message and exit 
    -f FILE, --file FILE write report to FILE 

In [267]: parser.print_help() 
Usage: ipython3 [options] 

Options: 
    -h, --help   show this help message and exit 
    -f FILE, --file=FILE write report to FILE 

但是,即使你寫了這樣一轉換器,它如何適應工作流程?它足夠強大,足以融入運行時?