0
我在同一個代碼庫中混合了一些庫,有些使用argparse,另一些使用optparse。容易包裝的optparse來argparse?
我想將所有選項集成到主配置工具中 - 理想情況下,不需要進入和編輯各種庫和工具。
是否可以將optparse選項對象包裝(或以其他方式集成)到argparse解析器中,從而使解析器可以使用optparse選項進行擴展(並且衝突被突出顯示等等)?
我在同一個代碼庫中混合了一些庫,有些使用argparse,另一些使用optparse。容易包裝的optparse來argparse?
我想將所有選項集成到主配置工具中 - 理想情況下,不需要進入和編輯各種庫和工具。
是否可以將optparse選項對象包裝(或以其他方式集成)到argparse解析器中,從而使解析器可以使用optparse選項進行擴展(並且衝突被突出顯示等等)?
我剛做了一個簡單的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
但是,即使你寫了這樣一轉換器,它如何適應工作流程?它足夠強大,足以融入運行時?
簡短的回答是,不,'argparse'沒有任何接受'OptionParser'實例作爲參數並返回一個等價的'ArgumentParser'實例的函數。任何更長的答案只是針對*提供這種功能的第三方庫的建議。 – chepner
哼。對於argparse來說,看起來不太難,除非我錯過了一些東西? – blueberryfields
只需自己寫一個 - 最大的任務就是從optparse解析器中提取相關參數。一旦你有一組兼容的參數,你可以很容易地創建一個新的argparse參數。在argparse文檔的結尾處有指導將optparse參數轉換爲argparse參數。舉一個具體的例子,如果你想要更多的討論。 – hpaulj