[BW 5] 복잡한 식을 쓰는 대신 도우미 함수를 작성하라

파이썬은 문법이 간결하므로 상당한 로직이 들어가는 식도 한 줄로 작성할 수 있다.

 

다음과 같은 질의 문자열이 있다고 가정해보자.

from urllib.parse import parse_qs

var = parse_qs('빨강=5&파랑=0&초록=', keep_blank_values=True)
print(repr(var))

>>>
{'빨강': ['5'], '파랑': ['0'], '초록': ['']}

파라미터가 없거나 비어 있을 경우 0이 디폴트 값으로 대입되게 하려면 어떻게 해야할까?

 

다음과 같이 if 문이 아닌, if 식을 사용할 수 있다.

red = var.get('빨강', [''])[0] or 0
green = var.get('초록', [''])[0] or 0
outer = var.get('수달', [''])[0] or 0

print(f'빨강: {red!r}')
print(f'초록: {green!r}')
print(f'수달: {outer!r}')

>>>
빨강: '5'
초록: 0
수달: 0

하지만 이런 코드는 다른 사람이 이해하기 위해 많은 시간을 투자해야 한다.

 

이번에는 if/else 조건식을 사용해 코드를 조금 더 읽기 쉽게 만들어보자.

red_str = var.get('빨강', [''])
red = int(red_str[0]) if red_str[0] else 0
print(red)

>>>
5

 

다음은 if/else 문을 사용해보자.

green_str = var.get('초록', [''])

if green_str[0]:
    green = int(green_str[0])
else:
    green = 0
    
print(green)

>>>
0

모든 로직을 분리한 다음 코드를 살펴보면, 이전 버전이 더 복잡해 보인다.

따라서 우리는 같은 로직을 단지 두세 번을 사용할지라도 꼭 도우미 함수를 작성해야 한다.

# 도우미 함수
def get_first_int(value, key, default=0):
    found = value.get(key, [''])
    if found[0]:
        return int(found[0])
    else:
        return default
        
outer = get_first_int(var, '수달')
print(outer)

>>>
0

식이 복잡해지기 시작하면 바로 식을 더 작은 조각으로 나눠서 로직을 도우미 함수로 옮길지 고려해야 한다.

코드를 줄여 쓰는 것보다 가독성을 좋게 하는 것이 더 가치 있다.