ROKO

[Python] decorator 본문

Computer Science/Programming Language

[Python] decorator

RO_KO 2023. 3. 4. 01:12
728x90

python logic을 작성하거나 함수를 실행할때 부가적으로 효율성이나 flow가 잘 흐르는지 확인하기 위해 함수내부에 시간을 측정하는 코드를 넣는 등 부가적인 코드를 작성할 수 있다. 그렇다보면 기존 함수의 logic이 복잡해지고 가독성도 떨어지게 되는데 대안법으로 decorator문법을 지원해준다.

def decorator(func):
    def new_func(*args, **kwargs):
        print("데코레이터 적용한 함수")
        result = func(*args, **kwargs)
        return result
    return new_func


@decorator
def add_a_b(a, b):
    return a + b

print(add_a_b(10, 20))
# 데코레이터 적용한 함수
# 30

데코레이터로 사용할 함수를 정의하고 input을 적용할 함수로 받아 함수 실행과 함께 부가적으로 처리할 것들을 구현한다.

사용할 함수위해 @문법을 통해 해당 decorator함수명을 쓰면 끝이다.

 

앞으로 적용된 함수가 실행될때마다 decorator의 코드도 함께 실행되게 될것이다. 코드 구현시 코드의 실행순서를 고려해서 작성하도록 하자.

wraps

from funtools import wraps

def decorator(func):
    @wraps(func)
    def new_func(*args, **kwargs):
        print("데코레이터 적용한 함수")
        result = func(*args, **kwargs)
        return result
    return new_func

주의할 점은 함수 실행을 잘 살펴보면 decorator에서 target function을 새로 생성해서 실행하다보니 원본함수 내부 정보가 훼손될 수 있다. 내부 함수의 정보를 유지하고 싶은 경우 wraps을 이용해 생성할 함수에 decorator를 적용해주면 내부 정보가 보존되어 실행될 수 있다.


뜬금없이 블로그를 쓰다가 궁금한게 생겼는데 input을 함수로 받게 될 경우 call by value 일까 call by reference일까?

python은 객체가 immutable일 경우 value, mutable일 경우는 reference로 부르게 된다. 그럼 질문은 꼬리를 물어 function은 mutable 일까 immutable일까?

 

function도 객체이기 때문에 mutable인지 immutable인지가 궁금하다. 하지만 function을 정의하고 나서 중간에 내부를 변경할수 없기 떄문에 immutable일 것이라고 생각한다. 관련해서 알아보고 post를 작성해보기로 하겠다. 답을 알고 있는분은 답글을 달아주면 좋겠다!!

728x90

'Computer Science > Programming Language' 카테고리의 다른 글

[Python] Comprehension  (0) 2023.03.04
[Python] Error  (0) 2023.03.04
[Python] lambda  (0) 2023.03.04
[Python] function  (0) 2023.03.04
Comments