我有一个函数(foo),它是另一个函数()的便捷函数包装器bar. foo调用bar,然后在输出上执行另外几个任务.例如:
def bar(bar_arg, bar_kw=None):
#do some stuff
return ret
def foo(bar_arg, foo_arg, bar_kw=None, foo_kw=None):
ret = bar(bar_arg, bar_kw)
ret.some_method(foo_arg, foo_kw=foo_kw)
Run Code Online (Sandbox Code Playgroud)
我希望调用签名foo包含关键字和参数,bar以便用户检查foo知道他们可以传递什么,但是,我想避免自己维护完整的参数列表,因为它bar往往会因为它来自的包而改变更新并且其参数列表很长.由于foo始终bar使用bar接受的参数和关键字的完整列表进行调用,因此我不认为我应该自己维护列表.
有没有办法根据呼叫签名构建foo呼叫签名bar?另外,有没有办法捕捉输入foo在字典或命名空间,这样我可以很容易地分开使用的参数和关键字foo从那些使用bar?
注意,我知道*args和**kwargs.但是,它们使函数签名不明确,并且不会通知用户允许哪些参数和关键字参数.
编辑:我应该注意我的用例比这个例子复杂得多.被调用的外部函数(bar)是matplotlib.colorbar.ColorbarBase.调用函数(foo)是绘图类的类方法,该类在我自己的许多应用程序中使用,其他应用程序可能在将来使用. foo创建一个颜色条,然后根据不接受的其他参数和关键字在颜色条上执行其他工作ColorbarBase.
我认为最好的选择是省略foo。仅使用用户需要的简单构建块来保持 API 的简短和简洁,以便他们可以快速学习如何使用您的库。程序员可以非常轻松地创建他们真正想要的便利功能,而不会被您认为他们想要的功能分散注意力。
如果您的实际功能比问题中看起来更复杂,请更新问题以表明这一点。现在,对于程序员来说,简单地编写是清晰明确的
my_bar = bar(bar_arg, bar_kw)
my_bar.some_method(foo_arg, foo_kw=foo_kw)
Run Code Online (Sandbox Code Playgroud)
为了他们自己。任何读者都知道到底发生了什么,并且不必解析长参数列表,并且额外的代码行也很好。