파이썬 데코레이터란? 사용방법은?

2020. 2. 21. 17:00

파이썬 플라스크 패키지를 이용하면 데코레이터를 사용하게 된다. 데코레이터는 우리나라 말로 하면 장식자로 말로, 함수 앞뒤에 반복적으로 실행되는 구문을 넣을 수 있는 방법이다. 반복되는 구문을 한 번에 작성할 수 있기 때문에, 수정사항을 반영하기도 싶고 코드도 깔끔해진다. 오늘은 파이썬 데코레이터란 무엇이고 어떻게 사용하는지에 대해서 알아보도록 하겠다.


파이썬_코딩



1. 데코레이터란 무엇이고, 어떻게 사용해야 하는가?

코딩을 하다보면 함수 안에 함수를 정의하는 경우가 생긴다. 예를 들어 아래와 같은 식으로 함수 안에 함수를 정의할 수 있다.

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. 함수에 입력파라미터가 있다면?

함수에 입력파라미터가 있는 경우에는 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("안녕하세요.")


결과:

a를 출력합니다.

안녕하세요.



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

데코레이터에서 파라미터를 입력받고 싶다면, 조금 복잡한데 함수를 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()


결과:

hahaha

c


기능


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

댓글()