예시) 나눗셈 함수에서 ZeroDivisionError
예외를 무시하고 무한대를 반환하고 싶거나, OverflowError
예외를 무시하고 대신 0을 반환하고 싶음
def safe_division(number, divisor,
ignore_overflow,
ignore_zero_division):
try:
return number / divisor
except OverflowError:
if ignore_overflow:
return 0
else:
raise
except ZeroDivisionError:
if ignore_zero_division:
return float('inf')
else:
raise
# float 나눗셈의 오버플로우를 무시하고 0을 반환
result = safe_division(1.0, 10**500, True, False)
print(result)
# 무한대를 반환
result = safe_division(1.0, 0, False, True)
print(result)
>>
0
inf
어떤 예외를 무시할지 두 변수의 위치를 혼동할 가능성 높음
→ 코드의 가독성을 높이기 위해 키워드 인자
사용 필요
# 이 함수는 모든 예외를 무시함
def safe_division_b(number, divisor,
ignore_overflow=False, # Changed
ignore_zero_division=False): # Changed
키워드 인자를 사용할 때 *
를 사용해 위치 인자의 시작을 구분함
def safe_division_c(number, divisor, *, # Changed
ignore_overflow=False,
ignore_zero_division=False):
...
# 위치 인자 X
safe_division_c(1.0, 10**500, True, False) # 에러남
# 키워드 인자 O
result = safe_division_c(1.0, 0, ignore_zero_division=True)
safe_division_c()
에서 number, divisor 인자는 위치인자와 키워드 인자를 헷갈릴 수 있음
assert safe_division_c(number=2, divisor=5) == 0.4
assert safe_division_c(divisor=5, number=2) == 0.4
assert safe_division_c(2, divisor=5) == 0.4
이 때 인자명이 바뀔 시 기존 코드가 깨짐
⇒ 위치로만 지정하는 인자를 쓰면 ㅇㅋ
def safe_division_d(numerator, denominator, /, *, # Changed
ignore_overflow=False,
ignore_zero_division=False):
인자 목록의 /
기호는 위치로만 지정하는 인자의 끝을 표시
assert safe_division_d(2, 5) == 0.4 # 위치인자시 OK
safe_division_d(numerator=2, denominator=5) # 키워드인자시 에러