None의 의미
유틸리티 함수를 작성할 때 반환 값을 None으로 하면 특별한 의미를 부여하는 경향을 보인다.
그로 인해서 아래와 같이 반환 오류가 생긴다.
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('잘못된 입력')
#실행은 되지만 실행이 되면 안됨
#원래의 답은 0이 나와야한다
x,y = 0,5
result = careful_divide(x,y)
if not result:
print('잘못된 입력') # 잘못된 입력
반환값을 2-튜플로 분리
첫 번째 부분은 연산의 성공/실패 여부
두 번째 부분은 성공한 경우의 실제 결과값을 저장
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('잘못된 입력')
_, result = careful_divide(x,y)
if not success:
print('잘못된 입력')
None을 반환하는 경우처럼 실수를 할 수 있는 코드
두번째 방법:Nonne을 반환하지 않기
Exception을 호출시켜서 None을 반환하지 않기
ZeroDivisionError이 발생한 경우 ValueError을 활용하여 입력값이 잘못되었음을 알린다.
def careful_divide(a,b):
try:
return a/b
except ZeroDivisionError as e:
raise ValueError('잘못된 입력')