이런 방식의 데코레이터는 값을 지정해서 동작을 바꿀 수 있다는게 큰 장점이다.
def decoratorFunctionWithArguments(arg1, arg2, arg3):
def wrap(f):
print("wrap() 속에 들어왔습니다.")
def wrapped_f(*args):
print("wrapped_f() 속에 들어왔습니다.")
print("데코레이터 arguments:", arg1, arg2, arg3)
f(*args)
print("f(*args) 후.")
return wrapped_f
return wrap
@decoratorFunctionWithArguments("hello", "world", 42)
def sayHello(a1, a2, a3, a4):
print('sayHello arguments:', a1, a2, a3, a4)
print("데코레이터 후!")
print("sayHello() 콜 준비중.")
sayHello("안녕하세요", "sayHello", "argument", "list")
print("sayHello() 첫번째 콜 후.")
sayHello("반갑습니다", "sayHello의", "다른", "arguments")
print("sayHello() 두번째 콜 후.")
wrap() 속에 들어왔습니다.
데코레이터 후!
sayHello() 콜 준비중.
wrapped_f() 속에 들어왔습니다.
데코레이터 arguments: hello world 42
sayHello arguments: 안녕하세요 sayHello argument list
f(*args) 후.
sayHello() 첫번째 콜 후.
wrapped_f() 속에 들어왔습니다.
데코레이터 arguments: hello world 42
sayHello arguments: 반갑습니다 sayHello의 다른 arguments
f(*args) 후.
sayHello() 두번째 콜 후.
def is_multiple(x):
def real_decorator(func): # 실제 데코레이터 역할
def wrapper(a,b):
r = func(a,b)
if r % x == 0:
print('{0}의 반환값은 {1}의 배수입니다.'.format(func.__name__, x))
else:
print('{0}의 반환값은 {1}의 배수가 아닙니다.'.format(func.__name__, x))
return r
return wrapper
return real_decorator
@is_multiple(3)
def add(a, b):
return a + b
print(add(10, 20))
print(add(2, 5))
add의 반환값은 3의 배수입니다.
30
add의 반환값은 3의 배수가 아닙니다.
7
Reference:
https://www.artima.com/weblogs/viewpost.jsp?thread=240845#decorator-functions-with-decorator-arguments
https://dojang.io/mod/page/view.php?id=2429
우연히 온 벨로그가 민지님 블로그였다니~~!!