def careful_divide(a, b):
try:
return a / b
except ZeroDivisionError:
return None
x, y = 1, 0
result = careful_divide(x, y)
if result is None:
print('error')
error
if not result:
print('error')
error
False와 동등한 반환 값을 잘못 해석하는 경우는 None이 특별한 의미를 가지는 파이썬 코드에서 흔히 저지르는 실수이다.
실수 가능성을 줄이는 방법 두가지
첫 번째 부분은 연산이 성공인지 실패인지 표시, 두번째 부분은 성공시 결과 값
def careful_divide(a, b):
try:
return True, a / b
except ZeroDivisionError:
return False, None
success, result = careful_divide(x, y)
if not success:
print('error')
error
문제점은 첫번째를 무시할수 있다는 점
_, result = careful_divide(x, y)
if not success:
print('error')
error
이런 실수를 줄일 수 있는 더 나은 두번째 방법
2. None을 반환하지 않는 것
def careful_divide(a, b):
try:
return a / b
except ZeroDivisionError as e:
raise ValueError('error')
x, y = 5, 2
try:
result = careful_divide(x, y)
except ValueError as e:
print(e)
else:
print('결과는 %.1f 입니다' % result)
결과는 2.5 입니다
x, y = 5, 0
try:
result = careful_divide(x, y)
except ValueError as e:
print(e)
else:
print('결과는 %.1f 입니다' % result)
error
이 방법을 확장해서 타입 애너테이션을 사용하는 코드에도 적용이 가능하다.
독스트링과 타입 애너테이션까지 포함시키면 다음과 같다
def careful_divide(a: float, b: float) -> float:
"""a를 b로 나눈다.
Raises:
ValueError: b가 0이어서 나눗셈을 할 수 없을 때
"""
try:
return a / b
except ZeroDivisionError as e:
raise ValueError('error')