파이썬 클로저와 파라미터 없는 데코레이터

클로저 함수 개념

클로저는 다음 두 가지 조건을 만족하는 함수입니다:

  • 함수 내부에 정의된 내부 함수
  • 내부 함수가 외부 함수의 변수를 참조함
def outer_function(username):
    def inner_function():
        print(username)
    return inner_function

closure = outer_function('example_user')
closure()  # example_user 출력

클로저의 실제 활용 예시

웹 페이지 데이터를 반복적으로 가져오는 상황에서 클로저를 사용하면 효율적입니다.

import requests

def create_fetcher(url):
    def fetch_page():
        response = requests.get(url)
        return response.text
    return fetch_page

# 특정 URL에 대한 데이터 가져오기 함수 생성
python_org_fetcher = create_fetcher('https://www.python.org')

# 동일한 페이지를 여러 번 요청
print(python_org_fetcher())
print(python_org_fetcher())

데코레이터 이해하기

데코레이터는 클로저, 함수 객체, 중첩 구조의 개념을 결합한 것으로, 원본 함수의 호출 방식이나 내부 코드를 변경하지 않고 새로운 기능을 추가할 수 있습니다.

데코레이터 구현 과정

import time

# 기본 함수 정의
def target_function(x, y, z):
    time.sleep(2)
    print(f'실행: {x}, {y}, {z}')

# 데코레이터 함수 생성
def timing_decorator(original_func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = original_func(*args, **kwargs)
        end_time = time.time()
        print(f'실행 시간: {end_time - start_time}초')
        return result
    return wrapper

# 함수에 데코레이터 적용
target_function = timing_decorator(target_function)
target_function(10, 20, 30)

데코레이터 개선 버전

import time

def home_function():
    time.sleep(2)
    print('home 함수 실행')
    return 'home 함수 결과값'

def execution_timer(func):
    def timer_wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f'실행 소요 시간: {end - start}초')
        return result
    return timer_wrapper

# 데코레이터 적용
decorated_home = execution_timer(home_function)
result = decorated_home()
print(result)

표준 데코레이터 템플릿

from functools import wraps

def standard_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print('함수 실행 전 작업')
        result = func(*args, **kwargs)
        print('함수 실행 후 작업')
        return result
    return wrapper

데코레이터 문법 설탕 사용

import time

@standard_decorator
def sample_function():
    '''샘플 함수입니다.'''
    time.sleep(1)
    print('샘플 함수 실행')
    return '결과값'

sample_function()

반환값 처리

def calculate_sum(a, b):
    total = a + b
    return total

result = calculate_sum(5, 3)
print(result)  # 8 출력

태그: python Closure decorator Functional Programming

8월 22일 17:51에 게시됨