SW개발/Python

[Python]partial 란? (feat. functools)

partial() 란?

positional parameter인 args와 keyword parameter인 keywords로 호출된 함수처럼 동작하는 새 partial 객체를 반환하는 역할을 합니다.

쉽게 말하자면 함수 인자의 값이 미리 채워진 상태로 동작하는 함수(partial 객체)가 반환되는 것입니다.

 

partial 파이썬 공식 Document

 

functools — 고차 함수와 콜러블 객체에 대한 연산 — Python 3.10.8 문서

functools — 고차 함수와 콜러블 객체에 대한 연산 소스 코드: Lib/functools.py functools 모듈은 고차 함수를 위한 것입니다: 다른 함수에 작용하거나 다른 함수를 반환하는 함수. 일반적으로, 모든 콜러

docs.python.org

 

언제 사용하나요?

함수를 호출할 때의 인수가 이미 채워진 채로 동작하는 새로운 함수를 만들 때 유용합니다. 예시와 함께 설명하겠습니다.

# 1~4 까지의 곱셈을 위한 코드
def mul(*args):
    result = 1
    for i in args:
        result = result * x
        
	return result
    
add(1, 2, 3, 4)

# 그러나 100을 기준으로 곱하고 싶다면?
def mul_by_100(*args):
    result = 100
    for i in args:
        result = result * x
        
	return result
    
mul_by_100(100, 1, 2, 3, 4)

# 이번에는 200을 기준으로 더하고 싶다면?
# 반복적으로 이어지는 함수 작성..

위와 같은 상황에서 기준값이 변경이 될 때마다 함수를 계속 만드는 것은 굉장히 비효율적이며 보기에도 좋지 않습니다.

이럴때 partial가 위력을 발휘합니다.

# 1~4 까지의 곱셈을 위한 코드
def mul(*args):
    result = 1
    for i in args:
        result = result * x
        
	return result
    
add(1, 2, 3, 4)

# 그러나 100을 기준으로 곱하고 싶다면?
# partial 함수 이용
mul_by_100 = partial(mul, 100)

mul_by_100(2, 3) -> 600

# 200을 기준으로 곱하고 싶다면?
mul_by_200 = partial(mul, 200)

이처럼 partial를 이용하면 반복되는 코드 작성을 줄일 수 있습니다. 내부적으로는 100 이라는 인자값이 이미 전달된 상태의 함수가 mul_by_100 변수에 할당되어 있습니다.

 

라이브러리 내부에서는 많이 사용되는 모습을 보았지만, 비즈니스 로직이 담긴 서비스에서는 사용 되어지는 것을 많이 보지는 못한 것 같습니다. 저도 최근에 알게된 내용인지라 특정한 상황에서 partial 사용을 고려해볼 것 같고, 추후에 실제로 사용하면서 어떠한지에 대해서도 다뤄보도록 하겠습니다.

 

읽어주셔서 감사합니다 :)

 

 

 

728x90