본문 바로가기
프로그래밍언어/파이썬[중급]

[파이썬][중급] Chapter33. functools 주요 기능 살펴보기

by about_IT 2025. 5. 24.
728x90

functools는 함수형 프로그래밍을 돕기 위한 표준 라이브러리 모듈로, 데코레이터, 메모이제이션, 부분 적용 등 다양한 기능을 제공합니다. 이 장에서는 실무에서 자주 활용되는 functools의 대표 기능들을 정리합니다.

 

● lru_cache로 결과 캐싱하기

lru_cache는 함수의 실행 결과를 캐시하여 동일한 인자로 호출될 때 빠르게 결과를 반환합니다.

from functools import lru_cache

@lru_cache(maxsize=128)
def fib(n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)

print(fib(30))  # 매우 빠르게 계산

maxsize는 캐시 가능한 최대 항목 수를 지정하며, None으로 설정하면 무한 캐시입니다.

 

● partial로 인자 고정 함수 만들기

from functools import partial

def multiply(x, y):
    return x * y

double = partial(multiply, 2)
print(double(5))  # 10

partial을 사용하면 기본 인자를 고정한 새로운 함수를 만들 수 있습니다.

 

● cmp_to_key로 커스텀 정렬하기

기존의 cmp 스타일 비교 함수를 key 함수로 변환할 때 사용합니다.

from functools import cmp_to_key

def compare(a, b):
    return a - b

sorted_list = sorted([3, 1, 2], key=cmp_to_key(compare))
print(sorted_list)  # [1, 2, 3]

 

● total_ordering으로 비교 연산 자동화

total_ordering을 사용하면 __eq__와 하나의 비교 연산자만 정의해도 나머지 비교 메서드가 자동 생성됩니다.

from functools import total_ordering

@total_ordering
class Person:
    def __init__(self, age):
        self.age = age

    def __eq__(self, other):
        return self.age == other.age

    def __lt__(self, other):
        return self.age < other.age

이제 Person 객체는 <, <=, >, >= 등 비교 연산자를 사용할 수 있게 됩니다.

 

● wraps로 데코레이터 메타데이터 유지

from functools import wraps

def decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper

@wraps를 사용하면 원래 함수의 이름, docstring, 모듈 정보를 유지할 수 있어 디버깅이 용이합니다.

 

● 마무리

functools는 간결하고 효율적인 함수형 스타일의 프로그래밍을 도와줍니다. 특히 데코레이터와 캐싱 기능은 실무에서도 자주 쓰이는 기능이므로 꼭 익혀두어야 할 필수 도구입니다.

728x90