Python 装饰器覆盖函数参数

use*_*968 4 python decorator python-decorators

我正在尝试编写一个 python 装饰器来覆盖函数参数,但我真的不知道要在 inner() 函数中放置什么。在这里修改 args 的正确方法是什么?

  def override(*override_args, **override_kwargs): 
        def outer(f): 
            def inner(*args, **kwargs): 
                ...
                ...
            return inner
        return outer

    @override('Cat')
    def my_function(animal, **kwargs): 
        print animal
        print kwargs

    my_function('Mouse', k1='1', k2='10') 
Run Code Online (Sandbox Code Playgroud)

小智 6

def override(*override_args, **override_kwargs):
    def outer(f):
        def inner(*args, **kwargs):
            min_args_length = min(len(args), len(override_args))
            args = list(args)
            for i in xrange(min_args_length):
                args[i] = override_args[i]
            kwargs.update(override_kwargs)
            return f(*args, **kwargs)
        return inner
    return outer

@override('Cat', 'male', k1='0')
def my_function(animal, **kwargs):
    print animal
    print kwargs

my_function('Mouse', k1='1', k2='10')
Run Code Online (Sandbox Code Playgroud)

输出:

Cat
{'k2': '10', 'k1': '0'}
Run Code Online (Sandbox Code Playgroud)

解释:

args 是一个包含没有名称的 args 的元组,我们最多可以覆盖它们的 min(len(args), len(override_args)) 。

kwargs 是一个字典,包含命名的 args 作为键:值对。只需将 override_kwargs 更新为 kwargs

我强烈建议您只覆盖命名的 args “kwargs” 以防止不匹配 args 的顺序。