[파이썬] 데코레이터(코드 재사용 함수 감싸기)

반응형
    반응형

    파이썬의 강력한 도구 데코레이터

    파이썬은 다양한 프로그래밍 기술을 지원하는 다재다능한 언어입니다. 그 중에서도 파이썬의 데코레이터는 코드 재사용과 함수 감싸기를 간편하게 해주는 강력한 도구입니다.

    데코레이터란?

    데코레이터는 함수나 메서드의 동작을 변경하거나 확장하기 위해 사용되는 파이썬 함수입니다. 데코레이터를 사용하면 함수의 코드를 수정하지 않고도 함수의 동작을 변경할 수 있습니다. 이는 코드의 재사용성을 높이고, 가독성을 향상시키는 데 큰 도움이 됩니다. @ 기호를 사용하여 함수 위에 표시됩니다.

    def my_decorator(func):
        def wrapper():
            print("Something is happening before the function is called.")
            func()
            print("Something is happening after the function is called.")
        return wrapper
    
    @my_decorator
    def say_hello():
        print("Hello!")
    
    say_hello()

    위 예제를 보면 my_decorator 함수는 say_hello 함수를 감싸고 함수 호출 전후에 추가 작업을 수행합니다.

    데코레이터의 실제 활용 사례

    데코레이터는 다양한 실제 활용 사례를 갖고 있습니다. 몇 가지 예를 살펴보겠습니다.

    로깅

    데코레이터를 사용하여 함수 호출과 그 결과를 로그에 기록할 수 있습니다. 이를 통해 디버깅 및 모니터링이 쉬워집니다.

    def log_function_call(func):
        def wrapper(*args, **kwargs):
            print(f"Calling {func.__name__} with arguments {args}, {kwargs}")
            result = func(*args, **kwargs)
            print(f"{func.__name__} returned {result}")
    
        return wrapper
    
    @log_function_call
    def add(a, b):
        return a + b
    
    add(2, 3)

    권한 검사

    데코레이터를 사용하여 함수가 호출되기 전에 사용자의 권한을 확인할 수 있습니다. 권한에 대한 경우가 많아서 예시만 썼습니다. 로직이 확정되면 해당 곳에 넣어서 써보면 데코레이터가 어떻게 움직이는지 알 수 있을겁니다.

    def check_permission(permission):
        def decorator(func):
            def wrapper(*args, **kwargs):
                if has_permission(permission): # 권한 확인로직
                    return func(*args, **kwargs)
                else:
                    raise PermissionError("You do not have permission to access this resource.")
            return wrapper
        return decorator
    
    @check_permission("admin")
    def delete_user(user_id):
        # 사용자 삭제 로직
        pass

    성능 측정

    데코레이터를 사용하여 함수의 실행 시간을 측정할 수 있습니다. 사실 시간측정하는 함수는 따로 있지만 데코레이터로 하면 커스텀마이징이 가능합니다.

    import time
    
    # 실행 시간을 측정할 함수
    def my_function():
        # 어떤 작업을 수행하는 코드
        total = 0
        for i in range(1, 1000000):
            total += i
        return total
    
    # 함수 실행 시간을 측정하는 데코레이터
    def measure_time(func):
        def wrapper(*args, **kwargs):
            start_time = time.time()  # 함수 시작 시간 기록
            result = func(*args, **kwargs)  # 함수 실행
            end_time = time.time()  # 함수 종료 시간 기록
            execution_time = end_time - start_time  # 실행 시간 계산
            print(f"{func.__name__} 실행 시간: {execution_time:.4f} 초")
            return result
        return wrapper
    
    # 데코레이터를 함수에 적용하여 실행 시간 측정
    @measure_time
    def main():
        result = my_function()
        print(f"결과: {result}")
    
    if __name__ == "__main__":
        main()

    결론

    파이썬 데코레이터의 가장 큰 장점은 코드를 간결하게 유지하면서도 다양한 기능을 추가하고 확장한다는 것입니다. 이를 통해 코드의 가독성을 향상시키고 유지 관리를 더 쉽게 할 수 있습니다.

    댓글

    Designed by JB FACTORY

    ....