我正在努力将 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)