1

我正在努力将 Python 中具有默认参数的 API 函数与使用 optparse 包装它的命令行脚本干净地结合起来。假设 API 函数如下所示:

def api(foo, bar, opt1 = 2, opt2 = 3):
    pass

命令行工具的 OptionParser 如下所示

parser = OptionParser(usage=usage, description=desc, version=version)
parser.add_option("-a", "--opt1", type="int", action="store", help="opt1")
parser.add_option("-b", "--opt2", type="int", action="store", help="opt2")
parser.add_option("-v", "--verbose", action="store", help="verbosity")
(opt, args) = parser.parse_args()

此时,我希望 CLI 调用 api(),为 foo 和 bar 提供一个值,并传播 opt1/opt2 选项(如果指定了它们),否则省略那些将导致使用默认值 2 和 3 的参数。做这个的最好方式是什么?请记住,命令行选项“verbose”不适用于 api()。

我想要 API 中的默认值而不是 OptionParser,因为有时 API 以库方式调用,并且应该应用与 CLI 案例相同的默认值。最重要的是,我不希望在未指定 opt1 或 opt2 的情况下传播 opts 中的 None 值。

我需要使用 OptionParser 但 argparse 答案也会很有趣。

谢谢你的时间。

编辑:

这是我想出的最好的,使用检查模块:

kws = {}
param_names = inspect.getargspec(api)[0]
kws.update((k, v) for k, v in opt.__dict__.items() if v is not None and k in param_names)

api(foo, bar, **kws)
4

1 回答 1

0
parser = OptionParser(usage=usage, description=desc,
        version=version)
parser.add_option("-a", "--opt1", type="int", action="store",
        help="opt1")
parser.add_option("-b", "--opt2", type="int", action="store",
        help="opt2")
parser.add_option("-v", "--verbose", action="store",
        help="verbosity")
(opt, args) = parser.parse_args()

optional_arguments = dict((k, v) for k, v in vars(opt).items() \
    if v and k in ['op1', 'op2'])
api('the foo', 'the bar', **optional_arguments)

讨论

  • vars(opt)返回字典,例如{'opt1': None, 'opt2': None, 'verbose': None}
  • 整个dict( ... )表达式过滤掉那些值不是的选项None并返回一个字典对象。我也可以filter()用于此目的。
  • 这个字典对象可以输入api()

更新

and k in ['op1', 'op2']在创建时添加了optional_arguments以防止其他参数进入参数列表。

于 2013-04-09T21:12:46.227 回答