条件装饰器实现

Conditional Decorator Implementation

我想要有条件的装饰器。以下是我的代码:-

def int_decorator(func):  # checks whether the args passed is of type int.
    def wrapper(*args, **kwargs):
        a, b = args
        if not (isinstance(a, int) and isinstance(b, int)):
            return
        return func(*args, **kwargs)
    return wrapper


decorator_mapping = {
    'int': int_decorator
}

class conditional_decorator(object):
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        decorator = decorator_mapping.get(kwargs.get('decorator'))
        if not decorator:
            # Return the function unchanged, not decorated.
            return self.func(*args, **kwargs)
        return decorator(self.func(*args, **kwargs))


@conditional_decorator
def func(a, b, *args, **kwargs):
    return(1)

print(func(1, 2, decorator='int'))

我想要的是,如果 decorator_mapping 中存在与 func 中传递的值相匹配的装饰器,则在函数上应用相同的装饰器,否则不应用任何装饰器。

以上代码在没有任何装饰器的情况下运行良好,但在找到装饰器时失败。它打印了 function 的引用。

我哪里错了?

def __call__(self, *args, **kwargs):
    decorator = decorator_mapping.get(kwargs.get('decorator'))
    if not decorator:
        # Return the function unchanged, not decorated.
        return self.func(*args, **kwargs)
    return decorator(self.func)(*args, **kwargs)

你想装饰这个函数,然后调用它的装饰版本。

装饰器接受一个函数,returns一个函数。这一行:

    return decorator(self.func(*args, **kwargs))

应该是:

    return decorator(self.func)(*args, **kwargs)