【发布时间】:2021-01-26 17:08:01
【问题描述】:
我有一些样板逻辑,我想包装几个具有相同可选关键字的函数。现在它看起来像下面的代码。但是,这只处理 opt_key 作为关键字传递的情况,而不是按位置传递的情况。解决此问题的一种方法是了解如何解决参数分配。
是否有一些元函数接受一个函数、args 和 kwargs,并返回一个字典,该字典提供从变量名到值的映射?所以对于下面,
meta_function(g,1,2,3) 将返回 {"x" : 1, "y" : 2, "opt_key" : 3} 并且
meta_function(g,1,2,opt_key=3) 也会返回 {"x" : 1, "y" : 2, "opt_key" : 3}
def g(x,y,opt_key = None):
return something
def h(z,opt_key = None):
return something else
def wrap(f,*args,**kwargs):
if kwargs["opt_key"] is None:
#Do some stuff to get default opt_key
kwargs["opt_key"] = default_opt_key
v = f(args,kwargs)
#Do some stuff to dispose default opt_key
return v
else:
return f(args,kwargs)
wrap(g,x,y,opt_key = None)
wrap(h,x,opt_key = None)
【问题讨论】:
-
您可以解开 args 和 kargs:
return f(*args, **kwargs),这样您就不必管理用户是使用位置参数还是关键字 one。 -
我不明白你的问题。 “你能从函数、args 和 kwargs 中确定如何分配变量吗?” - 是的:
args按位置分配,kwargs按名称分配。这是他们的定义 -
@juanpa.arrivillaga,他们?我以为我只回应一个人。无论如何,我不清楚您的评论的含义?我指出 PEP 描述了装饰器的语法。我知道理论上使用语法“糖”或链函数调用没有区别。
-
@JoshBrownKramer,我从来没有说过我发送的答案是完整的解决方案,它只是可以升级以满足您的要求的示例之一。
标签: python