예시) 나눗셈 함수에서 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) # 키워드인자시 에러