functools — 고차 함수와 호출 가능 객체에 대한 연산
functools — 고차 함수와 호출 가능 객체에 대한 연산
functools 모듈은 고차 함수, 즉 다른 함수에 작용하거나 다른 함수를 반환하는 함수를 위한 모듈입니다. 일반적으로 이 모듈의 목적에서는 모든 호출 가능 객체를 함수로 취급할 수 있습니다.
본문
functools 모듈은 다음 함수들을 정의합니다.
@functools.cache(user_function) — 단순하고 가벼우며 무한한 함수 캐시입니다. "메모이제이션(memoize)"이라고도 합니다. 함수의 인자에 대한 반환 값을 캐시하므로 같은 인자로 다시 호출하면 재계산 없이 캐시된 값을 반환합니다. 불순 함수(예: time()나 random())나 호출마다 서로 다른 가변 객체를 반환하는 함수(제너레이터·비동기 함수)에는 사용하지 말아야 합니다.
@functools.cached_property(func) — 클래스의 메서드를, 값을 한 번 계산한 뒤 인스턴스의 수명 동안 일반 속성으로 캐시하는 프로퍼티로 변환합니다.
functools.cmp_to_key(func) — 구식 비교 함수를 키 함수로 변환합니다. sorted(), min(), max(), heapq.nlargest(), heapq.nsmallest(), itertools.groupby() 같은 키 함수를 받는 도구와 함께 사용합니다. 주로 비교 함수 사용을 지원했던 Python 2에서 변환되는 프로그램을 위한 전환 도구로 사용됩니다.
functools.lru_cache(maxsize=128, typed=False) — 최근에 사용된(least-recently-used) 캐시 데코레이터입니다. 같은 인자로 함수가 주기적으로 호출되는 상황에서 반복 계산을 줄입니다. 캐시 효과를 측정하고 maxsize를 조정하도록 cache_info() 함수를 제공하며, 캐시를 지우는 cache_clear(), 원본 함수에 접근하는 __wrapped__ 속성, 캐시 매개변수를 보여주는 cache_parameters()도 제공합니다.
예:
@lru_cache(maxsize=32)
def get_pep(num):
'Retrieve text of a Python Enhancement Proposal'
resource = f'https://peps.python.org/pep-{num:04d}'
...
functools.partial(func, /, *args, **keywords) — 호출될 때 func가 위치 인자 args와 키워드 인자 keywords로 호출된 것처럼 동작하는 새 partial 객체를 반환합니다. partial()은 함수 인자와/또는 키워드의 일부를 "고정(freeze)"하여 단순화된 시그니처를 가진 새 객체를 만드는 부분 함수 적용에 사용됩니다. 예를 들어 base 인자의 기본값이 2인 int()처럼 동작하는 호출 가능 객체를 만들 수 있습니다.
partial()은 함수의 "부분 적용"에 사용됩니다. 호출에 추가 인자가 주어지면 args에 추가되고, 추가 키워드 인자가 주어지면 keywords를 확장·덮어씁니다. Roughly 다음과 동등합니다:
def partial(func, /, *args, **keywords):
def newfunc(*more_args, **more_keywords):
return func(*args, *more_args, **(keywords | more_keywords))
newfunc.func = func
newfunc.args = args
...
3.14에서 위치 인자의 Placeholder 지원이 추가되었습니다.
class functools.partialmethod(func, /, *args, **keywords) — partial처럼 동작하되 메서드 정의로 사용되도록 설계된 새 partialmethod 디스크립터를 반환합니다. func는 디스크립터 또는 호출 가능해야 합니다.
@functools.singledispatch — 함수를 단일 디스패치(single-dispatch) 제네릭 함수로 변환합니다. 첫 번째 인자의 타입에 따라 디스패치하며, register() 속성으로 특정 타입에 대한 구현을 등록할 수 있습니다. 추상 기본 클래스에 구현을 등록하면 그 기본 클래스의 가상 서브클래스도 해당 구현으로 디스패치됩니다. 어떤 타입에 대해 어떤 구현이 선택될지 dispatch() 속성으로 확인할 수 있습니다.
class functools.singledispatchmethod(func) — 메서드를 단일 디스패치 제네릭 함수로 변환합니다. @classmethod 같은 다른 데코레이터와 중첩을 지원합니다.
functools.update_wrapper(wrapper, wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES) — wrapper 함수가 wrapped 함수처럼 보이도록 업데이트합니다. WRAPPER_ASSIGNMENTS는 __name__, __module__, __qualname__, __doc__(문서 문자열) 등을 할당하고, WRAPPER_UPDATES는 wrapper 함수의 __dict__를 업데이트합니다. 주 용도는 데코레이터 함수에서 장식된 함수를 감싸는 래퍼를 반환할 때 입니다.
@functools.wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES) — 래퍼 함수를 정의할 때 update_wrapper()를 함수 데코레이터로 호출하는 편의 함수입니다. partial(update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated)와 동등합니다.
partial 객체
partial()이 만든 partial 객체는 세 개의 읽기 전용 속성을 가집니다:
partial.func— 호출 가능한 객체 또는 함수. partial 객체에 대한 호출은 새 인자와 키워드로func에 전달됩니다.partial.args— partial 객체 호출에 제공된 위치 인자 앞에 붙는 가장 왼쪽 위치 인자.partial.keywords— partial 객체가 호출될 때 제공될 키워드 인자.