이번 포스트에서는 functools 모듈의 partial 함수에 대해 짧고 굵게 집고 넘어 가도록 한다. 날씨가 많이 더워졌다. 다들 건강 관리 잘 하도록하자. 프로그래머는 지식 노동자가 아니다. 오래동안 고도의 집중력을 유지 할 수 있는 체력이 중요한 육체 노동자다.
partial 함수란?
functools.partial(func, /, *args, **keywords)
partial 함수는 호출 될 때 positional argument(위치 기반 인자) args와 keyword argument(키워드 인자) keywords로 호출 된 함수 func처럼 동작하는 새 partial 객체를 반환한다.
※ positional argument, keyword argument, 함수 인자 리스트 사이에 있는 '/' 기호에 대해 궁금하신 분은 [여기]를 참고 하자.
쉽게 말해서, 기존 함수와 구현은 동일지만 파라미터를 미리 정해준 또 다른 함수를 생성하여 리턴한다는 말이다.
기존 함수와 동일하지만 파라미터를 미리 정해준 또 다른 함수
사용 예
아래 예를 보자.
from functools import partial
def foo(x, y, z):
print(f'x:{x}, y:{y}, z:{z}')
foo1 = partial(foo, 1)
foo2 = partial(foo, 1, 2)
foo3 = partial(foo, 1, 2, 3)
foo1(2,3) # x:1, y:2, z:3
foo2(3) # x:1, y:2, z:3
foo3() # x:1, y:2, z:3
세개의 파라미터를 받는 foo 함수를 partial을 이용해 미리 파라미터를 정해주고, partial 에서 리턴된 함수를 호출 할 때 나머지 파라미터들을 넘겨주고 있다.
foo1 부터 3까지 호출 시 인자들은 다르지만, 미리 지정되어 있던 파라미터를 이용하기에 모두 같은 결과를 출력한다.
위에서는 단순히 위치 기반 인자들을 이용해 앞에있는 인자들만 미리 지정했지만, 키워드 파라미터로 순서와 상관 없이 파라미터를 미리 지정하는 것도 가능하다.
from functools import partial
def foo(x, y, z):
print(f'x:{x}, y:{y}, z:{z}')
fooz = partial(foo, z=3)
fooz(1, 2)
마치며
이상 미리 파라미터를 지정한 함수를 리턴하는 partial에 대해 알아 보았다. partial은 나중에 나올 "인자가 여러개인 함수를 한번 호출하는 대신, 인자들을 여러개로 쪼개어 연속으로 호출 하는 기법"인 커링(Currying)을 구현할 때 유용하게 사용되므로 잘 숙지하길 바란다.