BATTER WAY 21. 키워드 전용 인수로 명료성을 강요하자.

def safe_division(number, divisor, *,
    ignore_overflow=False, ignore_zero_division=False):
  try:
    return number / divisor
  except OverflowError:
    if ignore_overflow:
      return 0
    else:
      raise
  except ZeroDivisionError:
    if ignore_zero_division:
      return float('inf')
    else:
      raise
  • 함수는 아래와 같은 방법으로 사용될 수 있다.
result = safe_division(1, 10**500, True, False)
print(result)

result = safe_division(1, 0, False, True)
print(result)
  • 문제는 두 인수의 위치를 혼동하기 쉽기 때문에 찾기 어려운 버그가 발생할 수 있다.
  • 따라서, 키워드 인수를 이용하여 매우 주의 깊고 항상 예외를 발생하도록 만들어 줄 수 있다.
ult = safe_division(1, 10**500, ignore_overflow=True)
print(result)


result = safe_division(1, 0, ignore_zero_division=True)
print(result)
  • 호출하는 쪽에서, 특정 키워드 인수로 특정 연산에는 기본 값을 덮어쓰고 무시할 플래그를 지정할 할 수 있다.

  • 하지만 이러한 키워드 인수는 선택적인 동작이라서 함수를 호출하는 쪽에 키워드 인수로 의도를 명확하게 드러내라고 강요할 방법이 없다는 점이다.

  • 이러한 복잡한 함수를 작성할 때에는 호출하는 쪽에서 의도를 명확히 드러내도록 요구하는 것이 낫다.

  • 파이썬3 에서는 키워드 전용 인수로 함수를 정의해서 의도를 명확히 드러내도록 요구할 수 있다.


def safe_division(number, divisor, *,
    ignore_overflow=False, ignore_zero_division=False):
  try:
    return number / divisor
  except OverflowError:
    if ignore_overflow:
      return 0
    else:
      raise
  except ZeroDivisionError:
    if ignore_zero_division:
      return float('inf')
    else:
      raise
  • 키워드 인수가 아닌, 위치 인수를 사용하는 함수 호출은 더 이상 동작하지 않는다.
result = safe_division(1, 10**500, True, False) # 에러 발생
  • 키워드 인수와 그 기본 값은 의도한 대로 동작한다.
safe_devision(1, 0, ignore_zero_division=True) # 정상 동작

핵심 정리

  • 키워드 인수는 함수 호출의 의도를 더 명확하게 해준다.
  • 특히 불 플래그를 여러 개 받는 함수처럼 헷갈리기 쉬운 함수를 호출할 때, 키워드 인수를 넘기게 하려면 키워드 전용 인수를 사용하자.
  • 파이썬 3는 함수의 키워드 전용 인수를 명시적으로 지원한다.

참고 문헌

>> Home