条件装饰器实现
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)
我想要有条件的装饰器。以下是我的代码:-
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)