partial application은 함수에 요구되는 인자의 일부만 평가한 함수 객체를 생성하기 위하여 사용하는 프로그래밍 기법이다. 파이썬에서는 functools.partial 을 이용해서 사용하게 된다.
partial 함수
함수를 만들어 넘길때 자주사용 (첫번째 인자로 받은 함수의 인자들을 나머지 인자들로 바꾼 후 새 함수를 돌려줌)
def print_characters(char, repeat):
print(char * repeat)
print_characters('*', 10)
import functools
print_characters_20_times = functools.partial(print_characters, repeat=20)
print_characters_20_times('*')
----------------------------------------------
from functools import partial
def add(a, b):
"""Add a to b"""
return a + b
add_one = partial(add, 1)
add_one(12)
>>> 13
lambda보다 더 많이 쓰임
lambda 와의 차이점?
lambda는 연산이 모두 끝난 후에 코드가 생성(마지막으로 덮어씌워진 값으로 기억된 값이 불러나와지기 때문)
lambda arguments: expression
partial은 이와 달리 생성과 동시에 코드가 생성되어 값이 기억
##### def 이용 #####
def add(a,b):
return a+b
def base5(n):
return add(5,n)
print(base5(3))
# add함수의 일부 인자를 base5함수의 선언과함께 기억한다. 따라서 base5는 클로저이다.
##### lambda 이용 #####
def add(a,b):
return a+b
base5 = lambda n: add(5,n) # add 함수의 일부 인자를 생성과함께 기억한다. 따라서 base5는 클로저이다.
print(base5)
print(base5(3))
##### partial 이용 #####
from functools import partial
base5 = partial(add, 5)
##### partial을 만들어보자 #####
def make_closure(function, *args):
def closure(*args_):
return function(*args,*args_)
return closure
# *args가 먼저 입력해서 기억시키는 값이고
# *args_는 나중에 클로저를 실행할때 입력될 값이다.
base5 = make_closure(add,5) #base5는 고차함수 make_closure가 생성한 클로저이다.
print(base5(3))
Decorator와 partial의 차이점은?
decorator를 만들땐 함수만을 인자로 받지만 partial을 만들땐 함수외에도 함수에 기억시킬 값을 함께 인자로 받는다는 것