본문으로 바로가기

Python: Function (5)

category Programming/Python 2021. 1. 20. 18:33
반응형

파이썬의 펑션에 관한 내용을 공부하는 동안, 펑션만 가지고도 블로그에 여러 개의 글이 써지겠다는 생각을 했었다. 그 만큼 파이썬에서 제공하고 있는 펑션에 관한 기능이 다채롭다는 의미이고, 그 때의 예상대로 펑션과 관련하여 다섯번째 글을 올리고 있다.

Decorator

모듈 형태의 프로그램을 작성하다보면, 호출된 모듈의 실행과 관련된 여러 정보들을 로그로 남겨야 하는 경우가 많이 발생한다. 그리고, 쓸데 없는 이야기처럼 들릴 수도 있겠지만, 로그는 보기 편하게 남겨져야 한다는 생각도 늘 가지고 있다. 비록 콘솔창이긴 하지만, 위 예제 그림과 같이 점선으로 만든 구분자도 아래 위로 정성스럽게 넣어주고 말이다. ㅎㅎㅎ
프로그램 안에서 만들어야 하는 모듈이 여러 개가 있는데, 저런 구분자나 소요 시간 등이 기본적으로 출력되는 기능을 모든 모듈에 넣어준다고 생각해보자. 펑션마다 저런 코드를 복붙해주어야 할 것이다.

하지만, 모든 모듈이 기본으로 제공해야 하는 부분을 위 그림과 같이 이너 펑션에 추가하고, 클로저로 활용한다면 22번과 24번 라인과 같이 같은 이름으로 같은 템플릿에 다른 펑션을 사용하는 것이 가능해진다. 단, 적용해야할 펑션이 달라질 때마다 21번과 23번 라인과 같이 클로저를 매칭해주는 코드가 항상 필요하고, 늘 같은 이름으로 펑션을 사용하기 때문에 실제로 어떤 펑션을 호출하는지를 직관적으로 알기도 어렵다.

이러한 불편함과 불합리적인 부분을 개선할 수 있도록, 파이썬에서는 위 그림과 같이 데코레이터 기능을 제공하고 있다. 위 그림에서 보는 것과 같이 데코레이터를 적용할 펑션 바로 앞에 '@' 기호와 데코레이터 역할의 펑션 이름을 입력하면 간단하게 데코레이터를 적용할 수 있다.

위 그림에서 볼 수 있듯이, 2개 이상의 데코레이터도 적용할 수 있다. 여기서 주의할 부분은 펑션을 정의하는 과정에서 어떤 데코레이터를 먼저 적용할 것인지 결정해야 한다는 것이다.

다중 데코레이터를 적용했을 때 데코레이터가 어떤 영향을 미치는지는 위 그림을 통해 확인할 수 있는데, 펑션을 정의하는 def 키워드와 가까운 데코레이터가 먼저 반영되는 것을 기억하자.

 

반응형

'Programming > Python' 카테고리의 다른 글

Python: Class01  (0) 2021.01.24
Python: Try & Exception  (0) 2021.01.22
Python: Function (4)  (0) 2021.01.19
Python: Function (3)  (0) 2021.01.17
Python: Function (2)  (0) 2021.01.15