* None을 반환하지 않기

None을 반환할 경우

나누기 함수를 작성해보자.

def divide(a, b):
    try:
        return a / b
    except ZeroDivisionError: # --> 0으로 나누려고 할 때(부모가 0), 에러가 발생한다.
        return None

result = divide(x, y)
if not result: # --> None은 파이썬에서 false로 간주되기 때문.
    print('잘못된 입력')

상기 코드는 치명적인 오류가 있다. 만약 분자가 0일 경우(예시: 0 / 7 = 0 ), 해당 divide함수는 0을 리턴할 것이며, 정확한 계산이지만 파이썬에서는 {},'', 0, Nonefalse로 간주하기 때문에 저 if문을 타버릴 것이다.

물론 상기 코드를 다음과 같이 개선하면 문제는 없다.

if result is None:
    print('잘못된 입력')

하지만, 잘못된 입력을 알리기 위해 None을 반환하는 경우! 즉, 특별한 의미를 나타내려고 'None'을 반환하는 경우는 맨 위 코드와 같이 조건식에서 False로 평가되기 때문에, 오류를 일으키기 쉽다.

return None 보다는 raise error

예외를 발생시켜, 호출하는 코드에서 예외를 적절히 컨트롤 할 수 있게끔 한다.

def divide(a, b):
    try:
        return a / b
    except ZeroDivisionError as e:
        raise ValueError('잘못된 입력') from e

x, y = 10, 9
try:
    result = divide(x, y)
except ValueError:
    print('잘못된 입력')
else:
    print('정상!')

>>>
정상!