partial 함수는 Python의 표준 라이브러리 (functools 모듈)에 Python 2.5부터 도입되었으며, 커링 패턴과 함수에 대한 인자의 부분 적용을 구현하기 위해 만들어졌습니다. partialmethod는 Python 3.4부터 클래스 메서드에 유사한 적용을 위해 도입되었습니다.
실제 프로젝트에서는 종종 함수의 일부 인자를 고정하여 "기억된" 값을 가진 새로운 함수를 생성해야 하는 요구가 발생합니다. 이는 콜백, 인자 전달 템플릿 또는 코드 가독성을 높이기 위해 유용하며, 특히 함수형 프로그래밍이나 특정 스타일의 함수를 기대하는 API를 사용할 때 그렇습니다.
partial 함수는 전달된 인자 중 일부가 "고정"된 새로운 함수 객체를 반환합니다. partialmethod는 클래스 메서드에 대해서도 동일한 접근 방식을 구현하며, self/cls 전달 메커니즘을 올바르게 지원합니다.
코드 예:
from functools import partial, partialmethod def power(base, exponent): return base ** exponent # 지수를 2로 고정 square = partial(power, exponent=2) print(square(5)) # 25 class Math: def power(self, base, exponent): return base ** exponent square = partialmethod(power, exponent=2) m = Math() print(m.square(5)) # 25
주요 특징:
partial을 사용하여 클래스 메서드에 대해 partialmethod의 유사한 기능을 얻을 수 있나요?
아니요, partial은 self/cls를 올바르게 처리하지 않으므로 클래스 메서드에 적용할 경우 예상되는 대로 작동하지 않습니다: self가 자동으로 제공되지 않습니다.
class C: def m(self, x, y): return x + y wrong = partial(m, y=2) # 잘못됨!
c.wrong(5) 호출 시 TypeError가 발생하는 이유는 self가 자동으로 전달되지 않기 때문입니다.
partial을 통해 생성된 객체는 함수인가요?
네, partial의 결과는 함수처럼 행동하는 객체로, 호출, 이름, 도큐먼트 문자열 등을 지원하지만, 일반 함수는 아니며, call 프로토콜을 구현하는 partial 클래스의 객체입니다.
from functools import partial f = partial(pow, 2) print(type(f)) # <class 'functools.partial'>
partial은 함수의 기본 인자와 함께 작동하나요?
네, partial은 내부 함수의 기본값을 "재작성"할 수 있습니다; partial에 전달된 인자는 기본값보다 우선합니다. 그러나 값을 중복 전달하면 오류가 발생하는 것이 중요합니다.
개발자가 메서드 클래스에 partial 대신 partialmethod를 적용:
class MyClass: def f(self, x, y): ... squared = partial(f, y=2) ... obj = MyClass() obj.squared(5) # TypeError: missing 1 required positional argument: 'self'
장점:
단점:
대신 partialmethod를 사용:
from functools import partialmethod class MyClass: def f(self, x, y): return x + y squared = partialmethod(f, y=2) obj = MyClass() print(obj.squared(5)) # 7
장점:
단점: