새소식

ML Development/Python - 2022.06.01

[파이썬] @(Decorator)란

  • -

@(Decorator)란?

@staticmethod
def _find_best_gt_match(
    thr: int, gt_matches: Tensor, idx_iou: float, gt_ignore: Tensor, ious: Tensor, idx_det: int
    ) -> int:
    """Return id of best ground truth match with current detection.
    
https://github.com/PyTorchLightning/metrics/blob/master/torchmetrics/detection/mean_ap.py#L199-L928

파이썬으로 작성된 코드들을 보면 위와 같이 함수 위에 @로 시작하는 문구들이 있다.

위 코드에선 @staticmethod가 그렇다. 

매번 함수와 같이 다니는 걸 보면 관련이 있는 것이 분명한데 과연 @는 어떤 역할을 할까? 

 

사실 @은 python에서 Decorator(데코레이터)를 편하게 사용하기 위해서 도입됐다.

데코레이터는 이름에서도 알 수 있듯이 뭔가를 바꾸거나 수정할 때 사용될 것이다. 

실제로 데코레이터는 위 코드를 통해 알 수 있듯이 함수에 기능을 추가하고 싶을때 사용된다. 

 

일반적으로 함수 하나에 기능을 추가하려면 그냥 해당 함수를 다시 작성하면 된다.

하지만 비슷한 역할을 하는 함수들이 엄청 많다면, 모든 함수를 전부 다시 작성하는 것은 매우 귀찮은 일일 것이다.  

이때, 데코레이터를 사용하면 매우 편하게 함수를 재정의할 수 있다.

 

예시 코드

smile이라는 이모티콘(🙃)을 print하는 함수가 있다고 가정해보자.

해당 함수에서 추가로 함수 이름을 출력하려면 다음과 같이 함수를 수정해야 할 것이다.

# 기존
def smile():
    print("🙃")
    
# 변경 후    
def smile():
    print("🙃")
    print("smile")

함수의 개수가 적다면, 직접 다 수정해도 된다. 하지만 변경해야 하는 함수가 매우 많을 땐...ㅎㅎ

이와 같은 상황에서 decorate라는 함수를 도입한다면 함수를 간편하게 재정의할 수 있을 것이다.

실제로 decorate가 기존 함수를 호출하기만 하면 된다!

# 함수 이름은 상관 없음.
def decorate(func):
	# func가 재정의됨
	def new_func():
		func()
        	print(func.__name__)
        
def smile():
    print("🙃")

def angry():
    print("🤯")

def love():
    print("🥰")
...

# 함수 재정의를 위해 decorator 함수 실행
smile = decorate(smile)
angry = decorate(angry)
love = decorate(love)
...

하지만 생각해보면, 사실 재정의를 위한 호출도 좀 귀찮은 건 마찬가지다.

여기서 @(decorator)를 활용하면, 이 작업을 매우 간단하게 처리해준다.

 

실제로 함수 위에 그냥 @decorate만 써주면 된다.

# 함수 이름은 상관 없음. 역할이 decorator
def decorate(func):
	# func가 재정의됨
	def new_func():
		func()
        	print(func.__name__)
            
# @decorate로 별도의 호출 필요 없이도 함수 재정의
@decorate
def smile():
    print("🙃")
    
@decorate
def angry():
    print("🤯")
    
@decorate
def love():
    print("🥰")
...

참고

 

타입 파이썬! 올바른 class 사용법과 객체지향 프로그래밍 - 인프런 | 강의

Python으로 생산성있는 개발만 아니라 견고하고 안전하게, 그리고 확장성있는 개발을 하세요! 🔥, - 강의 소개 | 인프런...

www.inflearn.com

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.