..

복잡한 식을 쓰는 대신에 도우미 함수를 작성하라

예를 들어 URL 의 Query String 을 구문 분하고 싶다고 하자. 여기서 각 Qurey String 은 정수 값을 포현한다.

from urllib.parse import parse_qs

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

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

이를 get 함수로 받게된다면 값이 없는 경우 는 none 으로 반환 되어 나타나게 되고 만약 값은 있지만 값의 상태가 null 이라면 [’ ‘] 으로 나타나게 된다.

파라미터 가 없거나 비어있을경우 0이 디폴트 값으로 대입되면 좋을것 같서 이 로직을 처리하기 위해 완전한 if 문 을 쓰는것 보다 if 식을 사용 하는것이 좋을것이다.

red = my_values.get('RED',[''])[0] or 0
green = my_values.get('GREEN',[''])[0] or 0
opacity = my_values.get('투명도',[''])[0] or 0

print(f'{red!r}')
print(f'{green!r}')
print(f'{opacity!r}')

>>>
빨강 : 5
초록 : 0
투명도 : 0 

if 식을 사용했을때 get 함수가 작동하게 된다. get 함수가 키의 해당하는 값이 list 에 유일한 값으로 존재하게 된다면 true 로 반환 되고 list 의 있는 값을 변수에 받게 된다.

여기서 만약 list 에 빈문자열이 유일한 원소로 들어있게 된다면 이는 암묵적으로 False 로 평가되고 0이 반환되게 된다.

또한 딕셔너리 키에 해당하는 값이 없다면 , get 메서드는 딕혀너리 안에 키가 없을때 두번째 인자를 반환한다. 딕셔너리에서 해당하는 키르 찾지 못하면 이코드는 빈 문자열 이 유일한 원소로 있는 경우와 같은 동작을 하게 된다.

red = int(my_values.get('hello',[''])[0] or 0)

현재 이코드는 익기 너무 어렵고 시각적 잡음 이 너무 많다. 즉 코드를 이해하기 쉽지 않으므로 코드를 새로 읽는 사람이 이 시이 실제로 어떤 일을 하는지 이해하기 위해 너무 많은 시간을 투자하게 된다.

파이썬 에서 코드를 간결하게 유지 하면서 이를 명확하게 표현할수 있는 if/else 식이 잇다.

hello_str = my_values.get('hello',[''])
red = int(red_str[0]) if red_str[0] else 0

이코드 가 훨 보기 편하나 , if/else 문을 여러줄ㅇ 쓰는 경우보다는 덜 명확하다.

hello_ster = my_values.get('hello',[''])
if hello_str[0]:
    hello = int(hello_str[0])
else:
    hello = 0

하지만 이 로직을 반복 적용 하게 된다면 꼭 Helper Function 을 이용해야한다.(2~3 회 반복 할지라도.)

def = get_first_int(values,key,default=0):
    found = values.get(key,[''])
    if found[0]:
        return int(found[0])
    return default

아무리 코드를 짧게 쓰는것을 좋아 할지라도 가독성을 해칠만큼 코드를 짧게 줄여쓰는것은 좋지 않다 오히려 조금 길이가 늘어난다해도 코드의 가독성을 좋게 하는것이 더 가치있다.