1 minute read

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

[서적] 파이썬 코딩의 기술

Categories:

Updated: