본문 바로가기
카테고리 없음

[창시모] Functools 의 Partial 이란?

by beeny-ds 2022. 6. 21.

출처: hamait 님의 tistory

모든 창작의 시작은 모방(a.k.a 창시모)
원본 글은 여기( link )를 참고하길 바란다.

functools.partial 설명

  • 하나 이상의 인수가 이미 채워진 함수의 새 버전을 만들기 위해 사용된다.
  • 함수의 새 버전은 그 자체를 기술 하고 있다.

 

Example

첫째, 지수를 명시적으로 수행하는 함수를 만든다고 하자. (파이썬의 내장된 pow () 함수와 비슷하다)
def power(base, exponent):
    return base ** exponent

 

이제 정해진 지수 2와 3을 갖는 전용 사각형 및 큐브 함수를 원한다면 어떻게 될까?
이때 우리는 다음과 같이 할 수 있을 것이다.
def square(base):
    return power(base, 2)

def cube(base):
    return power(base, 3)

 

이 방법이 나름 효과적이지만 power() 함수의 변형을 15 개 또는 20 개 만들려면 어떻게 해야 할까? 1000개는? 그렇게 많은 반복적인 코드를 작성하는 것은 말할 필요도 없이 짜증나는 일이다. 이런 일을 해야할때 partials를 사용한다.

사각형과 큐브 함수를 다시 작성해 보자.
from functools import partial

square = partial(power, exponent=2)
cube = partial(power, exponent=3)

def test_partials():
    assert square(2) == 4
    assert cube(2) == 8

 

이 부분함수에 대한 속성은 아래와 같이 기술 할 수 있다.
def test_partial_docs():
    assert square.keywords == {"exponent": 2}
    assert square.func == power

    assert cube.keywords == {"exponent": 3}
    assert cube.func == power

 

assert 란?

1) python assert 설명

예외를 발생시키는 예외처리랑 비슷하지만, 예외처리는 에러가 발생했을때 어떤 처리를 하기위한 코드이고, 이 assert (가정 설정문)은 어떤 조건이 True임을 보증하기 위해서 사용하는 것 입니다.

오류를 발생시키는 raise와 비슷하지만 다릅니다. raise에 대한 자세한 설명이 필요하다면 [바로가기]

raise는 만약에 오류가 발생했을때 "except 와 함께 이렇게 처리해라" 는 뜻이고

assert는 이 조건이 참일때 코드는 내가 보장한다. 이 조건은 올바르다!
하지만 이 조건이 거짓이라는 것은 내가 보증하지 않은 동작이다. 그러니 AssertionError를 발생해라.

이런 식의 흐름입니다.

2. assert 예제 

a = 10

# True 인경우
print("1. assert True 인 경우")
assert a == 10, "a is not 10" 

print("끝1")


# Fasle 인 경우
print("2. assert False 인 경우")
assert a == 999, "a is not 999"

print("끝2")

 

 

예제 결과를 보면 assert가 True인 경우에는 스무스 하게 코드가 지나가고 "끝1"도 잘 나오는 것을 볼 수 있습니다.

assert a == 999, "a is not 999" 해당 코드에서는 a가 10이므로 a == 999 라는 조건이 맞지 않습니다.
assert의 조건이 False가 되었으므로 "a is not 999"라는 메시지와 함께 AssertionError가 나오는 것을 볼 수 있습니다.

출처: https://blockdmask.tistory.com/553

반응형

댓글