파이썬(Python)/문법

파이썬에서 @(골뱅이, 데코레이터라고 불림)이란? 사용방법과 예제

끄적끄적아무거나 2021. 4. 22. 19:53
반응형

파이썬 @ (Decorator) 사용예제와 방법

 

#골뱅이 마크 사용 예시
@wraps(f)
@app.route
@login_required
@templated()

 

Python flask를 사용하다 보면 위 코드와 같이 Decorator로 이루어진 구문이 있는데 동작 방식은 알지만 실제 "at" 기호가 앞에 붙을때 어떻게 움직이는지는 잘 몰라 조사하게 되었다. 

 

 


def a_func(b_func):
    print("a_func")
    def c_func():
        print("b_func")
        b_func()
    return c_func

@a_func
def d_func():
    print("d_func")

print("############")
d_func()


>>결과
a_func
############
b_func
d_func

위 코드는 파이썬에서 데코레이터(decorator)를 이용하는 기본 예제이다.

a_func 라는 함수를 정의했는데 중첩함수를 사용하고 있다. 중첩 함수에 대해 알고 싶으면 아래 링크를 참조하길 바란다. 

 

파이썬 함수 안에 중첩(nested)해서 함수 넣기

함수 안에 함수 중첩해서 넣기 예제와 특징 예제1 코드>> def a_func(): def b_func(): print("it's b_func") print("it's a_func") b_func() a_func() # b_func() #주석처리 결과>> it's a_func it's b_func 예제..

scribblinganything.tistory.com

a_func는 인자로 함수를 받고 받은 함수는 내부 c_func 함수에서 실행된다.  그리고 c_func 는 return이 되어 return 받은 값을 실행하기 전까지는 실행이 되지 않는다. 

 

@a_func 의 의미는 그 아래 정의된 함수를 a_func 의 인자값으로 넣겠다는 의미이다. 즉, 여기서는 d_func() 함수가 a_func로 들어간다. @a_func를 실행함으로써 print("a_func")는 먼저 실행되고 c_func는 return 되어서 d_func 를 실행하여야지 실행 된다. 

 

이처럼 어떤 함수를 실행시킬때 반복되는 작업을 데코레이터(골뱅이) 표시를 사용하여 진행 한다. 

 


def a_func(count):
    def b_func(c_func):
        print("{} 번째 카운트입니다".format(count))
        print("b_func")
        def d_func():
            print("d_func")
            c_func()
        return c_func
    return b_func

@a_func(2)
def e_func():
    print("e_func")

print("############")
e_func()

결과>>
2 번째 카운트입니다
b_func
############
e_func

 

위와 같이 데코래이터에 인자 값을 보내서 사용할 수 도 있다. 이때 return 이 2번 사용되었다. 이를 고려해서 코드를 작성해야 한다. 

 

 

 

 

 

반응형