파이썬 None 반환 지양하기
None 으로 반환하는 상황
대부분의 파이썬 개발자들은 반환값 None 으로 하여금 예외처리를 하곤 합니다.
다음은 예시입니다.
def divide(a,b):
try:
return a/b
except ZeroDivisionError:
return None
이 함수를 사용하는 다음 코드는 반환값을 다음 예시와 같이 활용합니다.
result = divide(x,y)
if result is None:
print("Invalid input")
언뜻보면 정상적인 코드처럼 보이지만 만약 분자가 0이 되어버린다면 반환값도 0이 되어버립니다.
만약 이 코드를 작성한사람이 아닌 다른 누군가가 이 코드를 사용하고자할때,
실수로 is None 대신 is False 를 사용한다면 결과는 좋지않을것입니다.
이런 None 관련 오류를 줄이기 위한 2 가지 방법
첫번째는 반환값을 두개로 나눠서 튜플로 담는것입니다.
def divide(a,b):
try:
return True, a/b
except ZeroDivisionError:
return False, None
하지만 이렇게 한다면 이 함수를 호출하는 쪽에서는 튜플로 풀어야하기 때문에,
사용자의 실수를 유발하기 쉽습니다.
이런 오류를 줄이기에 더 좋은 방법은 절대로 None 을 반환하지 않는것 입니다.
None을 반환하는 대신에 호출하는 쪽에 예외를 일으켜서 호출하는 쪽에서 예외를 처리하게 하는것입니다.
다음 코드는 기존의 ZeroDivisionError 대신에 호출하는쪽에 책임을 전가하는 방식입니다.
def divide(a,b):
try:
return a/b
except ZeroDivisionError as e:
raise ValueError('Invalid inputs') from e
이제 호출하는 쪽에서 예외를 처리하게됩니다.
더이상 호출하는 쪽에서 None 과같은 반환값을 통해 조건식으로 검사할 필요가 없어집니다.
x,y = 5,2
try:
result = divide(x,y)
except ValueError:
print("Invalid inputs")
else:
print('Result is %.1f' % result)
#Reference
[서적] 파이썬 코딩의 기술