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는 함수의 키워드 전용 인수를 명시적으로 지원한다.