오늘의 파이썬 공부: decorators

오늘은 파이썬의 강력한 기능 중 하나인 ‘decorators’에 대해 알아보겠습니다. ‘decorators’는 함수나 메소드의 동작을 변경하거나 확장할 수 있는 도구로, 코드의 재사용성을 높이고 가독성을 개선하는 데 큰 도움이 됩니다. 특히, 코드의 중복을 줄이면서도 유연하게 기능을 추가할 수 있어 매우 유용합니다. 이 글을 통해 ‘decorators’의 기본 개념을 이해하고, 실용적인 활용 방법을 익혀보세요.

오늘의 파이썬 공부: decorators

decorators 기본 개념 이해하기

‘decorators’의 핵심적인 원리와 개념을 알아봅니다. 이 기능이 어떻게 함수의 동작을 변경하는지 그 원리를 이해하는 것이 중요합니다.

기본 문법 및 구조

‘decorators’는 주로 함수나 메소드의 전후에 실행되는 코드를 정의하는 데 사용됩니다. 기본적으로 ‘@’ 기호를 사용하여 함수 위에 선언합니다.


def my_decorator(func):
    def wrapper():
        print("함수 실행 전")
        func()
        print("함수 실행 후")
    return wrapper

@my_decorator
def say_hello():
    print("안녕하세요!")

say_hello()

위 코드에서 ‘say_hello’ 함수는 ‘my_decorator’로 감싸져, 실행 전후에 메시지를 출력합니다. 이처럼 ‘decorators’는 함수의 전후 행동을 쉽게 추가할 수 있습니다.

 

실용적인 활용 예제

실제 코딩에서 ‘decorators’가 어떻게 활용되는지 다양한 예제를 통해 알아봅니다. 이를 통해 실무에서의 활용도를 높일 수 있습니다.

예제 1

첫 번째 예제로, 함수의 실행 시간을 측정하는 데코레이터를 만들어 보겠습니다.


import time

def timer_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"실행 시간: {end_time - start_time}초")
        return result
    return wrapper

@timer_decorator
def compute_square(numbers):
    return [n ** 2 for n in numbers]

compute_square(range(1, 10001))

이 예제는 함수의 실행 시간을 측정하여 성능을 분석하는 데 유용합니다.

예제 2

두 번째 예제로, 사용자 인증을 위한 데코레이터를 살펴보겠습니다.


def requires_authentication(func):
    def wrapper(user, *args, **kwargs):
        if not user.is_authenticated:
            raise PermissionError("사용자 인증이 필요합니다.")
        return func(user, *args, **kwargs)
    return wrapper

class User:
    def __init__(self, is_authenticated):
        self.is_authenticated = is_authenticated

@requires_authentication
def view_profile(user):
    print("사용자 프로필을 봅니다.")

user = User(is_authenticated=True)
view_profile(user)

이 데코레이터는 사용자 인증 여부를 확인하여, 인증되지 않은 사용자가 함수에 접근하지 못하게 합니다.

 

주의사항 및 팁

‘decorators’를 사용할 때 흔히 하는 실수나 알아두면 좋은 팁들을 알아봅니다. 이를 통해 더 안전하게 코드를 작성할 수 있습니다.

흔히 하는 실수

초보자들이 자주 겪는 실수 중 하나는 데코레이터의 반환값을 올바르게 처리하지 않는 것입니다. 데코레이터는 반드시 내부 함수인 ‘wrapper’를 반환해야 하며, 이 함수는 원래의 함수를 호출해야 합니다.

알아두면 좋은 팁

데코레이터를 사용할 때는 ‘functools.wraps’를 활용하여 원래 함수의 메타데이터를 유지하는 것이 좋습니다. 이렇게 하면 함수의 이름이나 문서화 문자열을 유지할 수 있습니다.


from functools import wraps

def my_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        # 함수 전후에 실행할 코드
        return func(*args, **kwargs)
    return wrapper

 

결론 및 요약

오늘 배운 ‘decorators’의 핵심 내용을 요약하겠습니다. ‘decorators’는 함수의 동작을 유연하게 변경할 수 있는 강력한 도구로, 코드의 재사용성과 가독성을 높이는 데 큰 도움을 줍니다. 직접 코드를 작성해보며, 실무에서 ‘decorators’를 어떻게 활용할 수 있을지 고민해보세요. 성공적인 코딩을 기원합니다!