한 줄에 억지로 다 넣지 말고, 함수로 빼기

Tasker_Jang·2026년 4월 19일
post-thumbnail

🤔 이게 왜 문제인가

파이썬이 표현력이 좋다는 것은 축복이자 저주입니다. 삼항 연산자, 컴프리헨션, or의 단락 평가, .get()의 기본값 등을 조합하면 한 줄에 엄청난 양의 로직을 담을 수 있습니다. 그런데 그렇게 쓴 코드는 "내가 짰지만 3일 뒤 내가 못 읽는" 코드가 됩니다.

특히 URL 쿼리 파라미터 파싱, 설정값 기본값 처리, 조건부 값 계산처럼 살짝 복잡한 로직을 한 줄로 처리하려다 보면 가독성이 훅 떨어집니다. "똑똑하게 썼다"와 "읽기 어렵다"는 거의 같은 말입니다.

💣 흔한 실수

from urllib.parse import parse_qs

my_values = parse_qs('red=5&blue=0&green=', keep_blank_values=True)

# 한 줄에 다 넣어봤다
red = int(my_values.get('red', [''])[0] or 0)
green = int(my_values.get('green', [''])[0] or 0)
opacity = int(my_values.get('opacity', [''])[0] or 0)

얼핏 보면 영리한데, .get()으로 빈 리스트 기본값을 주고, 인덱싱하고, or 0으로 falsy 처리하고, int()로 변환까지 한 줄에 다 합쳐놨습니다. 이게 같은 코드에 세 번 반복되면 버그를 수정할 때 세 군데를 똑같이 고쳐야 하고, 한 곳이라도 까먹으면 미묘한 버그가 태어납니다. 또 '''0'의 동작 차이 같은 엣지 케이스도 한눈에 들어오지 않습니다.

✅ 파이썬다운 방법

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


red = get_first_int(my_values, 'red')
green = get_first_int(my_values, 'green')
opacity = get_first_int(my_values, 'opacity')

이름만 봐도 "쿼리 스트링에서 첫 번째 값을 정수로 꺼내되, 비어 있으면 기본값을 쓴다"는 의도가 읽힙니다. 함수 하나 만든 것뿐인데 호출부 3줄이 전부 자기 설명적이 됐습니다. 버그도 한 곳에서 고치면 끝이고, 테스트도 get_first_int 하나만 탄탄히 짜면 됩니다. 성능 손해는 거의 없고 가독성·유지보수성 이득은 크다는 것이 포인트입니다.

참고로 "두 번 이상 반복되는 복잡한 식은 함수로 뺀다"를 원칙으로 삼으면 좋습니다. DRY(Don't Repeat Yourself) 원칙의 가장 실용적인 버전입니다.

📎 기억할 것

  • 파이썬 문법으로 한 줄짜리 묘기를 부릴 수 있다고 해서 그래야 하는 것은 아닙니다.
  • 같은 로직이 두 번 이상 반복되면 바로 함수로 뺍니다. 이름이 곧 문서가 됩니다.
  • or, and를 활용한 기본값 처리 트릭은 짧지만, 빈 문자열/0/False 같은 falsy 엣지 케이스에서 버그를 부르기 쉽습니다.
  • 복잡한 표현식은 "짧음"이 아니라 "한 번에 이해되는가"로 평가합니다.
  • 도우미 함수는 테스트하기도 쉽습니다. 복잡한 한 줄을 테스트하려면 전체 호출부를 모킹해야 하지만, 함수로 빼면 순수 함수 단위로 검증할 수 있습니다.

🛠 실무에서 어디 쓸까

API 응답 파싱에서 특히 유용합니다. 외부 서비스에서 온 JSON을 다룰 때 data.get("user", {}).get("profile", {}).get("nickname", "익명") 같은 코드가 여기저기 흩어지면 지옥이 됩니다. get_nickname(data) 같은 작은 함수로 빼두면 필드명이 바뀌거나 스키마가 업데이트됐을 때 한 곳만 고치면 됩니다. 또 Django/SQLAlchemy 같은 ORM에서 복잡한 필터 조건(Q(...) | Q(...) & ~Q(...))을 반복해서 쓸 때도, active_users_query() 같은 함수로 빼두면 쿼리 재사용이 쉬워지고 단위 테스트도 훨씬 깔끔해집니다.

profile
ML Engineer 🧠 | AI 모델 개발과 최적화 경험을 기록하며 성장하는 개발자 🚀 The light that burns twice as bright burns half as long ✨

0개의 댓글