문제
함수에 인자가 너무 많을 때, 특정 파라미터를 고정하고 함수를 실행시켜야 할 때.
해결
functions의 partial()를 써보자.
정의된 함수에 인자를 고정한 새로운 함수를 선언하는 방법이다.
코드
Source
partial 함수는 사용자가 정의한 인자들을 미리 받아놓는다
newfunc가 선언될 때 *fargs와 **newkeywords가 override되어 newfunc를 반환한다.
이때 newfunc는 callable한 객체를 리턴한다.
def partial(func, /, *args, **keywords): # *args, **keywords: 미리 설정해 놓는 파라미터
def newfunc(*fargs, **fkeywords): # *fargs, **fkeywords: 나중에 설정할 파라미터
# 미리 설정해 놓은 파라미터와 나중에 설정할 파라미터를 합침
# fkeywords가 keywords를 override함
newkeywords = {**keywords, **fkeywords}
return func(*args, *fargs, **newkeywords) # 합친 파라미터를 함수에 적용
newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc
https://docs.python.org/3/library/functools.html#partial-objects
Example
두 점 사이의 거리를 구하는 함수에서 하나의 좌표를 고정하고 계산하고 싶다면 partial을 쓰면 좋다.
위 소스 코드에서 구현한대로의 결과를 참고하자.
from functools import partial
points = [ (1, 2), (3, 4), (5, 6), (7, 7) ]
import math
def distance(p1, p2):
x1, y1 = p1
x2, y2 = p2
return math.hypot(x2 - x1, y2 - y1)
pt = (4,3) # 미리 설정한 파라미터
partial_func = partial(distance, pt)
print(partial_func.func) # <function distance at 0x000001456F7AF6A0>
print(partial_func.args) # ((4, 3),)
print(partial_func.keywords) # {}
# (4,3)과 (1,1) 좌표의 거리를 계산하여 리턴
print(partial_func((1,1))) # 3.605551275463989
뭐가 좋은가?
위 문제를 추상화시켜보면, 사용자가 만든 함수에 인자를 고정하는 모든 상황에서 쓸 수가 있다.
1. 개발 환경 (test, dev, prod)별로 로그를 분리하여 찍고 싶을 때
2. 특정한 Test Case에서 고정된 파라미터에 따른 여러가지 결과를 테스트할 때
출처: Beazley, D., & Jones, B. K. (2013). *Python cookbook* (3rd ed., pp. 227–230). O’Reilly Media.
'Development > Python-Cookbook' 카테고리의 다른 글
| 8.3 객체의 컨텍스트 관리 프로토콜 지원 (1) | 2025.03.29 |
|---|---|
| 8.7 부모 클래스의 메소드 호출 (0) | 2025.02.16 |