我希望能够包装一个函数,同时仍然允许在外部函数中使用可选的(关键字)参数。我可以这样做:
def outer(p1, p2, *a, **k):
inner(*a, **k)
但是,如果我想让 p2 成为"可选参数"怎么办?明显地:
def outer(p1, p2=None, *a, **k):
inner(*a, **k)
行不通,我知道为什么行不通。我想知道是否有一种漂亮、干净的方法来实现这一目标。是否有一些众所周知的模式或约定?
使用 functools
模块:
outer2 = functools.partial(outer, p2=None)
如果您只想确保在参数从外部传递到内部时存在 p2:
def outer(p1, *a, **k):
if 'p2' not in k: k.update(p2 = None)
inner(*a, **k)
对于更通用的方法,您可以保留默认值字典并在需要时应用它们:
def outer (p1, *args, **kwargs):
defaults = {'a': 1, 'b':2}
for k, v in defaults.items():
if k not in kwargs: kwargs[k] = v
inner(*a, **k)
如果是这种情况,您可能希望将帖子的标题编辑为"如何在**kwargs参数中包含默认值",因为包装并不是语法的一部分