파이썬 함수를 작성하다 보면 반복해서 사용하는 구문이 있습니다. 같은 코드를 여러 번 사용하면, 수정할 때도 여러 번 해야 합니다. 이럴 때 데코레이터를 이용해서 작성하면 편리합니다. 함수를 더 효율적으로 사용할 수 있게 되는데요. 파이썬 데코레이터란 무엇인지와 사용방법을 알아보았습니다.

 

 

파이썬 플라스크 패키지를 이용하면 데코레이터를 사용하게 됩니다. 데코레이터는 우리나라 말로 하면 장식자로 말로, 함수 앞뒤에 반복적으로 실행되는 구문을 넣을 수 있는 방법입니다. 반복되는 구문을 한 번에 작성할 수 있기 때문에, 수정사항을 반영하기도 싶고 코드도 깔끔해집니다.

 

1. 파이썬 데코레이터 사용이유

코딩을 하다 보면 함수를 정의할 때 반복해서 사용하는 코드가 생깁니다. 실행시간을 출력하든가, 로그를 남기는 코드는 모든 함수에서 공통으로 사용될 수 있습니다. 이런 경우에 파이썬 데코레이터를 사용하면 편리합니다. 예를 들어 아래와 같이 print('start)라는 코드가 다른 함수 안에서도 반복적으로 사용한다고 가정해 보겠습니다.

 

def print_start():

	print("start")

	def print_middle():
		print("middle")

 

이 경우 반복해서 사용되는 print("start") 코드를 데코레이터 문법으로 작성할 수 있습니다.

 

def print_start(func)
	print("start")
    
	return func


@print_start
def print_middle():
	print("middle")


print_middle()

 

이제 print_middle() 함수를 호출하면 print_start 함수가 먼저 실행됩니다.  그다음에 print_middle함수의 내용이 실행됩니다. func을 입력 파라미터로 받아서 return에서 실행되기 때문입니다.

 

 

2. 데코레이터 함수 작성하는 방법

데코레이터를 정의할 때는 파이썬에서 함수를 정의하는 것과 동일하게 작성합니다. 다만 입력파라미터로 함수가 들어가게 됩니다. 사용할 때는 함수 정의 윗부분에 '@함수명'으로 사용합니다.

 

3. 함수에 입력 파라미터가 있다면?

함수에 입력파라미터가 있는 경우에는 functools 모듈을 이용해야 합니다. 아래와 같이 사용하면 입력 파라미터가 있는 경우에 데코레이터를 이용할 수 있습니다.

 

from functools import wraps

def print_a(func):
	print("a를 출력합니다.")
	@wraps(func)
	def wrapper(*args, **kwargs):
		return func(*args, **kwargs)

	return wrapper


@print_a
def print_fn(fn):
	print(fn):


print_fn("안녕하세요.")


[Out]:
a를 출력합니다.
안녕하세요.

 

4. 파이썬 데코레이터에서 입력 파라미터를 받고 싶다면?

 

데코레이터에서 파라미터를 입력받고 싶다면, 조금 복잡합니다. 함수를 2개로 만들어서 이용합니다. 반환 값인 return을 잘 맞추어서 사용해야 합니다.

 

from functools import wraps


def print_a(file_name):
	def decorate(func):
		@wraps(func)
		def wrapper(*args, **kwargs):
			print(file_name)
			return func(*args, **kwargs)

		return wrapper
	return decorate


@print_a("hahaha")
def print_c():
	print("c")


print_c()


[Out]:
hahaha
c

 

오늘은 이렇게 파이썬 데코레이터 사용 이유와 예제에 대해서 알아보았습니다. wrapper함수 뒤에 코드를 정의하면, 함수 실행을 마치고 반복 실행해야 되는 코드를 작성할 수 있습니다. 데코레이터의 활용범위는 생각보다 넓습니다. 함수별로 필수적으로 실행해야 하는 기능을 한 번에 정의할 수 있어 편리하고, 특히 유지보수 하기에 용이합니다.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기