파이썬의 데코레이터 함수


데코레이터 함수를 사용하면 실제로 구조를 수정하지 않고도 기존 함수를 추가하거나 수정할 수 있습니다.

이것은 데코레이터 함수에 대한 아주 기본적인 설명입니다.

그러나 여기서 질문은 필요에 따라 함수를 변경할 수 있는데 데코레이터 함수를 사용해야 하는 이유는 무엇입니까?

음, 수정하고 싶은 단일 함수가 항상 있는 것은 아닙니다. 요구 사항의 일부로 모든 기능을 특정하게 변경하려는 프로젝트에 많은 기능이 있다고 가정합니다.

이제 모든 기능을 찾아 수정하고 응용 프로그램을 손상시키지 않는지 확인하기 위해 각 기능을 테스트하는 것은 매우 지루할 것입니다.

이를 위해 함수 내부의 코드를 실제로 변경하지 않고 수정할 수 있는 데코레이터 함수가 있습니다. 데코레이터 함수는 많은 사용 사례를 가질 수 있지만 일반적으로 기존 함수 집합을 약간 변경하려는 경우에 사용됩니다.

간단한 예를 살펴보겠습니다.

def deco_func(val):
    def wrapper():
        print("Trigger")
        print(val)
        print("Kill")
        print("------------------------------")
    return wrapper

holder = deco_func("Hello Python")
print(holder)
holder()


산출:

<function deco_func.<locals>.wrapper at 0x7efcdc4e8550>
Trigger
Hello Python
Kill
------------------------------


위의 예는 여기의 함수가 일급 객체로 취급되기 때문에 파이썬에서 가능합니다. 즉, 함수가 매개 변수/인수로 전달되거나 사용될 수 있음을 의미합니다.

다음은 염두에 두어야 할 몇 가지 빠른 지침입니다.
  • 함수는 객체 유형의 인스턴스입니다.
  • 함수는 변수에 저장할 수 있습니다.
  • 함수를 매개변수로 전달할 수 있습니다.
  • 함수는 함수를 반환할 수 있습니다.

  • 이제 위의 코드를 약간 변경해 보겠습니다.

    def deco_func(func):
        def wrapper():
            print("Trigger")
            func()
            print("Kill")
            print("------------------------------")
        return wrapper
    
    def func1():
        print("This is Function 1")
    
    def func2():
        print("This is Function 2")
    
    def func3():
        print("This is Function 3")
    
    func1 = deco_func(func1)
    func2 = deco_func(func2)
    func3 = deco_func(func3)
    print(func1)
    func1()
    func2()
    func3()
    


    산출:

    <function deco_func.<locals>.wrapper at 0x7f6960526820>
    Trigger
    This is Function 1
    Kill
    ------------------------------
    Trigger
    This is Function 2
    Kill
    -----------------------------------
    Trigger
    This is Function 3
    Kill
    -----------------------------------
    


    위의 코드에서 deco_func를 업데이트했으며 이제 함수를 인수로 받아들입니다.
    우리는 또한 문장을 출력하는 세 가지 함수를 만들었습니다.
    이제 라인
    func1 = deco_func(func1)
    func1 매개 변수를 받아들이는 deco_func를 변수 func1에 저장할 수 있습니다. 따라서 이제 func1()을 호출하여 원하는 결과를 얻을 수 있습니다.
    위의 코드를 보면 데코레이터 기능이 배후에서 어떻게 작동하는지 알 수 있습니다.

    따라서 데코레이터 함수를 만들 때마다 이 래퍼 함수/기능을 만들어야 합니다.
    외부 함수는 함수 자체를 인수로 사용하고 내부 래퍼 함수는 수정 중인 실제 함수를 호출합니다.

    다음은 Python의 데코레이터 함수 구문으로서의 위 코드의 예입니다.

    def deco_func(func):
        def wrapper():
            print("Trigger")
            func()
            print("Kill")
            print("------------------------------")
        return wrapper
    @deco_func
    def func1():
        print("This is Function 1")
    @deco_func    
    def func2():
        print("This is Function 2")
    @deco_func    
    def func3():
        print("This is Function 3")
    
    func1()
    func2()
    func3()
    


    자, 이것들은 단지 문장을 출력하는 일종의 멍청한 함수들입니다.
    함수 중 하나에서 하나 이상의 매개변수를 전달해야 하고 일부는 그렇지 않은 경우 어떻게 됩니까? 또는 일부 함수는 값을 반환하고 일부는 반환하지 않습니다.

    다음은 하나 이상의 함수가 전달될 인수/매개변수가 필요하거나 하나 이상의 함수가 호출될 때 일부 값을 다시 반환하는 경우의 예입니다. 데코레이터 함수의 요점은 모든 함수 사용 사례에서 사용할 수 있다는 것이므로 unpack 또는 splat 연산자 즉 * args 및 ** kwargs를 사용합니다.

    def deco_func(func):
        def wrapper(*args, **kwargs):
            print("Trigger")
            res = func(*args, **kwargs)
            print("Kill")
            print("------------------------------")
            return res
        return wrapper
    @deco_func
    def func1(val):
        print("This is Function 1")
        print("Function 1 value: ", val)
    @deco_func    
    def func2(val1, val2):
        print("This is Function 2")
        return val1 + val2
    @deco_func    
    def func3():
        print("This is Function 3")
    
    func1(20)
    result2 = func2(45, 40)
    func3()
    print("Function 2 sum value: ", result2)
    


    산출:

    Trigger
    This is Function 1
    Function 1 value:  20
    Kill
    -----------------------------------
    Trigger
    This is Function 2
    Kill
    -----------------------------------
    Trigger
    This is Function 3
    Kill
    -----------------------------------
    Function 2 sum value:  85
    


    보시다시피 splat 연산자는 데코레이터 함수가 매개변수를 허용하지 않거나 임의의 수를 허용하도록 돕고 res 변수는 목적에 맞게 데코레이트된 함수의 반환 값을 저장합니다.

    이것이 데코레이터 기능에 관한 전부입니다. 한 번에 읽기에는 너무 많다는 것을 알고 있지만 Python 콘솔이나 jupyter 노트북을 열고 코드 스니펫의 각 줄을 따라가 기능을 이해하는 것이 좋습니다. 그러면 쉽게 이해할 수 있을 것입니다!

    좋은 웹페이지 즐겨찾기