optparse 到 argparse 的简单包装器?

Posted

技术标签:

【中文标题】optparse 到 argparse 的简单包装器?【英文标题】:Easy wrapper for optparse to argparse? 【发布时间】:2017-04-01 07:37:39 【问题描述】:

我在同一个代码库中混合了多个库,一些使用 argparse,另一些使用 optparse。

我想将所有选项集成到主配置工具中 - 理想情况下,无需进入和编辑各种库和工具。

是否可以将 optparse 选项对象包装(或以其他方式集成)到 argparse 解析器中,以便使用 optparse 选项扩展解析器(并且突出显示冲突等...)?

【问题讨论】:

简短的回答是,不,argparse 没有任何函数可以接受 OptionParser 实例作为参数并返回等效的 ArgumentParser 实例。任何更长的答案都只是推荐确实提供此类功能的第 3 方库。 哼。 argparse 看起来不太难拥有 optparse 包装器(除非我遗漏了什么?) 自己写一个——最大的任务是从 optparse 解析器中提取相关参数。一旦你有了一组兼容的参数,你就可以轻松地创建一个新的 argparse 参数。在 argparse 文档的末尾有将 optparse 参数转换为 argparse 的指南。如果您想进行更多讨论,请举一个具体的例子。 【参考方案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

但即使您编写了这样的转换器,它如何适应工作流程?它是否足够健壮以包含在运行时中?

【讨论】:

以上是关于optparse 到 argparse 的简单包装器?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 argparse 而不是 optparse?

如何将 optparse() 代码升级为 argparse() 代码

将 optparse 转换为 argparse

使用 optparse 或 argparse 处理使用相同选项的多个参数

『Argparse』命令行解析

『Argparse』命令行解析