- 나누기 예제
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("int")
else:
raise
result = save_division(1, 10**500, True, False)
print(result) # 오버플로우를 무시하교 0을 반환
result = safe_divisoion(1, 0, False, True)
print(result) # 0으로 나누면서 일어나는 오류를 무시하고 무한대를 반환
>>>
0.0
inf
- 위 예제의 단점은 두 불 인수의 위치를 혼동하기 쉽다는 점
- 코드 가독성을 높이는 방법: 키워드 인수 활용
# 기본 동작을 덮어쓰고 무시할 플래그 지정
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("int")
else:
raise
result = save_division(1, 10**500, ignore_overflow=True)
print(result) # 오버플로우를 무시하교 0을 반환
result = safe_divisoion(1, 0, ignore_zero_division=True)
print(result) # 0으로 나누면서 일어나는 오류를 무시하고 무한대를 반환
>>>
0.0
inf
- 이런 키워드 인수가 선택적인 동작:
- 호출하는 쪽에 키워드 인수로 의도를 명확하게 드러내라고 강요할 방법이 없음
- 즉, 아래처럼 사용이 가능
save_difision(1, 10***500, True, False)
파이썬3의 키워드 전용 인수
- 호출하는 쪽에서 의도를 명확히 드러내도록 강제하는 방법:
- 파이썬3에서의 키워드 전용 인수(
keyord-only argument
)로 정의할 수 있음
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("int")
else:
raise
safe_division(1, 10**500, True, False) # 위치 인수를 사용하는 함수 호출은 동작하지 않음
>>>
TypeError: save_division() takes 2 positional arguments but 4 were given
safe_division(1, 0, ignore_zero_division=True) # 키워드 인수와 그 기본값은 잘 동작
try:
safe_division_c(1, 0)
except ZeroDivisionError:
pass
파이썬2의 키워드 전용 인수
- 키워드 전용 인수를 지정하는 명시적인 문법은 없음
**
연산자를 사용하여 올바르지 않은 함수 호출을 할 때TypeError
를 일으키는 방법을 사용할 수 있음
# 파이썬2
def print_args(*args, **kwargs): # *args: 가변 개수의 위치 인수
print "Positional:", args # **kwargs: 가변 개수의 키워드 인수
print "Keyword:", kwargs
print_args(1, 2, foo="bar", stuff="meep")
>>>
Positional: (1, 2)
Keyword: {"foo": "bar", "stuff:" "meep"}
- 파이썬2에서 키워드 인수를 처리하는 방법
**kwargs
를 받게 만들어서 키워드 전용 인수를 받게 함- 그 다음
pop
메서드로kwargs
딕셔너리에서 원하는 키워드 인수를 꺼냄 - 마지막으로
kwargs
에 더는 남아있는 키워드가 없음을 확인
# 파이썬2
def safe_division(number, divisor, **kwargs):
ignore_overflow = kwargs.pop("ignore_overflow", False)
ignore_zero_div = kwargs.pop("ignore_zero_division", False)
if kwargs:
raise TypeError("Unexpected **kwargs: %r" % kwargs)
# ...
- 이제 키워드 인수를 넘기든 안 넘기든 함수 호출 가능
safe_division(1, 10)
safe_division(1, 0, ignore_zero_division=True)
safe_division(1, 10**500, ignore_overflow=True)
safe_division(1, 0, False, True) # 키워드 전용 인수를 위치로 넘기면 에러
>>>
TypeError: safe_division() takes 2 positional arguments but 4 were given
safe_division(0, 0, unexpected=True) # 원치 않는 키워드 인수를 넘겨도 에러
>>>
TypeError: Unexpected **kwargs: {"unexpected": True}