Python

함수의 인자를 특정 값으로 고정하기 - functools.partial

둔진 2020. 5. 12. 02:55

  일반적으로 쓸 일이 많지는 않지만, 함수를 higher-order function 형태 (lambda, decorator 등 함수 자체를 하나의 객체로 취급하는 경우)로 쓰다 보면, 기존 함수를 재활용하는 경우가 왕왕 있습니다. 한 가지 예는 기존 함수의 특정 인자를 특정값으로 고정시키는 경우죠.

  예를 들어, 아래와 같은 코드를 보겠습니다.

def print_characters(char, repeat):
    print(char * repeat)
    
print_characters('*', 10)
**********

  별을 10개가 아니라 20개를 출력하고 싶다면?

print_characters('*', 20)

  그런데 왜인지 무조건 별을 20개 출력하는 함수를 만들고 싶어졌습니다.

def print_characters_20_times(char):
    print(char * 20)
    
print_characters_20_times('*')

  이렇게 함수를 새로 만들 수도 있습니다.

  또 다른 방법으로 functools.partial 을 이용해서 기존 함수를 재활용할 수도 있습니다.

import functools

print_characters_20_times = functools.partial(print_characters, repeat=20)

print_characters_20_times('*')

  이렇게요. functiools.partial은 첫 번째 인자로 받은 함수의 인자들을 나머지 인자들로 바꾼 후 새 함수를 돌려줍니다.

  higher-order function을 다룰 때마다 이런 느낌입니다. 인자의 인자의 인자의, 함수의 인자인 함수의 인자인 함수의....

 

  일반적인 경우에 쓸 일이 많지는 않겠지만, 기존 함수를 재활용해서 마치 새 함수인척(?) 할 때 유용합니다.