装饰器/包装器:如何在位置/关键字args全部分配给包装函数的参数后处理参数?

时间:2014-08-11 15:25:58

标签: python arguments wrapper decorator

我想知道在Python中是否有一种方法可以让包装器在已经解析为参数后访问函数的参数。因此,例如,我想要包含两个具有不同(数量)参数的函数:

def fn_1(a, b=None, config=None):
    ...

def fn_2(b=None, config=None):
    ...

我的喜欢我的包装器,看看config是否有值,如果没有,则从其他地方加载它:

class with_config(object):
    def __init__(self, f):
       self.f = f
    def __call__(self, *args, **kwargs):
       if config not in kwargs:
           kwargs[config] = load_config_from_some_default_location()

但我不知道如何确定config是否已按位置传递,因为它在args列表中的位置因功能而异。

如果我能在之后得到的参数,那么根据参数给位置的参数设置了名称(例如,第一个位置分配给a,第二个位置分配给b,第三个到config)我会好的。

情况稍微复杂一些,但我认为这会引起我的质疑。

任何提示?

2 个答案:

答案 0 :(得分:0)

这可能会对您有所帮助:

import inspect

def func(a, b=None, config=None):
    args, _, _, values = inspect.getargvalues(inspect.currentframe())
    print args # prints 'a', 'b', 'config'
    print values # prints {'a':12, 'b':None, 'config':None}
    if values['config'] == None:
        # Load config from somewhere else

if __name__ == '__main__':
    func(12)

答案 1 :(得分:0)

我终于选择了this solution from Nadia Alramli

class with_config(object): def __init__(self, f): self.f = f def __call__(self, *args, **kwargs): kwargs.update(dict(zip(self.f.func_code.co_varnames, args))) if config not in kwargs: kwargs[config] = load_config_from_some_default_location() return self.f(**kwargs)