인공지능 모델 코드를 보다보면 마주하는 생소한 문법인 @ ,,, 즉 decorator 에 대해 정리하려고 한다. 임커밋님의 https://www.youtube.com/watch?v=3t26Z4vk7XE&list=PL6R2CbVlhcYtnLsypcisMzDN344c1Conr&index=5
를 참고하였는데, 앞으로 이분 영상 보면서 조금씩 공부해보려한다.
def deco(f):
print("deco!)
return f
@deco
def double(num):
return 2*num
print(double(41))
을 실행하게 되면 "deco!" 와 82 가 순서대로 출력된다.
우선 함수는 "객체화" 되어 있기 때문에 함수를 변수처럼 사용할 수 있다는 것을 알아야 데코레이터를 이해할 수 있다.
예를 들면,
1. 함수를 보통의 변수처럼 dictionary 의 value 로 사용할 수 있다.
2. 함수를 다른 함수의 인자로 쓰도록 할 수 있다.
def calculation(func,a,b) :
return func(a,b)
print(calculation(add,41,3))
이 가능하다. 여기서는 func 인자로 add 가 쓰여지고 있다. 즉 return add(41,3) 이 되는 것이다.
즉 왼쪽 코드는 오른쪽 코드처럼 작동한다.
@deco 를 붙이게 되면, double 함수가 deco 의 인자로 넘겨져 deco 함수가 먼저 실행이 되고, return f 로 double 함수가 반환되는 것이다.
다시 말하면, @deco 를 double 함수 위에 붙인다는 것은
double=deco(double)
를 하는 것과 같고, 이를 해석하면 deco 함수에 double 를 전달하여 기능이 추가된 함수 객체를 만들고, 이를 다시 double 변수로 바인딩하는 것이다.
결과적으로
print(double(41))
을 실행하면
"double" 에 "deco" 함수에서 추가한 기능이 수행되고, double 함수가 수행된다. 이때, double 함수 자체는 변화하지 않는다.
def deco(f):
print("deco!")
return 41
만약 위 코드처럼 deco 함수가 input 인자를 그대로 return 하지 않는다면, double 은 더이상 함수가 아니라 41이 되어버리기 때문에 int object 가 되고, 함수로 사용할 수가 없다.
다음 post 에서는 decorator 에 @deco(3) 처럼 인자를 사용하는 경우를 보려고 한다.